//+------------------------------------------------------------------+
//|                                                ArenDI ATR_v2.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010.01.19, SwingMan"
#property link      ""
//+------------------------------------------------------------------+
//  v2 - different colours for Bull/Bear bars
//+------------------------------------------------------------------+

#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 RoyalBlue   // line
#property indicator_color2 Magenta     // bear Hook / signal on High 
#property indicator_color3 DodgerBlue  // bull Hook / signal on Low
#property indicator_color4 Orange      // pin bar, higher third / signal like bear / on High / Magenta, Orange
#property indicator_color5 SpringGreen // pin bar, lower third  / signal like bull / on Low  / Blue / Tomato
#property indicator_color6 Gray        // normal bar
#property indicator_color7 Gray        // empty
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 2

//---- input parameters
extern int AtrPeriod=34;
extern double ScaleFactor = 0.6;
//---- buffers
double AtrBuffer[];
double TempBuffer[];
double ReverseBarBULL[], ReverseBarBEAR[], PinBarBULL[], PinBarBEAR[];
double NormalBar[], BarRange[]; 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
   string indi_name="ArenDI ";
   short_name=indi_name +
              "ATR_v2 ("+AtrPeriod+
              ", " + DoubleToStr(ScaleFactor,1)+ ")";
   IndicatorShortName(short_name);   
//---- 1 additional buffer used for counting.
   IndicatorBuffers(8);
//---- indicator line   
   SetIndexBuffer(0,AtrBuffer);      SetIndexStyle(0,DRAW_LINE);      SetIndexLabel(0,"ArenDI ATR(" + AtrPeriod+")");
   SetIndexBuffer(1,ReverseBarBULL); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexLabel(1,NULL);
   SetIndexBuffer(2,ReverseBarBEAR); SetIndexStyle(2,DRAW_HISTOGRAM); SetIndexLabel(2,NULL);
   SetIndexBuffer(3,PinBarBULL);     SetIndexStyle(3,DRAW_HISTOGRAM); SetIndexLabel(3,NULL);
   SetIndexBuffer(4,PinBarBEAR);     SetIndexStyle(4,DRAW_HISTOGRAM); SetIndexLabel(4,NULL);
   SetIndexBuffer(5,NormalBar);      SetIndexStyle(5,DRAW_HISTOGRAM); SetIndexLabel(5,NULL);   
   SetIndexBuffer(6,BarRange);       SetIndexStyle(6,DRAW_NONE);      SetIndexLabel(6,"ArenDI BarRange");  
   //-- dummy buffer
   SetIndexBuffer(7,TempBuffer); 
//----
   SetIndexDrawBegin(0,AtrPeriod);
   
   IndicatorDigits(Digits);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
int start()
  {
   int i,counted_bars=IndicatorCounted();
//----
   if(Bars<=AtrPeriod) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=AtrPeriod;i++) AtrBuffer[Bars-i]=0.0;
//----
   i=Bars-counted_bars-1;
   while(i>=0)
     {
      double high=High[i];
      double low =Low[i];
      if(i==Bars-1) TempBuffer[i]=high-low;
      else
        {
         double prevclose=Close[i+1];
         TempBuffer[i]=MathMax(high,prevclose)-MathMin(low,prevclose);
        }
      BarRange[i] = high - low;  
      i--;
     }
//----
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   for(i=0; i<limit; i++) {
      AtrBuffer[i]=iMAOnArray(TempBuffer,Bars,AtrPeriod,0,MODE_SMA,i+1) * ScaleFactor;
      
      if (BarRange[i] < AtrBuffer[i]) {
         NormalBar[i] = BarRange[i];
      }
      else
      {
         double hl3 = BarRange[i] * 0.333;
         //-- reverse bar
         bool reverse1 = (Open[i]  > High[i] - hl3) && (Close[i] < Low[i] + hl3);
         bool reverse2 = (Close[i] > High[i] - hl3) && (Open[i]  < Low[i] + hl3);
         
         bool pin1 = (Open[i]  > High[i] - hl3) && (Close[i] > High[i] - hl3);
         bool pin2 = (Open[i]  < Low[i] + hl3) && (Close[i] < Low[i] + hl3);
         
         //-- bull hook
         if (reverse1 == true)
         {
            ReverseBarBULL[i] = BarRange[i];
            ReverseBarBEAR[i] = EMPTY_VALUE; 
            PinBarBULL[i] = EMPTY_VALUE; 
            PinBarBEAR[i] = EMPTY_VALUE; 
            NormalBar[i] = EMPTY_VALUE;
         } 
         else 
         //-- bear hook
         if (reverse2 == true)
         {
            ReverseBarBULL[i] = EMPTY_VALUE; 
            ReverseBarBEAR[i] = BarRange[i]; 
            PinBarBULL[i] = EMPTY_VALUE; 
            PinBarBEAR[i] = EMPTY_VALUE; 
            NormalBar[i] = EMPTY_VALUE;
         }
         else
         
         //-- bull pin
         if (pin1 == true)
         {
            PinBarBULL[i] = BarRange[i]; 
            PinBarBEAR[i] = EMPTY_VALUE; 
            ReverseBarBULL[i] = EMPTY_VALUE; 
            ReverseBarBEAR[i] = EMPTY_VALUE;
            NormalBar[i] = EMPTY_VALUE;
         }
         else
         //-- bear pin
         if (pin2 == true) 
         {
            PinBarBULL[i] = EMPTY_VALUE; 
            PinBarBEAR[i] = BarRange[i];
            ReverseBarBULL[i] = EMPTY_VALUE; 
            ReverseBarBEAR[i] = EMPTY_VALUE;
            NormalBar[i] = EMPTY_VALUE;
         }
         else
         //-- normal bar
         {
            NormalBar[i] = BarRange[i];
            PinBarBULL[i] = EMPTY_VALUE; 
            PinBarBEAR[i] = EMPTY_VALUE;
            ReverseBarBULL[i] = EMPTY_VALUE; 
            ReverseBarBEAR[i] = EMPTY_VALUE;            
         }
      }   
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+