Deslocamento eixo x do evandro teixeira

 

Peguei este código seguindo a ideia do evandro teixeira aqui do meta, porém ele faz o deslocamento do indicador toda vez que faz mudança de tick,

gostaria de fazer este deslocamento apenas uma vez quando ocorrer o caso na parte        if(close[0]>open[0]) .

Até esperaria que o proprio evandro ajudasse se ver no forum.




////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#property copyright                    "Copyright © 2021"
#property description                  "Rafael Deslocamento do Eixo X"
#property link                         "rafael.com"
#property version                      "1.0"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2

#property indicator_label1  "Buyer"
#property indicator_type1   DRAW_LINE
#property indicator_color1  White
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3

#property indicator_label2  "Seller"
#property indicator_type2   DRAW_LINE
#property indicator_color2  FireBrick
#property indicator_style2  STYLE_SOLID
#property indicator_width2  3


//--- indicator buffers
double         Ext1Buffer[];
double         Ext2Buffer[];

//--- Variaveis Globais
int shift;
static int contador=0;

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                         |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Ext2Buffer,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   

   //Valores utilizados apenas para exemplo.
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);

   
   
   if(contador==0)
     {
      ArrayInitialize(Ext1Buffer,0);
      ArrayInitialize(Ext2Buffer,0);      
     }
       

       //OBJETIVO:condição que deveria ocorrer o deslocamento do indicador apenas uma vez. mas esta ocorrendo cada tick a tick.
       if(close[0]>open[0])
       {
        shift=rates_total-1-contador;   
        contador++;
        }
       
       //OBJETIVO:condição que deveria ocorrer o deslocamento do indicador apenas uma vez. mas esta ocorrendo cada tick a tick.
       if(close[0]<open[0])
       {
        shift=rates_total-1-contador;   
        contador++;
        }
        


   
   
   Ext1Buffer[contador]=high[0];     
   Ext2Buffer[contador]=low[0];    
   PlotIndexSetInteger(0,PLOT_SHIFT,shift);
   PlotIndexSetInteger(1,PLOT_SHIFT,shift);
   
       
   Print("Rates Total=",rates_total," Shift=",shift," Contador=",contador);
      
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//-----------------------------------------++



/////////////////////////////////////////////////////////////////////////////////////////////////////////

 
Olha o que ta acontecendo é que ele verifica as condições mas retornar tick a tick mesmo. O que tem que fazer é verificar apenas se for uma nova barra, tem em alguns lugares uma função de verificar se for uma nova barra, da uma pesquisada que rapidinho voce acha. Edit: Até ficou o link da função ali
Razão: