Bene, quindi l'errore 4066 è un problema tipico per gli utenti MTF, il terminale non ha pompato i dati di altri TF ha bisogno di controllare l'integrità dei dati di altri TF.
Guardate bene il codice e quello che ho scritto prima di dare consigli.
Il codice ha un controllo degli errori e un controllo dei dati vuoti. E quando una funzione restituisce dati errati senza un errore, è un errore!
Guardate bene il codice e quello che ho scritto prima di dare consigli.
Il codice ha un controllo degli errori e un controllo dei dati vuoti. E quando una funzione restituisce dati errati senza un errore, è un errore!
Forse mi sono perso qualcosa e mostratemi dove controllate l'integrità della storia, per esempio, nella proceduraCheckCurrentHourOpenTime()
Cosa intende per integrità della storia?
Sto parlando del fatto che c'è un controllo degli errori quando si recuperano i valori della storia. C'è un controllo in ogni funzione. Ecco qui:
//--- Проверяем, получено ли время открытия часового бара if(tempHourOpenTime==0 || err!=0) // Если время бара не получено return(false); // Возвращаем ложь
Cioè se viene ricevuto un valore zero o un errore - il tempo non viene scritto nella variabile globale. Pensi che non sia abbastanza?
Il punto è che la funzione SeriesInfoInteger() prima restituisce un errore ma all'esecuzione successiva restituisce NO! E non restituisce nemmeno il valore corretto!SeriesInfoInteger() restituisce solo informazioni per una certa query, in questo caso stiamo chiedendo di restituire l'ultimo tempo di apertura della barra conosciuto nella storia per simbolo e periodo. Non c'è nessun errore qui, quello che era l'ultimo al momento è quello che ha restituito. Vi mostrerò come controllare l'integrità della storia.
SeriesInfoInteger() restituisce solo informazioni per una certa query, in questo caso stiamo chiedendo di restituire l'ultimo tempo di apertura della barra conosciuto nella storia per simbolo e periodo. Non c'è nessun errore qui, quello che era l'ultimo al momento è quello che ha restituito. Arriverò al PC e vi mostrerò come controllare l'integrità della cronologia.
Cosa vuol dire che non c'è nessun errore qui? Allora perché dà dei codici di errore "falsi"? Dice che la storia è OK dove non lo è...
Cosa vuol dire che non c'è nessun errore qui? Allora perché dà dei codici di errore "falsi"? Dice che la storia è OK dove non lo è...
Ancora una volta, questa funzione non controlla l'integrità della storia! Restituisce le informazioni che ha potuto trovare in esso. In questo caso particolare, ha trovato la barra delle ore che è stata richiesta quando il terminale è stato chiuso. Il resto della storia non è stato ancora caricato.
Per controllare se la storia di un dato TF è completamente impaginata, basta usare una funzione:
bool IsTFDataReady(ENUM_TIMEFRAMES eTF) { ResetLastError(); iTime(NULL, eTF, 1); return GetLastError() == ERR_NO_ERROR; }
Se la funzione restituisce false, i dati per il TF richiesto sono incompleti. Altrimenti è completo.
Ancora una volta, questa funzione non controlla l'integrità della storia! Restituisce le informazioni che ha potuto trovare in esso. In questo caso, ha trovato la barra delle ore che è stata richiesta quando il terminale è stato chiuso. Il resto della storia non è stato ancora caricato.
Ancora una volta. Non è menzionato da nessuna parte. Questo è prima di tutto. In secondo luogo, allora perché è fuorviante mostrando prima il codice di errore 4066 e poi no?
Per controllare se la storia di un dato TF è completamente impaginata, basta usare una funzione:
Se la funzione restituisce false, i dati per il TF richiesto sono incompleti. Altrimenti è completo.
L'hai controllato nel timer? Vedete che ho commentato le righe? Ho controllato questa funzione, non ha mostrato alcun errore e ha anche mostrato dati errati. Lo controllerò di nuovo.
- 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
Obiettivo: quando si avvia l'indicatore, ottenere i dati attuali nel timer: il tempo di apertura della barra settimanale, giornaliera e oraria. Poi scriveteli in variabili globali per un uso successivo. L'orizzonte temporale attuale è М1.
Attuazione: otteniamo i tempi delle barre utilizzando la funzione SeriesInfoInteger().
Risultato: come risultato, se il terminale è rimasto in funzione per diverse ore, per esempio, era spento per la notte, otteniamo un tale risultato al suo primo avvio (un giorno):
Come puoi vedere, l'ora di recupero dei dati è 2018.09.21 11:11, e per quell'ora otteniamo l'ora di apertura del giorno = 2018.09.20 (anche se dovrebbe essere 2018.09.21) e l'ora di apertura dell'ora = 2018.09.20 16:00 (anche se dovrebbe essere 2018.09.21 11:00). E il tempo restituito dal terminale non è altro che il dato dell'ultima volta che è stato chiuso. Cioè i dati vengono memorizzati nella cache e restituiti indipendentemente dal fatto che il terminale sia stato chiuso. E capisco se l'errore #4066 sarebbe restituito ogni volta (dati storici richiesti in stato di aggiornamento) fino a quando i dati vengono aggiornati, ma no, sono i dati ERROR che vengono restituiti! Questo errore viene restituito solo una volta e poi ci si può convivere. C'è un chiaro errore di caching. Chiedo agli sviluppatori(@Slava) di prestarvi attenzione!
Ripeto. I dati errati appariranno se sono richiesti nel timer!
Versione del terminale: x64, 1090.