//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 4   // added 2 new buffers
#property indicator_color1 Lime
#property indicator_width1 2
#property indicator_color2 Lime
#property indicator_width2 2

#property indicator_color3 Red  // added 2 new buffers
#property indicator_width3 2
#property indicator_color4 Red
#property indicator_width4 2

//---- buffers
 
double UpTick1[];
double UpTick2[];

double DownTick1[]; // added 2 new buffers
double DownTick2[];

extern int MaxDrawBars=200;  

int myBars; 
int FirstIndicatorBar=0;
int tickCounter;
int delimeterCounter;

int UpTick[], DownTick[];    // arrays to hold up and down tick counts, facilitates rescaling without loss of accuracy
double AverageBarRange=0, ScalingFactor;
 
double CurrentTick;
double PreviousTick;

datetime Bar1Time=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
  
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0, UpTick1);
   SetIndexEmptyValue(0,0.0);
   
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1, UpTick2);
   SetIndexEmptyValue(1,0.0);
   
   SetIndexStyle(2,DRAW_HISTOGRAM);    // added 2 new buffers
   SetIndexBuffer(2, DownTick1);
   SetIndexEmptyValue(2,0.0);
   
   SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(3, DownTick2);
   SetIndexEmptyValue(3,0.0);
   
   CurrentTick = Bid;
   
   for (int i=Bars-1;i>=0;i--) // clear all the buffers back to 0.0
      {
      UpTick1[i]=0.0;
      UpTick2[i]=0.0;
      DownTick1[i]=0.0;
      DownTick2[i]=0.0;
      }
   // sum the last 20 complete bar ranges and get an average range to calculate a rudimentary scaling figure
   for (int AveBarCount=1;AveBarCount<=20; AveBarCount++)
       AverageBarRange = AverageBarRange + iHigh(NULL, 0, AveBarCount) - iLow(NULL, 0, AveBarCount);
   
   AverageBarRange = AverageBarRange/20;

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {

   return(0);
  }


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//   int    counted_bars=IndicatorCounted();   // not used
      if (Bar1Time != Time[1])  // 1st tick of new bar
         {
         RecalculateTickBars();
         UpTick[0]=0; DownTick[0]=0;    // reset for current bar
         Bar1Time = Time[1];
         }
   
      PreviousTick = CurrentTick;
      CurrentTick = Bid;
         

      if(CurrentTick > PreviousTick) UpTick[0]++;
      if(CurrentTick < PreviousTick) DownTick[0]--;
      
 //     Print("UpTick[0] = ", UpTick[0], " DownTick[0]= ",DownTick[0]);

      if (ScalingFactor == 0) ScalingFactor = AverageBarRange/2;
      
      UpTick1[0] = iOpen(NULL, 0, 0) + ScalingFactor * UpTick[0];
      UpTick2[0] = iOpen(NULL, 0, 0) ;
      
      DownTick1[0] = iOpen(NULL, 0, 0);
      DownTick2[0] = iOpen(NULL, 0, 0) + ScalingFactor * DownTick[0] ;
      
      if (FirstIndicatorBar<2)ScalingFactor = AverageBarRange/(UpTick[0] - DownTick[0]);
//      Print("UpTick[0]= ", UpTick1[0], " ",UpTick2[0]," DownTick[0]= ", DownTick1[0], " ",DownTick2[0] );
   return(0);
  }
//+------------------------------------------------------------------+

void RecalculateTickBars()
   {
//   Print("RecalculateTickBars . . . . ");
      FirstIndicatorBar++;
   
   // move the value for bar 0 along one position in the arrays   
   if (ArraySize(UpTick) == MaxDrawBars)
      {
      ArrayResize(UpTick, ArraySize(UpTick)-1 );
      ArraySetAsSeries(UpTick, true);
      ArrayResize(UpTick, ArraySize(UpTick)+1 );
      
      ArrayResize(DownTick, ArraySize(DownTick)-1 );
      ArraySetAsSeries(DownTick, true);
      ArrayResize(DownTick, ArraySize(DownTick)+1 ); 
      }
   else
      {
      ArraySetAsSeries(UpTick, true);
      ArrayResize(UpTick, ArraySize(UpTick)+1 );
      
      ArraySetAsSeries(DownTick, true);
      ArrayResize(DownTick, ArraySize(UpTick)+1 );
      }
   ArraySetAsSeries(UpTick, false);
   ArraySetAsSeries(DownTick, false);
   }  // end of RecalculateTickBars
   

