Announcement

Collapse
No announcement yet.

Aiuto per calcolo dataa

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Aiuto per calcolo dataa

    Buongiorno, probabilmente la mia è una domanda banale: per il mio ea di breakout ho necessità che il sistema ricalcoli giornalmente la nuova data e ora per l'inserimento dei pendenti, in pratica ora italiana all'una di notte.

    ora setto giornalmente la data al giorno successivo con
    Code:
    extern datetime TradingTime = D'2019.09.13 01:00:00';
    e nel timer:
    Code:
    void OnTimer()
      {
      datetime st=TimeLocal();
      datetime rt=TradingTime-st;
      string rt2=TimeToStr(rt,TIME_MINUTES|TIME_SECONDS);
      string TimeToDisplay=TimeToStr(rt,TIME_MINUTES|TIME_SECONDS);
      if (rt2=="00:00:00"){
          TradeOk=true;
      }
    Funziona tutto perfettamente ma non riesco ad automatizzare il calcolo della nuova data.

    #2
    consiglio di usare una funzione che verifica se è scattato un nuovo giorno

    se è un new day, allora setti la variabile TradingTime al nuovo valore


    dichiari la variabile
    Code:
    bool  New_Day        = false;    // 'true' soltanto al primo tick di un nuovo giorno

    qui la funzione New_Day()
    Code:
    //+------------------------------------------------------------------+
    // l'attributo TIME_DATE restituisce il giorno nel formato "yyyy.mm.dd"
    bool New_Day() // funzione che identifica l'avvio di un nuovo giorno
      {
       static datetime New_Time=0;   // memorizza la data di avvio dell'ultimo giorno memorizzato come "yyyy.mm.dd"; viene inizializzato a 0, corrispondente a 1970.01.01 00:00
       if(New_Time!=StringToTime(TimeToStr(Time[0],TIME_DATE))) // Se il tick corrente è di un giorno diverso da quello memorizzato da New_Time, è stato individuato un nuovo giorno
         {
          New_Time=StringToTime(TimeToStr(Time[0],TIME_DATE));     // Viene memorizzata la data di avvio del nuovo giorno
                                                                   //Print(__FUNCTION__," (",__LINE__,"):   New_Time = "+TimeToStr(New_Time,TIME_DATE));
          return(true);              // C'è un nuovo giorno
         }
       else return(false);           // Il tick corrente è dello stesso giorno di quello memorizzato da New_Time
      }
    //+------------------------------------------------------------------+
    nel codice della OnTick inserisci
    Code:
    New_Day  = New_Day();   // Verifica se è il tick di un nuovo giorno
    
    if (New_Day) { 
     setta TradingTime al nuovo valore
    ....
    ....
     }
    La vita non è un giro di prova, cogli l’attimo..
    Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

    Comment


      #3
      Grazie Umberto, se poi volessi nell'ambito del nuovo giorno anche un orario specifico? La questione si pone ad esempio se volessi usare il codice per un sistema di breakout sull'apertura di Londra oppure sulla sessione asiatica.
      Last edited by andy60rm; 25-11-2019, 06:10.

      Comment


        #4
        Code:
        string orario = " 12:00";
        string str_TradingTime = TimeToStr(Time[0],TIME_DATE)+orario;
        datetime TradingTime = StringToTime(str_TradingTime);
        Print(__FUNCTION__," (",__LINE__,"):   str_TradingTime = "+str_TradingTime+"   TradingTime="+TimeToStr(TradingTime,TIME_DATE|TIME_MINUTES));
        La vita non è un giro di prova, cogli l’attimo..
        Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

        Comment


          #5
          Ciao Umberto due domande sempre sul codice che te cortesemente mi hai suggerito:
          Code:
          string orario = " 12:00";
          Se inserisco
          Code:
          extern string orario=" 12:00";
          esiste sempre la possibilità di dimenticare lo spazio prima dell'orario. Possibile ovviare a questo con un comando di spazio vuoto tipo space ?

          Il codice è questo attualmente in OnTick():
          Code:
          New_Day  = New_Day();   // Verifica se è il tick di un nuovo giorno
          
             //è un nuovo giorno
             if (New_Day) { 
                //setto trading time per il nuovo giorno
                str_TradingTime = TimeToStr(Time[0],TIME_DATE)+orario;
                TradingTime = StringToTime(str_TradingTime);
                //se l'orario attuale è uguale al trading time procedo con la routine
                if (TradingTime==TimeLocal()){
                   if (iAutomation==1) {
                      //chiudi tutti i pendenti
                      CloseAllBUYSTOP();
                      CloseAllSELLSTOP();
                      CloseAllObjects();
                      //Ricalcola range
                      RangeLast(NumBars); 
                      GetLinesValue();
                      //nuovi pendenti
                      InsertBSSS(); 
                   }
               }      
             }
          Last edited by andy60rm; 27-11-2019, 06:33.

          Comment


            #6
            Nel caso la stringa dell'orario abbia spazi aggiuntivi, a destra o a sinistra:

            Code:
            string orario = " 12:00 ";
            string orario_normalized=StringConcatenate(" ",StringTrimLeft(StringTrimRight(orario)));
            string str_TradingTime = TimeToStr(Time[0],TIME_DATE)+orario_normalized;

            Comment


              #7
              Originally posted by andy60rm View Post
              Nel caso la stringa dell'orario abbia spazi aggiuntivi, a destra o a sinistra:

              Code:
              string orario = " 12:00 ";
              string orario_normalized=StringConcatenate(" ",StringTrimLeft(StringTrimRight(orario)));
              string str_TradingTime = TimeToStr(Time[0],TIME_DATE)+orario_normalized;
              perfetto! :51.yes_80_anim_gif:
              La vita non è un giro di prova, cogli l’attimo..
              Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

              Comment


                #8
                umbertosm

                Se attacco l'expert ad esempio alle 19 di oggi 27 nov, la funzione NewDay dovrebbe ritornare false, il nuovo giorno è il 28, invece esegue la routine ora come se fosse new day.

                Comment


                  #9
                  me ne sono accorto in quanto vado ad aggiornare un campo stringa che mi segnala la nuova data per l'esecuzione dei pendenti (mt4gui)
                  il campo viene gettato alla data di oggi.

                  Code:
                  New_Day  = New_Day();   // Verifica se è il tick di un nuovo giorno
                  
                     //è un nuovo giorno
                     if (New_Day) { 
                        //setto trading time per il nuovo giorno
                        str_TradingTime = StringConcatenate(TimeToStr(Time[0],TIME_DATE),orario_normalized);
                        guiSetText(hwnd,l1,str_TradingTime,iFontSize,sFontName);  
                        TradingTime = StringToTime(str_TradingTime);
                        TradingTime = StringToTime(str_TradingTime);
                        //se l'orario attuale è uguale al trading time procedo con la routine
                        if (TradingTime==TimeLocal()){
                           if (iAutomation==1) {
                              //chiudi tutti i pendenti
                              CloseAllBUYSTOP();
                              CloseAllSELLSTOP();
                              CloseAllObjects();
                              //Ricalcola range
                              RangeLast(NumBars); 
                              GetLinesValue();
                              //nuovi pendenti
                              InsertBSSS(); 
                           }
                       }        
                     }

                  Comment


                    #10
                    umbertosm

                    domanda: non si puo aggiungere un giorno alla data odierna per trovare, al giorno attuale, la nuova data?

                    Comment


                      #11
                      Nuova routine, sembra che vada, stasera testo:

                      Code:
                      str_TradingTime = StringConcatenate("Time: ",TimeToStr(Time[0]+HR2400,TIME_DATE),orario_normalized);
                            guiSetText(hwnd,l1,str_TradingTime,iFontSize,sFontName);  
                            TradingTime = StringToTime(str_TradingTime);
                            TradingTime = StringToTime(str_TradingTime);
                            //se l'orario attuale è uguale al trading time procedo con la routine
                            if (TradingTime==TimeLocal()){
                               if (iAutomation==1) {
                                  //chiudi tutti i pendenti
                                  CloseAllBUYSTOP();
                                  CloseAllSELLSTOP();
                                  CloseAllObjects();
                                  //Ricalcola range
                                  RangeLast(NumBars);
                                  GetLinesValue();
                                  //nuovi pendenti
                                  InsertBSSS();
                               }
                           }
                      Attached Files
                      Last edited by andy60rm; 27-11-2019, 19:36. Reason: Aggiungere schermate del lavoro

                      Comment


                        #12
                        Originally posted by andy60rm View Post
                        umbertosm

                        Se attacco l'expert ad esempio alle 19 di oggi 27 nov, la funzione NewDay dovrebbe ritornare false, il nuovo giorno è il 28, invece esegue la routine ora come se fosse new day.
                        Appena attacchi l'EA il nuovo giorno è il giorno stesso del primo tick, perché nella funzione bool New_Day()
                        la variabile New_Time è inizializzata a 0 , e nei commenti della funzione leggi a che data corrisponde....

                        Code:
                        static datetime New_Time=0;   // memorizza la data di avvio dell'ultimo giorno memorizzato come "yyyy.mm.dd"; viene inizializzato a 0, corrispondente a 1970.01.01 00:00
                        Se vuoi che New_Day() sia false al primo avvio della OnTick, devi richiamare la funzione anche dentro la OnInit(), così nella funzione New_Day() , New_Time = la data del giorno in cui metti l'EA su Mt4
                        e la funzione New_Day() richiamata dentro la OnTick() restituisce false fino al giorno dopo
                        La vita non è un giro di prova, cogli l’attimo..
                        Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                        Comment


                          #13
                          Originally posted by andy60rm View Post
                          umbertosm

                          domanda: non si puo aggiungere un giorno alla data odierna per trovare, al giorno attuale, la nuova data?
                          certamente, ma è l'ABC dei calcoli con le date....
                          https://docs.mql4.com/basis/types/integer/datetime

                          il tempo è espresso in secondi, quindi per incrementare una data di 1 giorno basta aggiungere 24 ore x 60 minuti x 60 secondi...
                          fai delle prove con gli script e verifica da te come si somma o sottraggono ore e giorni e come si stampano le date
                          La vita non è un giro di prova, cogli l’attimo..
                          Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

                          Comment


                            #14
                            Perfetto, grazie, aggiungendo la tua funzione in OnInit. Ho anche aggiunto una funzione di autoclose al raggiungimento di un certo gain, come extern.

                            Comment


                              #15
                              Originally posted by umbertosm View Post

                              certamente, ma è l'ABC dei calcoli con le date....
                              https://docs.mql4.com/basis/types/integer/datetime

                              il tempo è espresso in secondi, quindi per incrementare una data di 1 giorno basta aggiungere 24 ore x 60 minuti x 60 secondi...
                              fai delle prove con gli script e verifica da te come si somma o sottraggono ore e giorni e come si stampano le date
                              la tua soluzione mi piace molto, comunque altra soluzione:

                              Code:
                              #define HR2400 86400 // PERIOD_D1*60=24*60*60
                              e

                              Code:
                              str_TradingTime = StringConcatenate("Time: ",TimeToStr(Time[0]+HR2400,TIME_DATE),TradeStart_normalized);

                              Comment

                              Working...
                              X