//------------------------------------------------------------------
//------------------------------------------------------------------
#property copyright ""
#property link      ""

#property indicator_separate_window
#property indicator_buffers    2
#property indicator_color1     LimeGreen
#property indicator_color2     Red
#property indicator_width1     2
#property indicator_width2     2
#property indicator_level1     0

//
//
//
//
//

extern double BoxPeriod           = 6.5;
extern bool   XOcleanForHA_On     = TRUE;
extern ENUM_MA_METHOD haMaMetod   = MODE_SMMA;
extern int            haMaPeriod  = 6;
extern ENUM_MA_METHOD haMaMetod2  = MODE_LWMA;
extern int            haMaPeriod2 = 2;

//
//
//
//
//

double Hi[];
double Lo[];
double no[];
double kr[];
double trend[];

double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];


//------------------------------------------------------------------
//                                                                  
//------------------------------------------------------------------

int init()
{  
   IndicatorBuffers(8);   
      SetIndexBuffer(0,kr); SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexLabel(0,"XO Up");
      SetIndexBuffer(1,no); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexLabel(1,"XO Down");
      SetIndexBuffer(2,Hi);
      SetIndexBuffer(3,Lo);
      SetIndexBuffer(4,trend);
      SetIndexBuffer(5,ExtMapBuffer1);
      SetIndexBuffer(6,ExtMapBuffer2);
      SetIndexBuffer(7,ExtMapBuffer3);

   IndicatorShortName(" XO ("+DoubleToStr(BoxPeriod,2)+")");
   return(0);
}

int deinit() { return(0);}


//------------------------------------------------------------------
//
//------------------------------------------------------------------

int start()
{
   int counted_bars=IndicatorCounted();
      if(counted_bars<0) return(-1);
      if(counted_bars>0) counted_bars--;
           int limit=MathMin(Bars-counted_bars,Bars-1);
           double pipMultiplier = MathPow(10,Digits%2)*_Point;
         
   //
   //
   //
   //
   //
    
     for(int i=limit; i>=0; i--)
     {
       double maOpen  = iMA(NULL,0,haMaPeriod,0,haMaMetod,PRICE_OPEN ,i);
       double maClose = iMA(NULL,0,haMaPeriod,0,haMaMetod,PRICE_CLOSE,i);
       double maLow   = iMA(NULL,0,haMaPeriod,0,haMaMetod,PRICE_LOW  ,i);
       double maHigh  = iMA(NULL,0,haMaPeriod,0,haMaMetod,PRICE_HIGH ,i);
       
       double haOpen=(ExtMapBuffer2[i+1]+ExtMapBuffer3[i+1])/2;
       double haClose=(maOpen+maHigh+maLow+maClose)/4;
       
              ExtMapBuffer2[i]=haOpen;
              ExtMapBuffer3[i]=haClose;
     }
     for(i=limit; i>=0; i--) ExtMapBuffer1[i]=iMAOnArray(ExtMapBuffer3,0,haMaPeriod2,0,haMaMetod2,i);
     for(i=limit; i>=0; i--)
     {
        double xoClose = Close[i];
        if (XOcleanForHA_On) xoClose = ExtMapBuffer1[i];
        if (i>=(Bars-2)) { Hi[i+1]=xoClose; Lo[i+1]=xoClose; continue; }
           double cur      = xoClose;
                  Hi[i]    = Hi[i+1];
                  Lo[i]    = Lo[i+1];
                  no[i]    = no[i+1];
                  kr[i]    = kr[i+1];
                  trend[i] = trend[i+1];

                  if (cur > (Hi[i]+BoxPeriod*pipMultiplier)) 
                  {
                       Hi[i]    = cur;
                       Lo[i]    = cur-BoxPeriod*pipMultiplier;
                       kr[i]    = kr[i+1]+1;
                       no[i]    = 0;
                       trend[i] = 1;
                  }
                  if (cur < (Lo[i]-BoxPeriod*pipMultiplier)) 
                  {
                       Lo[i]    = cur;
                       Hi[i]    = cur+BoxPeriod*pipMultiplier;
                       no[i]    = no[i+1]-1;
                       kr[i]    = 0;
                       trend[i] = -1;
                  }
      }                 
      return(0);
}