- Indicador diferencial Sultonov
- Erros, bugs, perguntas
- Indicador que está se corrompendo
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).
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) // значит история изменилась или это первый проход
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--)
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.
É hora de aprender a escrever indicadores
Ensine-me.
E eu digo que os desenvolvedores devem fazer ajustes nos primeiros cálculos do indicador.
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); }
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso