//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
#property link      "www.forex-tsd.com"
// original idea fr this indicator by Dan Valcu
//------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DimGray
#property indicator_color2 PaleVioletRed
#property indicator_width1 1
#property indicator_width2 2
#property indicator_level1 0

//
//
//
//
//

extern bool BetterFormula = false;
extern int  SmoothPeriod  = 3;
extern int  SmoothMethod  = MODE_SMA;
extern int  SignalPeriod  = 3;
extern int  SignalMethod  = MODE_SMA;

double bhaOpn[];
double bhaClo[];
double haDelta[];
double haSmooth[];
double haSignal[];

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

int init()
{
   IndicatorBuffers(5);
   SetIndexBuffer(0, haSmooth);
   SetIndexBuffer(1, haSignal);
   SetIndexBuffer(2, haDelta);
   SetIndexBuffer(3, bhaOpn);
   SetIndexBuffer(4, bhaClo);
   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);
          
   //
   //
   //
   //
   //
   
   for (int i=limit; i >= 0; i--)
   {
      double prOpen  = Open[i];
      double prClose = Close[i];
      double prLow   = Low[i];
      double prHigh  = High[i];

         if (BetterFormula) {
               if (prHigh!=prLow)
                     double haClose = (prOpen+prClose)/2.0+(((prClose-prOpen)/(prHigh-prLow))*MathAbs((prClose-prOpen)/2.0));
                     else   haClose = (prOpen+prClose)/2.0; }
          else              haClose = (prOpen+prHigh+prLow+prClose)/4;
                     double haOpen  = (bhaOpn[i+1]+bhaClo[i+1])/2.0;

         //
         //
         //
         //
         //
         
         bhaOpn[i]  = haOpen;
         bhaClo[i]  = haClose;
         haDelta[i] = haClose-haOpen;
   }
   for (i=limit; i >= 0; i--) haSmooth[i] = iMAOnArray(haDelta ,0,SmoothPeriod,0,SmoothMethod,i);
   for (i=limit; i >= 0; i--) haSignal[i] = iMAOnArray(haSmooth,0,SignalPeriod,0,SignalMethod,i);
   return(0);
}