Linha vertical. - página 4

 

Ainda estou aprendendo os meandros dos indicadores e tenho perguntas. Eu reinicializo o buffer indicador no OnInit(), mas por alguma razão os buffers não são reinicializados durante a compilação do indicador. Para a lógica, deveria haver uma célula completa para cada célula tampão após a compilação, mas na figura você pode ver que há muitas delas (acho que estas são as células tampão anteriores). Onde eu cometo um erro?

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- установим пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   ArrayInitialize(ColorHistogram_2Buffer1,0);
   ArrayInitialize(ColorHistogram_2Buffer2,0);
   ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);

   Print("-INITALIZATION-");

   false;
//---
   return(INIT_SUCCEEDED);
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
Arquivos anexados:
 
Nauris Zukas:

Ainda estou aprendendo os meandros dos indicadores e tenho perguntas. Eu reinicializo o buffer indicador no OnInit(), mas por alguma razão os buffers não são reinicializados durante a compilação do indicador. Para a lógica, deveria haver uma célula completa para cada célula tampão após a compilação, mas na figura você pode ver que há muitas delas (acho que estas são as células tampão anteriores). Onde eu cometo um erro?

No OnInit, os amortecedores indicadores têm comprimento zero.


É por isso que eles podem fazer o que você quiser, tudo parece ser trabalho de um homem morto para eles.

E quando a execução do código muda para OnCalculate, o tamanho imediatamente se torna igual a taxas_total.

e há "lixo" em todas as células da matriz. Também pode haver sobras do cálculo de indicadores antigos.

 
Alexey Viktorov:

No OnInit, os amortecedores indicadores têm comprimento zero.


É por isso que você pode fazer o que quiser com eles, eles são um presente de morte.

E quando a execução do código passa para a OnCalculate, o tamanho imediatamente se torna igual a taxas_total.

e todas as células da matriz têm "lixo" nelas. Pode sobrar um pouco do cálculo do antigo indicador.

Muito obrigado, eu consegui tudo e funcionou! Foi assim:

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   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[])
  {
   if(!ResetOnInit)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
      ResetOnInit=true;
     }
  }
 
Nauris Zukas:

Muito obrigado, tudo deu certo! Eu o fiz assim:

Por que atribuir um valor a uma variável duas vezes?

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }

E uma pergunta: Qual é o objetivo de fazer tudo isso? Afinal de contas, passando por todas as barras do laço, todas as células da matriz devem ser preenchidas de qualquer forma. A menos que o indicador mostre apenas a posição atual, mas então a matriz deve ser inicializada em cada barra, não apenas no início...

 
Alexey Viktorov:

Por que atribuir um valor a uma variável duas vezes?

Eu não tinha certeza se todas as ações com o gráfico são imitadas pelo OnInit(), por exemplo, mudando os taimfreims. Trocando o taimfreim reset (acabado de verificar), mas talvez haja algo mais, então coloquei o segundo no OnInit() para ter certeza. Mas se não, então não vou colocá-lo lá.
 
Alexey Viktorov:

E a pergunta é: Por que precisamos de tudo isso? Afinal de contas, passando por todas as barras do laço, todas as células da matriz devem ser preenchidas com algo, de qualquer forma. A menos que o indicador mostre apenas a posição atual, mas então a matriz deve ser inicializada em cada barra, não apenas no início...

Neste exemplo, eu só queria entender como reiniciar o buffer. Mas no futuro (no indicador em que estou trabalhando agora), precisarei tanto deixar as células anteriores quanto adicionar novas células. E só nisso comecei a trabalhar, por assim dizer - os primeiros testes.

 
Nauris Zukas:
Não tinha certeza de que todas as ações com o gráfico fossem imitadas pelo OnInit(), por exemplo, mudança de taimfreims. Trocando o taimfreim reset (conferido agora), mas talvez haja algo mais, então coloquei o segundo no OnInit() para ter certeza. Mas se não, então não vou colocá-lo lá.

Ahh. Bem, sim, as variáveis de nível global não são inicializadas quando o período do gráfico muda. ???Eu acho que... não consegue se lembrar exatamente.

E, em geral, você pode prescindir dessa variável de bool extra.

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)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
     }
  }
 
Alexey Viktorov:

E em geral, você pode prescindir desta variável de bool extra.

Sim, exatamente, melhor ainda, obrigado.

 

Você pode me dizer por que, se o período é superior a 30 minutos, ele retorna um número tão estranho?

Print("PERIOD: ",Period()); 

KP 0 14:33:22.423 Teste_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30) PERÍODO: 30

GG 0 14:33:24.402 Teste_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) PERÍODO: 16385

RJ 0 14:33:25.675 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) PERÍODO: 16388
 
Nauris Zukas:

Você pode me dizer por que se o período é superior a 30 minutos, ele retorna um número tão estranho?

Em MT5, os valores do período não são iguais ao número de minutos, como em MT4

Razão: