bug/problema di TimeCurrent() e iTime()

 

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).

Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Print(TimeToStr(iTime(NULL,PERIOD_M1,0),TIME_DATE|TIME_MINUTES));

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

 
Paul_B:

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 deVries,

potresti usare anche TIME_SECONDS, non ha molta importanza, basta che il codice sia in init{} o all'inizio di start{}.

Il punto è che ottieni l'ultima volta che MT4 era in esecuzione, che potrebbe essere potenzialmente ore o giorni fa.

 
Paul_B:

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? "Restituisce l'ultimo tempo noto del server (tempo di entrata dell'ultima citazione) come numero di secondi trascorsi dalle 00:00 del 1 gennaio 1970." se l'ultimo tick è stato 10 minuti fa allora TimeCurrent() restituirà un datetime basato su quel tempo . . .
 
RaptorUK:
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.

 
cyclops993:

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 conto di 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?
 
RaptorUK:
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].

 
cyclops993:

È 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".

 
cyclops993:

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.
 
angevoyageur:
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.
Penso che il problema sia che la prima volta che viene chiamata la funzione start() per un indicatore potrebbe non essere il risultato di un nuovo tick. . . in questo caso TimeCurrent() riporterà il tempo errato. Non ho verificato questo . . .

In questo caso ignorerei semplicemente il primo tick . . . e continuerei normalmente dal tick 2 in poi.