Mensagem de: Indicator is too slow, rewrite the indicator, please.

 

Pessoal, tudo bem?

Em um dos indicadores de teste que estamos fazendo nos estudos, apareceu essa mensagem. Queria entender se estou fazendo o "for" da forma correta e otimizada, vejam:

   //--- variáveis locais
   int index = 0;

   //--- verifica se tem a quantidade de períodos necessários
   if (rates_total < InpPeriod)
      return (0);

   //--- correção da posição da primeira iteração
   if (prev_calculated < InpPeriod)
   {
      index = InpPeriod;
      ArrayInitialize(bufferMASa, EMPTY_VALUE);
      PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, InpPeriod);
   }        
   else
      index = prev_calculated - 1;
      // Depois testar com "index = prev_calculated - InpPeriod;"

   for (int i=index; i < rates_total && !IsStopped(); i++) {
 
b2tradingclub:

Pessoal, tudo bem?

Em um dos indicadores de teste que estamos fazendo nos estudos, apareceu essa mensagem. Queria entender se estou fazendo o "for" da forma correta e otimizada, vejam:

Me parece correto, só o plotindex* que recomendo mover pro oninit já que é só uma vez que tem que executa-lo.

Além disso, se for querer recalcular o indicador so quando mudar a vela pode fazer um teste do rates_total com o prev_calculated.
 
Ricardo Rodrigues Lucca #:
Me parece correto, só o plotindex* que recomendo mover pro oninit já que é só uma vez que tem que executa-lo.

Além disso, se for querer recalcular o indicador so quando mudar a vela pode fazer um teste do rates_total com o prev_calculated.

Olá Ricardo, tudo bem? O plotindex no OnInit, seria necessário criar uma variável fora das funções (global do arquivo), correto?

Quanto ao teste da vela, você poderia me passar um exemplo de como fazer isso?

Agradeço!!!

 
b2tradingclub #:

Olá Ricardo, tudo bem? O plotindex no OnInit, seria necessário criar uma variável fora das funções (global do arquivo), correto?

Quanto ao teste da vela, você poderia me passar um exemplo de como fazer isso?

Agradeço!!!

1) Não, so move a linha que deve dar certo. O InpPeriod deve ser o input que é uma constante, então movendo a linha como esta deve dar certo sem ter que criar nenhuma variavel.

2) Ficaria algo assim:

//--- variáveis locais
   int index = 0;

   //--- verifica se tem a quantidade de períodos necessários
   if (rates_total < InpPeriod)
      return (0);

   //--- verifica se estamos na mesma vela para nao recalcular
   if (rates_total == prev_calculated) // linhas incluidas
      return (prev_calculated);        // linhas incluidas

   //--- correção da posição da primeira iteração
   if (prev_calculated < InpPeriod)
   {
      index = InpPeriod;
      ArrayInitialize(bufferMASa, EMPTY_VALUE);
      //PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, InpPeriod); // essa linha moveria pro init
   }        
   else
      index = prev_calculated - 1;

   for (int i=index; i < rates_total && !IsStopped(); i++) {
Razão: