bug/problema di TimeCurrent() e iTime() - pagina 2

 
RaptorUK:
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.

Sì, questo è ciò che intendo.
 
È un indicatore, perché ti interessa cosa sia TimeCurrent. Fai il tuo ciclo for indicator counted e disegna sulle barre. Non guardare TimeCurrent, non guardare Bid.
 
Sto tracciando certi tempi su un grafico che corrispondono a GMT, quindi è molto importante quando si cerca di ottenere l'offset tra l'ora del server MT4 e GMT.
 

Paul_B:
I'm plotting certain times on a chart which match to GMT, so it matters a great deal when trying to get the offset between MT4 server time and GMT.

<g> Non credo che tu sia ancora al passo con la cultura di questo forum. La sequenza di risposte dei moderatori e degli altri utenti a lungo termine del forum è sempre "Stai facendo qualcosa di sbagliato" seguita da "Perché vorresti farlo?" quando si scopre che non stai facendo qualcosa di sbagliato.

Se fossi in voi, uscirei dalle chiamate a start() se IsConnected() è falso. Oppure potresti mantenere un conteggio dei tick in una variabile statica e ignorare il tick #1, ma questo ritarderebbe inutilmente l'avvio in circostanze normali.

 
Grazie per l'input cyclops993, attualmente lo faccio funzionare ma quello che ho non sembra una soluzione ideale o particolarmente robusta. Esplorerò IsConnected() un po' di più.
 
Paul_B: Sto tracciando certi tempi su un grafico che corrispondono a GMT, quindi è molto importante quando si cerca di ottenere l'offset tra l'ora del server MT4 e GMT.
Ora abbiamo capito il perché. (Perché non ti sei spiegato nell'OP?) Esattamente come il mio codice
      nextAutoUpdate = timeSrv + HR2400;
      if(Srvr_To_UTC_Auto) if(
         IsDllsAllowed()){                            // Complained @ init
         int      srvrToUTC         = LocalTimeToUTC() - TimeCurrent();
         double   nearestHalfHour   = MathRound(srvrToUTC / 1800.);
         Srvr_To_UTC_Hours          = nearestHalfHour / 2.; // Update external
      }

Appoggio il suggerimento di RaptorUK, per un indicatore Ignora il primo tick e aggiorna tutte le barre sul secondo.

Inoltre non è completamente inaspettato. Poiché gli indicatori non possono dormire, se un EA carica un indicatore nel suo init tramite iCustom, la chiamata non può restituire un valore di buffer fino a quando l'indicatore non esegue il suo init e start.

 
Paul_B:
Grazie per l'input cyclops993, lo faccio funzionare attualmente ma quello che ho non sembra una soluzione ideale o particolarmente robusta. Esplorerò IsConnected() un po' di più.

Non credo che tu abbia molta scelta. MT4 genera una chiamata fittizia a start() per far sì che gli indicatori si popolino sui grafici offline, e perché più in generale vuole che gli indicatori (ri)appaiano sui grafici non appena MT4 viene caricato, senza aspettare che venga stabilita una connessione.

Se vuoi aumentare la certezza che ci sia una connessione correttamente stabilita e un TimeCurrent() valido, allora puoi anche cercare AccountNumber() != 0 e AccountBalance() > 0. Oppure potresti semplicemente aspettare il secondo tick, a costo di ritardi di molti secondi su simboli con liquidità sottile.

 

Grazie ragazzi, programmerò l'indicatore per aspettare il secondo tick.

Per inciso, ho appena esplorato la possibilità IsConnected(), ma stavo ancora ottenendo il TimeCurrent() "sbagliato" anche quando IsConnected() riportava come vero.

 
cyclops993:

<g> Non credo che tu sia ancora al passo con la cultura di questo forum. La sequenza di risposte dei moderatori e degli altri utenti a lungo termine del forum è sempre "Stai facendo qualcosa di sbagliato" seguita da "Perché vorresti farlo?" quando si scopre che non stai facendo qualcosa di sbagliato.

Se fossi in voi, uscirei dalle chiamate a start() se IsConnected() è falso. Oppure potresti mantenere un conteggio dei tick in una variabile statica e ignorare il tick #1, ma questo ritarderebbe inutilmente l'avvio in circostanze normali.

Se un utente non fornisce codice di test per dimostrare il problema è un po' difficile dare un aiuto specifico e spesso la migliore ipotesi che si può fare è quella di un errore nel codice . . . forse dovresti semplicemente prendere il controllo e rispondere a tutte le domande e alle richieste di aiuto. Questo risolverebbe tutti i tuoi problemi, poi non dovresti avere una frecciatina a chi sta solo cercando di aiutare . . .
 
RaptorUK:
Se un utente non fornisce codice di prova per dimostrare il problema [...]

Non c'era nulla di sbagliato o mancante nell'OP. Era chiaro che Paul_B stava assumendo, perfettamente ragionevolmente dalla documentazione di MT4, che start() è chiamato solo in risposta a nuovi tick.(Perché volesse controllare TimeCurrent() non fa differenza, e in realtà non è affar nostro).

La tua risposta è stata fondamentalmente una bella versione di RTFM, nonostante il fatto che il manuale sia chiaramente carente in quest'area [cosa che sottolineo è insolita; la qualità della documentazione di MT4 è piuttosto buona]. La risposta di Angevoyageur è stata quella di descrivere questo come un polverone, che sembra essere parte di uno schema di risposte patologicamente sensibili a qualsiasi critica di MT4 di qualsiasi tipo, anche se lieve. WHRoeder si è poi intromesso con "non vuoi farlo", seguito dal copiare e incollare del codice che era chiaramente irrilevante perché Paul_B chiaramente sapeva già come calcolare un offset GMT.