//+------------------------------------------------------------------+
//|                                                          BAM.mq4 |
//|                                          Below and Above Mid Indi|
//|                                    Open Source Indicator for MT4 |
//+------------------------------------------------------------------+
#property indicator_separate_window

#property indicator_buffers 2

#property indicator_color1 Green
#property indicator_color2 Red

//----- input parameters

extern int LookBackPeriod = 12;
input ENUM_TIMEFRAMES ChartTimeFrameToCompute = PERIOD_CURRENT;
extern int MaxBarsForComputation = 1440;

double Percent = 0.5;

//----- buffers

double Up[];
double Dn[];
double UpBuffer[];
double DownBuffer[];
double MidBufferUp[];
double MidBufferDn[];

//-----

int init()
  {
  
   IndicatorBuffers(6);

   SetIndexStyle(0, DRAW_HISTOGRAM,0,2);
   SetIndexBuffer(0, Up);
   
   SetIndexStyle(1, DRAW_HISTOGRAM,0,2);
   SetIndexBuffer(1, Dn);
   
   SetIndexStyle(2, DRAW_NONE);
   SetIndexBuffer(2, UpBuffer,INDICATOR_CALCULATIONS);
   
   SetIndexStyle(3, DRAW_NONE);
   SetIndexBuffer(3, DownBuffer,INDICATOR_CALCULATIONS);
   
   SetIndexStyle(4, DRAW_NONE);
   SetIndexBuffer(4, MidBufferUp,INDICATOR_CALCULATIONS);
   
   SetIndexStyle(5, DRAW_NONE);
   SetIndexBuffer(5, MidBufferDn,INDICATOR_CALCULATIONS);
   
   
//-----

   IndicatorDigits(Digits);

   string short_name = "BAM (" + LookBackPeriod + ")";
   IndicatorShortName(short_name);
   
   return(0);
  }
  
  
//-----

int start()
  {
   int i;     
   if(Bars <= LookBackPeriod + 1) 
       return(0);

   int counted_bars = MaxBarsForComputation;
   int limit = Bars - counted_bars;
   if(counted_bars > 0) 
       limit++;


   for(i = 0; i < limit; i++)
     {
       UpBuffer[i] = MathMax(High[iHighest(NULL,ChartTimeFrameToCompute,MODE_HIGH,LookBackPeriod,i+1)],High[iHighest(NULL,ChartTimeFrameToCompute,MODE_HIGH,LookBackPeriod,i+1+LookBackPeriod)]);
       DownBuffer[i] = MathMin(Low[iLowest(NULL,ChartTimeFrameToCompute,MODE_LOW,LookBackPeriod,i+1)],Low[iLowest(NULL,ChartTimeFrameToCompute,MODE_LOW,LookBackPeriod,i+1+LookBackPeriod)]);
       
       MidBufferUp[i] = DownBuffer[i]+((UpBuffer[i]-DownBuffer[i])*Percent);
       MidBufferDn[i] = UpBuffer[i]-((UpBuffer[i]-DownBuffer[i])*Percent);
       
       if (MathMin(Open[i],Open[i+1])>MidBufferUp[i]) {Up[i] = ((MathAbs(MathMin(Open[i],Open[i+1])-MidBufferUp[i]))/Bid)*100; Dn[i]=EMPTY_VALUE;}
       if (MathMax(Open[i],Open[i+1])<MidBufferDn[i]) {Dn[i] = (((MathAbs(MidBufferDn[i]-MathMax(Open[i],Open[i+1])))*-1.0)/Bid)*100; Up[i]=EMPTY_VALUE;}
       
     }
   return(0);
  }
//+------------------------------------------------------------------+