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.
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
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.
Potete spiegarmi di cosa si tratta e perché viene inserito questo controllo?
Non lo capisco. Quando questa condizione è vera e quando è falsa? Grazie.
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.
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.
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. } }
- www.mql5.com
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
IsNewBar:
classe CIsNewBar per determinare quando si verifica un cambio di barra.
Author: Nikolay Kositsin