Cambiare il TF è un problema

 
In realtà il problema è che l'indicatore che disegna la linea quando cambia il TF dove la storia non è ancora caricata, poi i dati vengono aggiunti al grafico, e calcola di nuovo i dati, rispettivamente i precedenti vengono anche lasciati fuori + saltati.
 
Vasyl Nosal:
Il problema è che l'indicatore , che disegna la linea quando cambia il TF, su cui la storia non è ancora caricata, calcola i dati, poi le barre vengono aggiunte al grafico, e calcola di nuovo i dati, rispettivamente, anche i precedenti vengono lasciati fuori.

Quindi c'è un errore nella logica dell'indicatore. Quando si carica la storia, l'opzione ideale dell'indicatore: calcolare il suo stato al momento dell'ultima barra, che non è cambiata nella storia e ricalcolare i dati sulla parte aggiornata della storia.

In realtà, questa opzione non è sempre possibile, perché restituire l'ambiente dell'indicatore su una certa barra significherebbe effettuare il calcolo dall'inizio della storia. Pertanto, negli algoritmi complessi dell'indicatore viene eseguito un ricalcolo completo della storia quando si carica anche una sola barra (da non confondere con l'apertura di una nuova barra).

 
Vasyl Nosal:
In realtà il problema è che l'indicatore che disegna la linea al cambio di TF, su cui la storia non è ancora caricata, calcola i dati, poi le barre vengono aggiunte al grafico, e calcola di nuovo i dati, rispettivamente, le precedenti vengono anche lasciate fuori + saltate.

Nell'indicatore in OnCalculate() il controllo dovrebbe essere fatto:

if(prev_calculated==0)  // значит история изменилась или это первый проход
 
Karputov Vladimir:

L'indicatore in OnCalculate() deve controllare:

Grazie.

Ero solo confuso dal fatto che gli avvisi mi davano che la storia veniva caricata a pezzi.

Sì, proprio così.

 
Ihor Herasko:

Quindi c'è un errore nella logica dell'indicatore. Quando si carica la storia, l'opzione ideale dell'indicatore: calcolare il suo stato al momento dell'ultima barra, che non è cambiata nella storia e ricalcolare i dati sulla parte aggiornata della storia.

In realtà, questa opzione non è sempre possibile, perché restituire l'ambiente dell'indicatore su una certa barra significherebbe effettuare il calcolo dall'inizio della storia. Pertanto, con qualsiasi algoritmo sofisticato dell'indicatore viene eseguito un ricalcolo completo della storia quando si carica anche una sola barra (da non confondere con l'apertura di una nuova barra).

Quindi l'unica soluzione praticabile è solo?

for(int i=rates_total-prev_calculated;i>=0;i--)

 
Vasyl Nosal:

Quindi l'unica soluzione che funziona è?

for(int i=rates_total-prev_calculated;i>=0;i--)

E se ho bisogno di ricalcolare non solo la barra corrente allora (per esempio 4)?

for(int i=rates_total-prev_calculated+4;i>=0;i--) 

{ 

if(i>Bars) i=Bars; 
 

Sì, funziona.

Quando le barre vengono caricate in chunks, vengono ricalcolate in chunks.

Il chunk corretto è solo l'ultimo ad essere caricato più a sinistra haha.

 
Vasyl Nosal:

Sì, funziona.

Quando le barre vengono caricate in chunks, vengono ricalcolate in chunks.

Il chunk corretto è solo l'ultimo ad essere caricato più a sinistra haha.

È ora di imparare a scrivere indicatori.
 
Victor Nikolaev:
È ora di imparare a scrivere indicatori

Insegnami.

E io dico che gli sviluppatori dovrebbero fare degli aggiustamenti nei primi calcoli dell'indicatore.

 
Victor Nikolaev:
È ora di imparare a scrivere indicatori

Vuoi un trucco? Indovina cosa ha restituito Alert?

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[])
  {
  if(prev_calculated!=0) Alert(prev_calculated," M:",Period());
return(rates_total);
  }

 
Vasyl Nosal:

Vuoi un trucco? Indovina cosa ha restituito Alert?

Non uso avvisi negli indicatori. Prevedere un ricalcolo completo se c'è un download della storia. È facile da controllare.