A mudança do TF é um problema

 
Na verdade o problema é que o indicador que traça a linha quando muda o TF onde o histórico ainda não está carregado, então os dados são adicionados ao gráfico, e ele novamente calcula os dados, respectivamente os anteriores também são deixados de fora + pulando.
 
Vasyl Nosal:
Na verdade, o problema é que o indicador , que traça a linha quando muda o TF, no qual o histórico ainda não está carregado, calcula os dados, depois as barras são adicionadas ao gráfico, e novamente calcula os dados, respectivamente, os anteriores também são deixados de fora.

Portanto, há um erro na lógica do indicador. Ao carregar o histórico, a opção ideal do indicador: calcular seu estado no momento da última barra, que não mudou no histórico e recalcular os dados sobre a parte atualizada do histórico.

Na realidade, esta opção nem sempre é possível, pois devolver o ambiente do indicador em uma determinada barra significaria realizar o cálculo desde o início da história. Portanto, em algoritmos complexos do indicador, um recálculo completo do histórico é realizado ao carregar até mesmo uma barra (não confundir com a abertura de uma nova barra).

 
Vasyl Nosal:
Na verdade, o problema é que o indicador que traça a linha na mudança da TF, na qual o histórico ainda não está carregado, calcula os dados, depois as barras são adicionadas ao gráfico, e calcula novamente os dados, respectivamente, os anteriores também são deixados + pulando.

No indicador em OnCalculate() a verificação deve ser feita:

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

O indicador em OnCalculate() precisa ser verificado:

Obrigado.

Eu estava apenas confuso com o fato de que os alertas me deram que a história estava sendo carregada em pedaços.

Sim, isso mesmo.

 
Ihor Herasko:

Portanto, há um erro na lógica do indicador. Ao carregar o histórico, a opção ideal do indicador: calcular seu estado no momento da última barra, que não mudou no histórico e recalcular os dados sobre a parte atualizada do histórico.

Na realidade, esta opção nem sempre é possível, pois devolver o ambiente do indicador em uma determinada barra significaria realizar o cálculo desde o início da história. Portanto, em algoritmos complexos do indicador, um recálculo completo do histórico é realizado ao carregar até mesmo uma barra (não confundir com a abertura de uma nova barra).

Então a única solução viável é apenas?

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

 
Vasyl Nosal:

Então a única solução que funciona é?

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

E se eu precisar recalcular não apenas a barra atual (por exemplo, 4)?

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

{ 

if(i>Bars) i=Bars; 
 

Sim, funciona.

Quando as barras são carregadas em pedaços, elas são recalculadas em pedaços.

O pedaço correto é apenas o último a ser carregado mais para a esquerda haha.

 
Vasyl Nosal:

Sim, funciona.

Quando as barras são carregadas em pedaços, elas são recalculadas em pedaços.

O pedaço correto é apenas o último a ser carregado mais para a esquerda haha.

Tempo para aprender a escrever indicadores.
 
Victor Nikolaev:
É hora de aprender a escrever indicadores

Ensine-me.

E eu digo que os desenvolvedores devem fazer ajustes nos primeiros cálculos do indicador.

 
Victor Nikolaev:
Tempo para aprender a escrever indicadores

Quer um truque? Adivinhe o que o Alerta retornou?

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:

Quer um truque? Adivinhe o que o Alerta retornou?

Eu não uso alertas em indicadores. Providencie um recálculo completo se houver um download do histórico. É fácil de controlar.