Bug MQL5 quando si lavora con accesso alle serie temporali iClose/iOpen, ecc. - pagina 8

 
Slava:

È possibile cercare di determinare.

Se si tratta di minuti, potete confrontare il tempo dell'ultima barra con TimeCurrent(). Se non è M1, potete chiedere iTime(_Symbol,PERIOD_M1,0) e confrontare con TimeCurrent().

Puoi confrontare il prezzo Bid o Last (a seconda del simbolo) con il prezzo Close dell'ultima barra. Potete chiedere direttamente a SymbolInfoTick il simbolo corrente. Oltre al Bid e Last, c'è anche il tick time

Grazie, almeno qualche informazione su dove e come cercare i bug se qualcosa è andato storto

ma penso, che tutti gli stessi hanno bisogno di una funzione incorporata per controllare lo stato, o meglio ancora, dovrebbe essere una bandiera, come int _LastError, che memorizzerebbe il numero di tick mancati, sarebbe utile quando si chiama OnCalculate() - in calcoli complessi fare immediatamente ritorno, per rilasciare il flusso del simbolo

 
Igor Makanu:

Grazie, almeno qualche informazione su dove e come cercare i bug se qualcosa è andato storto

ma penso, che tutti gli stessi hanno bisogno di una funzione incorporata per controllare lo stato, o meglio ancora, sarebbe una bandiera, come int _LastError, che memorizzerebbe il numero di tick mancati, sarebbe conveniente quando si chiama OnCalculate() - in calcoli complessi fare immediatamente ritorno, per rilasciare il flusso di simboli

pensato, ponderato.... Questa non è la soluzione. quale sarà la conoscenza dei tick mancati (Slava dice, che è garantito che l'indicatore riceve TUTTI i tick, e questo fatto porta a tutte le impiccagioni non solo dei programmi MQL, ma anche del terminale client)? in ogni caso, questi tick dovranno essere raccolti ed elaborati, e questo significa, se abbiamo perso un tick, perché sperare improvvisamente che la prossima volta sarà possibile? - è un circolo vizioso.

Stavo pensando... forse gli sviluppatori dovrebbero introdurre qualcosa di simile alle eccezioni? L'arrivo di un nuovo tick dovrebbe interrompere tutte le operazioni, i calcoli nell'indicatore in quel momento, e qualsiasi funzione MQL standard dovrebbe restituire un errore durante la sua esecuzione, se un nuovo tick arriva in quel momento ... Allora il lavoro con l'indicatore diventa chiaro, comodo e prevedibile. Per gli altri tipi di programmi (script, Expert Advisors) è quasi inutile.

E tutti i tipi di controlli delle spunte nell'indicatore per la loro rilevanza - per dirla tutta, questa non è la soluzione.

 

Abbiamo un'idea per gli indicatori che non contengono il flag #property tester_everytick_calculate, per includere la modalità di calcolo sulla base della ricezione di un pacchetto di tick, invece che su ogni tick.

Questo risolverà radicalmente il problema degli indicatori lenti, conservando la possibilità di garantire l'elaborazione di ogni tick per alcuni indicatori.

 
Renat Fatkhullin:

Abbiamo un'idea per gli indicatori che non contengono il flag #property tester_everytick_calculate, per includere la modalità di calcolo sulla base della ricezione di un pacchetto di tick, invece che su ogni tick.

Questo risolverà drasticamente il problema degli indicatori ritardati, conservando la possibilità dell'elaborazione garantita di ogni tick per alcuni indicatori.

Quindi, sarete in grado di avere un indicatore molto veloce con un tale design?

//+-------------------------------------------+
int OnInit() 
  {
  EventSetMillisecondTimer(200);
//-
  return(INIT_SUCCEEDED);
 }

//+-------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const datetime& time[],
                 const double& open[],
                 const double& high[],
                 const double& low[],
                 const double& close[],
                 const long& tick_volume[],
                 const long& volume[],
                 const int& spread[])
 {
  // Здесь ничего не делаем, нам не нужен в данном случае OnCalculate
  return(rates_total);
 }

//+-------------------------------------------+
void OnTimer()
 {
  // Здесь расчёты, и вывод информации на график в виде графических объектов
 }

Se è così, questa è una grande notizia!

 
Renat Fatkhullin:

Abbiamo un'idea per gli indicatori che non contengono il flag #property tester_everytick_calculate, per includere la modalità di calcolo sulla base dell'accettazione del pacchetto di tick, invece che su ogni tick.

Questo risolverà radicalmente il problema degli indicatori lenti, conservando la possibilità di un'elaborazione garantita di ogni tick per alcuni indicatori.

E se si fa una funzione standard per ottenere un array multicurrency sincronizzato, sarà una vera vacanza.

 
Renat Fatkhullin:

Abbiamo un'idea per gli indicatori che non contengono il flag #property tester_everytick_calculate, per includere la modalità di calcolo sulla base della ricezione di un pacchetto di tick, invece che su ogni tick.

Questo risolverà radicalmente il problema degli indicatori lenti, conservando la possibilità dell'elaborazione garantita di ogni tick per alcuni indicatori.

Buona idea!

E preferibilmente dovrebbe funzionare senza alcuna#proprietà di default.

Se qualcuno ne ha bisogno altrimenti, che metta#proprietà.

 
La soluzione per ricevere ticks in pacchetti è buona e probabilmente non molto costosa, se non abbiamo bisogno del tempo reale (ma non è chiaro come funzioneranno gli EA con indicatori che lavorano ai prezzi di "ieri", ma non importa).

Ma c'è un'altra classe di problemi - in tempo reale, su ogni tick. In questo caso o si ha il tempo di fare i calcoli dopo un tick prima che arrivi il tick successivo, oppure no, e allora la soluzione di trading sarà irrilevante (non c'è una terza via). Ecco perché c'è solo un modo corretto per risolvere il problema: interrompere tutti i calcoli in corso e restituire l'errore quando arriva un nuovo tick. Altrimenti ci si può dimenticare del tempo reale. Ora le zecche stanno diventando sempre più veloci ogni giorno, e la strada è ancora lunga, quindi è necessario pianificare il futuro, per non parlare del fatto che è impossibile elaborare tutte le zecche senza ritardi nel tempo nel presente.

 
_o0O:
La soluzione per ricevere ticks in pacchetti è buona e probabilmente non molto costosa, se non abbiamo bisogno del tempo reale (ma non è chiaro come funzioneranno gli EA con indicatori che lavorano ai prezzi di "ieri", ma non importa).

Ma c'è un altro tipo di compiti - in tempo reale, su ogni tick. O si ha il tempo di eseguire le stime dopo la ricezione di un tick o non lo si ha, e la soluzione commerciale sarà irrilevante (non c'è una terza alternativa). Ecco perché c'è solo un modo corretto per risolvere il problema: interrompere tutti i calcoli in corso e restituire l'errore quando arriva un nuovo tick. Altrimenti ci si può dimenticare del tempo reale. Ora le zecche stanno diventando sempre più veloci ogni giorno, e la strada è ancora lunga, quindi è necessario pianificare il futuro, per non parlare del fatto che è impossibile elaborare tutte le zecche senza ritardi nel tempo nel presente.

La maggior parte degli indicatori EAs lavora con la barra chiusa[1], ecco perché il salto dei tick non ha importanza, è attuale per gli indicatori che lavorano con i tick, ma non ce ne sono molti, possono solo essere assegnati"#property tester_everytick_calculate".

E ancora, se hai bisogno di super-ticks, non hai bisogno di un indicatore per questo, tutto questo può essere scritto nel codice dell'Expert Advisor. Quindi, non è ragionevole rallentare il lavoro dell'indicatore per il bene di ogni tick.

Aspettiamo"#property tester_everytick_calculate".

 
Vitaly Muzichenko:

La maggior parte degli indicatori EAs lavora con la barra chiusa[1], ecco perché il salto dei tick non ha importanza, è attuale per gli indicatori che lavorano con i tick, ma non ce ne sono molti, possono solo essere assegnati"#property tester_everytick_calculate".

E ancora, se hai bisogno di super-ticks, non hai bisogno di un indicatore per questo, tutto questo può essere scritto nel codice dell'Expert Advisor. Quindi, non è ragionevole rallentare il lavoro dell'indicatore per il bene di ogni tick.

In attesa di"#property tester_everytick_calculate".


OK, e in che modo quello che hai detto non è d'accordo con quello che ho detto io?
 
Può essere utile a qualcuno. Ho un indicatore multi-valuta, quindi i principali calcoli capacitivi li faccio nel blocco di inizializzazione e solo il rendering in oncalculus. Ma questa è una soluzione per situazioni in cui le linee dell'indicatore stesso non contengono calcoli complessi. Nel mio caso è un indicatore di portafoglio che visualizza un grafico del comportamento del portafoglio.