Librerie: IsNewBar

 

IsNewBar:

classe CIsNewBar per determinare quando si verifica un cambio di barra.

Author: Nikolay Kositsin

 
Non sono un professionista, ma credo che questo codice sia sbagliato. La variabile Recount è sempre vera. Pertanto, ogni tick sarà trattato come una nuova barra. Perché c'è questa variabile? Perché chiamare CopyClose? I codici postati sono stati controllati per verificarne il corretto funzionamento? Se mi sbaglio, vi prego di correggere e spiegare.
 
lordlev:
Non sono un professionista, ma credo che questo codice sia sbagliato. La variabile Recount è sempre vera. Pertanto, ogni tick sarà trattato come una nuova barra. Perché c'è questa variabile? Perché chiamare CopyClose? I codici postati sono stati controllati per verificarne il corretto funzionamento? Se mi sbaglio, vi prego di correggere e spiegare.
Ho ricontrollato tutto e ho trovato un errore. Nel file allegato non c'è l'assegnazione di Recount a false, ma nel codice di esempio è tutto corretto.
 
lordlev:
Ho ricontrollato tutto e ho trovato un errore. Nel file allegato non c'è l'assegnazione di Recount a false, ma nel codice di esempio è tutto corretto.
Beh, si può risolvere!
 

Forse mi sbaglio, ma credo che questo sia il modo giusto per farlo.

if(TNew>m_TOld)

Altrimenti, durante la paginazione (modifica della cronologia), il risultato sarà impreciso.

Potreste spiegare di cosa si tratta e perché viene inserito questo controllo?

if(...  && TNew)

Non riesco a capire. Quando questa condizione è vera e quando è falsa? Grazie

 
Prival:

Potete spiegare di cosa si tratta e perché viene inserito questo controllo?

Non lo capisco. Quando questa condizione è vera e quando è falsa? Grazie

Imho, controlla che TNew non sia uguale a m_TOld e che allo stesso tempo non sia uguale a zero (cioè D'1970.01.01.01 00:00:00:00')....

La seconda condizione, sempre imho, controlla che la funzione

datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));

abbia restituito qualcosa di diverso da zero...

Ora ho eseguito lo script con questa funzione - mi ha restituito esattamente 0. Forse a causa del weekend.

 
Prival:

Potete spiegarmi di cosa si tratta e perché viene inserito questo controllo?

Non lo capisco. Quando questa condizione è vera e quando è falsa? Grazie.

Il controllo dello zero è necessario per evitare di ottenere l'inizio di una nuova barra (indipendentemente dal tempo trascorso dalla sua apertura) all'inizio e al primo controllo della condizione.
 
Prival:

Forse mi sbaglio, ma credo che questo sia il modo giusto per farlo.

Altrimenti si verificherebbe un'imprecisione del lavoro durante la paginazione (modifica della cronologia).

Potreste spiegare cos'è e perché viene inserito questo controllo?

Non riesco a capire. Quando questa condizione è vera e quando è falsa? Grazie.

Penso che sarebbe più logico farlo per precauzione.

if(TNew>m_TOld && TNew)

Anche se TNew sarà ancora zero quando la cronologia viene scambiata. Uno zero può entrare nella variabile TNew in qualsiasi momento, quindi è necessario verificare che sia sempre zero.

 
Automated-Trading:

IsNewBar:

Autore: Nikolay Kositsin

C'è un piccolo bug nella vostra classe(come nella maggior parte delle funzioni di cui ho visto il codice). La prima volta che si chiama il metodo IsNewBar, questo restituisce sempre true, indipendentemente dall'esistenza di una nuova barra reale .

Ma una funzione di questo tipo contiene una variabile statica e quindi non è possibile utilizzare più chiamate di questa funzione.

Si può anche utilizzare un array bidimensionale per mantenere l'orario di apertura dell'ultima barra.

 
Ho realizzato una versione alternativa di CIsNewBar, senza alcuna variabile statica. Ho semplicemente usato il Tick.time_msc per fare una funzione idempotente :


class CIsNewBar{
private:
   long checkedMs;
   datetime lastBarOpenedAt;
   bool lastValue;
   CTickUtils tickUtils;
public:
   CIsNewBar(){}
   ~CIsNewBar(){}

   bool isNewBar(){
      MqlTick tick;
      SymbolInfoTick(_Symbol, tick);
      long tickMs = tick.time_msc;

      
      if(checkedMs >= tickMs){ //ha già elaborato questa funzione in questo tick?
         return lastValue;     //quindi, restituire il valore bufferizzato
      }

      datetime time[1];
      CopyTime(_Symbol, _Period, 0, 1, time);


      if(lastBarOpenedAt != time[0]){
         lastBarOpenedAt = time[0];
         lastValue = true;
      } else {
         lastValue = false;
      }

      checkedMs = tickMs;
      return lastValue;
   }
 

Si tratta di una classe leggera e veloce che risolve i problemi sopra menzionati.

Questa versione:

  • non darà un falso allarme alla prima chiamata della funzione.isNewBar().
  • elimina la costante re-instanziazione di nuove variabili ogni volta che la funzione viene chiamata, senza utilizzare variabili statiche, il che velocizza l'esecuzione.
  • restituisce il valore vero una sola volta per barra.
  • ha un ingombro di memoria ridotto.
class CIsNewBar{
        private:
                datetime lastBarOpenedAt;
                datetime time[1];
        public:
                CIsNewBar(){CopyTime(_Symbol, _Period, 0, 1, time);lastBarOpenedAt = time[0];}
                ~CIsNewBar(){}
                bool isNewBar(){
                        CopyTime(_Symbol, _Period, 0, 1, time);
                        if(lastBarOpenedAt < time[0]){
                                lastBarOpenedAt = time[0];
                                return(true);
                                }
                        else { return(false);}
                        }
        };

Per implementare la classe:

CIsNewBar someName;

void OnTick(){
        if(someName.isNewBar()){
                /// Chiamare il gestore dell'evento nuova barra o
                /// Eseguire il lavoro per la nuova barra. 
                }
        }
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5