Colorir candles em execução

 

Olá,

Criei um indicador que colore os candles dependendo de médias móveis e preços. O indicador está funcionando corretamente para os dados históricos. Porém quando inicia o pregão os novos candles não atualizam as cores, ficam com as cores padrão.

Para o indicador, aplico as cores aos candles no OnCalculate. Para atualizar as cores em tempo de execução devo utilizar a mesma regra também no OnTick? Ou deveria funcionar no OnCalculate?

Quando executo o provador de estratégia também não colore de acordo com minha regra, só fica colorida a parte histórica.

Obrigado.

 
rubensrudio:

Olá,

Criei um indicador que colore os candles dependendo de médias móveis e preços. O indicador está funcionando corretamente para os dados históricos. Porém quando inicia o pregão os novos candles não atualizam as cores, ficam com as cores padrão.

Para o indicador, aplico as cores aos candles no OnCalculate. Para atualizar as cores em tempo de execução devo utilizar a mesma regra também no OnTick? Ou deveria funcionar no OnCalculate?

Quando executo o provador de estratégia também não colore de acordo com minha regra, só fica colorida a parte histórica.

Obrigado.

Olá rubensrudio,

Em indicadores você deve utilizar APENAS a função OnCalculate. OnTick é adequada APENAS para Expert Advisors.

Com relação ao não funcionamento do indicador, acredito que possa ser algum pequeno erro de programação. Acredito que seja interessante debugar o seu código para poder entender, exatamente, o que está acontecendo.

Abraços,
Malacarne 

 

Malacarne,

Obrigado pelo retorno. Tentei debuggar mas ainda não consigo ver onde possa estar o problema. Segue abaixo os códigos caso alguém possa identificar onde está o erro (A média móvel está pintando corretamente em execução):

OnInit:
   //buffers para candles
   SetIndexBuffer(0,buffer_open,INDICATOR_DATA);
   SetIndexBuffer(1,buffer_high,INDICATOR_DATA);
   SetIndexBuffer(2,buffer_low,INDICATOR_DATA);
   SetIndexBuffer(3,buffer_close,INDICATOR_DATA);
   SetIndexBuffer(4,buffer_color_line,INDICATOR_COLOR_INDEX);
   
   //buffers para média móvel
   SetIndexBuffer(5,buffer_ma1,INDICATOR_DATA);
   SetIndexBuffer(6,buffer_color_ma1,INDICATOR_COLOR_INDEX);
   
   IndicatorSetString(INDICATOR_SHORTNAME,0,"EMA");
   ma1 = iMA(_Symbol,_Period,17,0,MODE_EMA,PRICE_CLOSE);
   
   //função para atribuição de cores
   MA_Color(0);
   MA_Color(1);



OnCalculate:
     for(int i=prev_calculated;i<=rates_total-1;i++)
     {
      //condição para cores média móvel
      if(close[i]>buffer_ma1[i]){
         buffer_color_ma1[i]=1; //verde
      }
      else
         buffer_color_ma2[i]=0; //Vermelho
      }

      //condição para cores candles
      if(close[i]>open[i]){
         buffer_color_line[i]=1; //verde escuro
      }
      else{
         buffer_color_line[i]=2; //verde claro
      }
     }

MA_Color():
   PlotIndexSetInteger(plot,PLOT_COLOR_INDEXES,3); //Specify the number of colors
   PlotIndexSetInteger(plot,PLOT_LINE_COLOR,0,clrDarkRed); //Vermelho Escuro
   PlotIndexSetInteger(plot,PLOT_LINE_COLOR,1,clrDarkGreen); //Verde Escuro
   PlotIndexSetInteger(plot,PLOT_LINE_COLOR,2,clrLime); //Verde Claro
 

Resolvido!

O problema estava no meu return do OnCalculate().

Antes:

return(rates_total);


Corrigido:

return(rates_total - 1);

Razão: