Ciao ragazzi,
Mi sono appena imbattuto in un interessante problema/bug e non sono sicuro che sia stato identificato prima o anche se è specifico del broker.
Provate ad usare il seguente codice in qualche indicatore, fate girare l'indicatore all'avvio e notate i valori quando lanciate MT4 per la prima volta (assicuratevi che MT4 non sia in esecuzione da almeno 10 minuti prima del riavvio).
Noterete che i tempi restituiti sono in realtà il tempo in cui MT4 era in esecuzione l'ultima volta.
Per aggirare questo problema ho dovuto introdurre un ritardo nel mio codice, che non è l'ideale per un indicatore.
Mi chiedevo se qualcuno ha qualche soluzione più eloquente. Idealmente vorrei che il tempo corretto del server MT4 venisse restituito all'avvio ogni volta.
Saluti
PaulB
Questo?
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
Ciao ragazzi,
Mi sono appena imbattuto in un interessante problema/bug e non sono sicuro che sia stato identificato prima o anche se è specifico del broker.
Provate ad usare il seguente codice in qualche indicatore, fate girare l'indicatore all'avvio e notate i valori quando lanciate MT4 per la prima volta (assicuratevi che MT4 non sia in esecuzione da almeno 10 minuti prima del riavvio).
Noterete che i tempi restituiti sono in realtà il tempo in cui MT4 era in esecuzione l'ultima volta.
Per aggirare questo problema ho dovuto introdurre un ritardo nel mio codice, che non è l'ideale per un indicatore.
Mi chiedevo se qualcuno ha qualche soluzione più eloquente. Idealmente vorrei che il tempo corretto del server MT4 venisse restituito all'avvio ogni volta.
Saluti
PaulB
La documentazione non è chiara al 100% su questo punto?
Non proprio, no, non lo è.
C'è un'importante distinzione tra EA e indicatori che non è coperta nella documentazione: Gli EA ricevono una chiamata a start() solo se c'è una connessione al broker e un nuovo tick, mentre gli indicatori ricevono sempre una chiamata iniziale a start() prima o senza che venga stabilita una connessione al broker. Pertanto, TimeCurrent() può avere significati diversi negli EA e negli indicatori.
Se vuoi un valore sicuramente aggiornato per TimeCurrent() in un indicatore, allora puoi probabilmente usare IsConnected() per controllare se TimeCurrent() può riferirsi all'ultimo tempo conosciuto in una sessione precedente.
Come punto aggiuntivo, ho anche provato
https://docs.mql4.com/windows/RefreshRates
prima di chiamare TimeCurrent() e non ha fatto alcuna differenza. È certamente qualcosa da tenere a mente.
Lo sto usando come parte di un codice per ottenere l'offset tra l'ora del server MT4 e GMT, e sta buttando fuori i calcoli successivi.
Non proprio, no, non lo è.
C'è un'importante distinzione tra EA e indicatori che non è coperta nella documentazione: Gli EA ricevono una chiamata a start() solo se c'è una connessione al broker e un nuovo tick, mentre gli indicatori ricevono sempre una chiamata iniziale a start() prima o senza che venga stabilita una connessione al broker. Pertanto, TimeCurrent() può avere significati diversi negli EA e negli indicatori.
Non mi sembra che questo sia rilevante tenendo presente ciò che dice la documentazione... se si controlla TimeCurrent() prima che arrivi un nuovo tick si ottiene il tempo dell'ultimo tick. Non è quello che dice la documentazione?
È ancora fuorviante, ma se vuoi essere pedante potresti dire che il problema non è nella definizione di TimeCurrent() ma invece nella definizione a https://docs.mql4.com/runtime/start. Che dice "All'arrivo di nuove quotazioni, verrà eseguita la funzione start() degli esperti e degli indicatori personalizzati allegati". C'è una chiara implicazione che start() viene chiamata solo in relazione ai nuovi tick, come nel caso degli EAs, e che, implicitamente, TimeCurrent() non può quindi restituire il tempo dell'ultimo tick in una precedente sessione di utilizzo del software MT4.
[Di nuovo, una risposta a tutto questo è ignorare le chiamate a start() in un indicatore se IsConnected() restituisce false].
È ancora fuorviante, ma se vuoi essere pedante [...]
Essendo ancora più pedante, se si ha una nuova installazione di MT4, e si copia un file grafico con un indicatore collegato prima di avviare MT4 per la prima volta, allora presumibilmente l'indicatore otterrebbe una chiamata a start() con TimeCurrent() riportato come 1/1/1970. Pertanto, la documentazione di TimeCurrent() dovrebbe dire "...l'ultima ora conosciuta del server, o 1/1/1970 se non c'è stata connessione al server".
Essendo ancora più pedante, se avete una nuova installazione di MT4, e copiate un file grafico con un indicatore collegato prima di avviare MT4 per la prima volta, allora presumibilmente l'indicatore riceverà una chiamata a start() con TimeCurrent() riportato come 1/1/1970. Pertanto, la documentazione di TimeCurrent() dovrebbe dire "...l'ultima ora conosciuta del server, o 1/1/1970 se non c'è stata connessione al server".
Non c'è bisogno di fare confusione. Basta aspettare il primo/successivo tick, TimeCurrent() viene aggiornato e tutto è ok. Un indicatore solo sui prezzi storici è inutile.
In questo caso ignorerei semplicemente il primo tick . . . e continuerei normalmente dal tick 2 in poi.
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- 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
Ciao ragazzi,
Mi sono appena imbattuto in un interessante problema/bug e non sono sicuro che sia stato identificato prima o anche se è specifico del broker.
Provate ad usare il seguente codice in qualche indicatore, fate girare l'indicatore all'avvio e notate i valori quando lanciate MT4 per la prima volta (assicuratevi che MT4 non sia in esecuzione da almeno 10 minuti prima del riavvio).
Noterete che i tempi restituiti sono in realtà il tempo in cui MT4 era in esecuzione l'ultima volta.
Per aggirare questo problema ho dovuto introdurre un ritardo nel mio codice, che non è l'ideale per un indicatore.
Mi chiedevo se qualcuno ha qualche soluzione più eloquente. Idealmente vorrei che il tempo corretto del server MT4 venisse restituito all'avvio ogni volta.
Saluti
PaulB