Problema com código do indicador Result

 

Boa tarde.

Fiz um indicador que mede as pernadas anteriores estilo o Result que muitos conhecem.

O indicador precisa fazer o cálculo quando acontece a inversão, então ele entra no for e faz o cálculo da pernada anterior, até parece que está funcionando mas tem um pequeno bug que não encontrei a solução.

Quando insere ele no gráfico, ele mostra certo o posicionamento da altura com as devidas pernadas, ele começa a calcular alguns e para, então se removo ele do gráfico e adiciono, ele calcula todos, faz mais algumas barras e para de novo.

Também fiz ele para o tryd, onde também acontece um certo bug, ele não para de calcular mas fica deslocando a posição enquanto não fecha a pernada, onde deveria acontecer o calculo apenas quando tivesse alguma inversão.

Então em cada plataforma ele se comporta com algum tipo de bug, logo creio que tem alguma falha no código que não estou encontrando.


//+------------------------------------------------------------------+
//|                                              HistogramaColor.mq5 |
//|                                                             Neto |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Neto"
#property link      ""
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| PROPRIEDADES DO INDICADOR (DIRETIVAS)                        |
//+------------------------------------------------------------------+
#property indicator_buffers 3 
#property indicator_plots 1 
//---
#property indicator_label1 "ForceResult" 
#property indicator_type1 DRAW_COLOR_HISTOGRAM 
#property indicator_style1 STYLE_SOLID 
#property indicator_color1 clrAqua,clrRed 
#property indicator_width1 2 

double wb[]; 
double wC[]; 
double cl[];

//=== Variáveis
int lenU = 0;
int lenD = 0;
double tmU = 0;
double tmD = 0;

int OnInit()
  {
//--- Mapear os buffers do indicador
   SetIndexBuffer(0,wb,INDICATOR_DATA);
   SetIndexBuffer(1,wC,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,cl,INDICATOR_DATA);
   IndicatorSetString( INDICATOR_SHORTNAME, "Force Result" );
   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[])
  {

int i;
if(prev_calculated == 0) i = 0;
else i = prev_calculated-1;
  for(i = 2; i < rates_total; i++) 
        {
           cl[i] = close[i];
           if(cl[i] >= cl[i-1])
            {
             if(lenD > 0)
               {
                tmD = (high[i-lenD]-low[i-1]);
                for(int j = 0; j < lenD; j++)
                  {
                    wb[i-lenD+j] = tmD;
                    wC[i-lenD+j] = 1;
                  }
               lenD = 0;
              }
            if(cl[i-1] >= cl[i-2])
              {
                  lenU +=1;
               }
           else if(cl[i] >= cl[i-1]){
                lenU +=1;
            }
          }
         else
           {
             //Se variável lenU estiver carregada, entra e faz o loop
             if(lenU > 0)
              {
                //tmU recebe valor da máxima i-1 e da última posição da mínima da pernada passada.
                tmU = (high[i-1]-low[i-lenU]);
                for(int n = 0; n < lenU; n++)
                 {
                   wb[i-lenU+n] = tmU; //Insere o valor da altura da pernada em cada index da pernada anterior
                   wC[i-lenU+n] = 0;
                 }
                  lenU = 0; //zeragem da variável
              }
              if(cl[i-1] < cl[i-2])
                {
                     lenD +=1;
                }
                else if(cl[i] <= cl[i-1])
                  {
                   lenD +=1;
                  }
            }
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+


Aqui uns prints para demonstrar o tal bug.

No mt5 a falta de atualizar a pernada, e no tryd o deslocamento até terminar a pernada.

Não quero suporte para tryd, só estou colocando como exemplo para um possível bug no código.

Arquivos anexados:
 

Olá amigo,

conseguiu evoluir neste indicador

baixei ele e vi que não roda legal, 

mais quero tentar ajudar a melhorar ele.

Razão: