[SERVICE DESK] Errore nell'ottenere il tempo del TF senior nel timer! - pagina 6
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Sembra che la soluzione più affidabile sia proprio quella di aspettare la chiamata di OnCalculate() con controllo obbligatorio della connessione al server commerciale. Se non controlliamo la connessione (IsConnected()), allora anche in OnCalculate() la otterremo al caricamento del terminale:
Tuttavia, non elimina tutte le domande:
1. Perché non c'è scritto nella documentazione di IsConnected() che deve essere necessariamente chiamato prima di ricevere i dati (almeno) dal TF senior in OnCalculate()?
2. Perché IsConnected() in OnTimer() non funziona? Il fatto di stabilire una connessione con un server commerciale non dovrebbe dirci che i dati possono essere ottenuti?
3. Una volta che abbiamo stabilito una connessione con il server commerciale e stiamo cercando di ricevere dati in OnTimer(), le funzioni iTime(), iBarShift(), SeriesInfoInteger() e funzioni simili a loro non dovrebbero restituire errori se i dati di questo particolare server commerciale, da cui prendono informazioni, non sono ancora sincronizzati? Altrimenti viene fuori qualche sciocchezza, come se vi restituiamo l'errore 4066 una volta e poi potete usare i dati che avete.
Ho parlato con gli sviluppatori e con uno dei miei amici lì e ho detto loro quanto segue: 1 Cosa devo fare?
1 Sciocchezze, si può chiamare in qualsiasi momento e da qualsiasi luogo.
2 IsConnected può essere chiamato da qualsiasi punto del codice e funziona, ma è una funzione che non scrive nulla sullo stack degli errori, restituisce vero/falso e basta. Considerando che la procedura di connessione è abbastanza lunga (minimo 1 sec.) e che IsConnected viene attivata al momento del login, è necessario controllare lo stato di connessione e aspettare l'inizio del flusso di citazioni all'avvio del terminale.
3 Queste funzioni non scrivono nulla nello stack degli errori, restituiscono il risultato da sole.
Perché abbiamo ottenuto 4066? Quell'errore è stato causato dalla funzione TimeCurrent. Terminale loggato e tempo richiesto dal server a seconda della qualità della connessione ci vuole anche un po' di tempo, quindi abbiamo un timer veloce. E poi abbiamo ottenuto 4066 sulla nostra richiesta da TimeCurrent. E poi abbiamo ottenuto il tempo e le nostre funzioni hanno iniziato a lavorare normalmente e loro stesse restituiscono un errore come risultato del loro lavoro bypassando lo stack degli errori.
Come raccomandazione in tale situazione, timer veloce e avvio del terminale, assicuratevi di controllare che abbiamo iniziato a ricevere dati dal server. La mia versione è un po' arzigogolata, sarebbe corretto ottenere un segnale da OnCalculate per iniziare a ricevere dati.
Cosa suggerisci per risolvere il problema (c'è, secondo te)? Aspettare che OnCalculate() sia chiamato 1-2 volte?
Sì, esattamente. In OnInit() chiamate semplicemente i TF richiesti senza controllare il risultato (non potete farci affidamento), e in OnCalculate chiamate la funzione IsTFDataReady(). Non appena viene restituito true per tutti i TF richiesti, è possibile iniziare ad eseguire l'algoritmo dell'indicatore.
1. Perché la documentazione di IsConnected() non dice che deve sempre essere chiamata prima di ricevere dati (almeno) dal TF senior in OnCalculate()?
IsConnected() è una funzione abbastanza complicata. Restituisce lo stato di una sola connessione al server. Ma il terminale usa più di una connessione. Ci sono 8 fili commerciali da soli. Quindi, anche se IsConnected() restituisce true, non è del tutto chiaro cosa significhi. Almeno, non possiamo aspettarci che le serie temporali vengano richieste e costruite. Ma se IsConnected() restituisce false, allora possiamo essere sicuri che il terminale è ancora offline.
Qual è il compito per il quale la presenza della connessione terminale è così cruciale? Per quanto ho capito, l'indicatore è uno strumento di visualizzazione dei dati. I dati che sono disponibili. Quando arrivano nuovi dati, aggiorna la visualizzazione. Non dovrebbe essere richiesto di controllare se i dati sono aggiornati. Questo è il compito del terminale.
Immagino che stiamo parlando di MQL5, la preparazione OHLC non è la stessa di MT4
Sto parlando di MT4. Circa 2-3 anni fa stavo prendendo un bug con Time[0]. Gli sviluppatori sembrano averlo risolto, ma poi, col tempo, si è ripresentato. Il problema è che è impossibile riprodurre in modo univoco questo bug.
IsConnected() è una funzione piuttosto complicata. Restituisce solo lo stato di una delle connessioni al server. Ma il terminale usa più di una connessione. Ci sono 8 fili commerciali da soli. Quindi, anche se IsConnected() restituisce true, non è del tutto chiaro cosa significhi. Almeno, non possiamo aspettarci che le serie temporali vengano richieste e costruite. Ma se IsConnected() restituisce false, allora possiamo essere sicuri che il terminale è ancora offline.
Qual è il compito per il quale la presenza della connessione terminale è così cruciale? Per quanto ho capito, l'indicatore è uno strumento di visualizzazione dei dati. I dati che sono disponibili. Quando arrivano nuovi dati, aggiorna la visualizzazione. Non dovrebbe essere richiesto di controllare la pertinenza dei dati. Questo è il compito del terminale.
Per gli indicatori non ricordo la necessità di controllare la connessione con il server, quello che abbiamo nella storia è disegnato, quando la storia viene caricata significa che tutti i buffer degli indicatori vengono ricalcolati
Ho sviluppato e uso la seguente funzione nel mio EA. È generalmente soddisfacente e controlla correttamente la connessione con il server:
In particolare uso Sleep() per trasmettere il controllo al terminale e poi controllare la connessione al server e la possibilità di fare trading
Sto parlando di MT4. Circa 2-3 anni fa stavo prendendo un bug con Time[0]. Gli sviluppatori sembravano averlo risolto, ma poi, col tempo, si è ripresentato. Il problema è che è impossibile riprodurre in modo univoco questo bug.
Se non è troppo disturbo, ecco l'argomento del topic - scaricamento corretto della storia dal TF maggiore, ecco l'indicatore: "Ho bisogno di disegnare la MA" dal TF maggiore sulle barre del TF minore, l'ho fatto in 5 minuti, funzionerà per il 98% correttamente, dove in questo codice il 2% "insidie" che causerà bug?
Sono interessato al codice corretto per MT4
Ho parlato con gli sviluppatori e con un amico che conosco lì, e vi dirò una cosa alla volta.
1 Sciocchezze, si può chiamare in qualsiasi momento e da qualsiasi luogo.
2 IsConnected può essere chiamato da qualsiasi punto del codice e funziona, ma è una funzione che non mette nulla sullo stack degli errori, restituisce vero/falso e basta. Considerando che la procedura di connessione è abbastanza lunga (minimo 1 sec.) e che IsConnected si attiva al momento del login, è necessario controllare lo stato di connessione e aspettare l'inizio del flusso di citazioni all'avvio del terminale.
3 Queste funzioni non scrivono nulla nello stack degli errori, restituiscono il risultato da sole.
Perché abbiamo ottenuto 4066? Quell'errore è stato causato dalla funzione TimeCurrent. Terminale loggato e tempo richiesto dal server a seconda della qualità della connessione ci vuole anche un po' di tempo, quindi abbiamo un timer veloce. E poi abbiamo ottenuto 4066 sulla nostra richiesta da TimeCurrent. E poi abbiamo ottenuto il tempo e le nostre funzioni hanno iniziato a lavorare normalmente e loro stesse restituiscono un errore come risultato del loro lavoro bypassando lo stack degli errori.
Come raccomandazione in tale situazione, timer veloce e avvio del terminale, assicuratevi di controllare che abbiamo iniziato a ricevere dati dal server. La mia variante è un po' arzigogolata, sarebbe corretto ottenere un segnale da OnCalculate per iniziare a ricevere dati.
1. Leggete attentamente ciò che scrivo. Non è la prima volta che te lo dico! Non ho detto nulla sul fatto di non chiamare da qualche parte!
Sta dicendo che tutte le funzioni iBarShift(), iTime(), SeriesInfo...() richiedono TimeCurrent()?