//--------------------------------------------------------------------
// HDR.mq4 
// for Dvarrin
//--------------------------------------------------------------------
#property indicator_chart_window    
#property indicator_buffers 1      
#property indicator_color1 DarkBlue    


extern int period_multiplier  = 4;            
extern bool strict_hours  = true;     
extern bool overlaps_disabled  = true;         
extern color  band_color          = Lime;
extern color  range_color           = MediumSeaGreen;

//--------------------------------------------------------------------
int init()                         
  {
   return;                         
  }
//--------------------------------------------------------------------
int start()                         
  {   int i,                          
          Counted_bars;  
      int mins,lastone;
      double c1_high,c1_low,c2_high,c2_low,c2_open,c2_close,c3_high,c3_low,c3_open,c3_close,
      c4_high,c4_low,c4_open,c4_close;  
      double candle_max_high,candle_max_min,candle_mid,candle_range,
      trading_range_high,trading_range_low,band_high,band_low,trading_range;
      string name;             
//--------------------------------------------------------------------
   if (Bars<period_multiplier*4) return;
   Counted_bars=IndicatorCounted(); 
   i=Bars-Counted_bars-1;          
   
   if (strict_hours == true) {mins=1;} else {mins=60;}
   lastone=999999999999;
      
   while(i>period_multiplier*4)                    
     {
     
     c1_high=High[iHighest(NULL,0,MODE_HIGH,period_multiplier,i-period_multiplier+1)];
     c1_low=Low[iLowest(NULL,0,MODE_LOW,period_multiplier,i-period_multiplier+1)];
     
     c2_high=High[iHighest(NULL,0,MODE_HIGH,period_multiplier,i-2*period_multiplier+1)];
     c2_low=Low[iLowest(NULL,0,MODE_LOW,period_multiplier,i-2*period_multiplier+1)];
     c2_open=Open[i-period_multiplier];
     c2_close=Close[i-2*period_multiplier+1];
     
     c3_high=High[iHighest(NULL,0,MODE_HIGH,period_multiplier,i-3*period_multiplier+1)];
     c3_low=Low[iLowest(NULL,0,MODE_LOW,period_multiplier,i-3*period_multiplier+1)];
     c3_open=Open[i-2*period_multiplier];
     c3_close=Close[i-3*period_multiplier+1];   

     c4_high=High[iHighest(NULL,0,MODE_HIGH,period_multiplier,i-4*period_multiplier+1)];
     c4_low=Low[iLowest(NULL,0,MODE_LOW,period_multiplier,i-4*period_multiplier+1)];
     c4_open=Open[i-3*period_multiplier];
     c4_close=Close[i-4*period_multiplier+1];   
       
     if (
        
        ( (c2_high-MathMax(c2_open,c2_close)>MathAbs(c2_close-c2_open)) ||
          (MathMin(c2_open,c2_close)-c2_low>MathAbs(c2_close-c2_open)) ) 
         &&
        ( (c3_high-MathMax(c3_open,c3_close)>MathAbs(c3_close-c3_open)) ||
          (MathMin(c3_open,c3_close)-c3_low>MathAbs(c3_close-c3_open)) ) 
         &&
        ( (c4_high-MathMax(c4_open,c4_close)>MathAbs(c4_close-c4_open)) ||
          (MathMin(c4_open,c4_close)-c4_low>MathAbs(c3_close-c3_open)) ) 
         &&         
        ( (c2_high>c1_high) || (c2_low<c1_low) )
         &&
        ( (MathMax(c3_open,c3_close)<c2_high) && (MathMin(c3_open,c3_close)>c2_low) )
         &&
        ( (MathMax(c4_open,c4_close)<MathMin(c2_high,c3_high)) && 
          (MathMin(c4_open,c4_close)>MathMax(c2_low,c3_low)) )
         && 
        (TimeMinute(Time[i])<mins) 
         &&
        (i<=lastone-4*period_multiplier)
        
        )

        {
            candle_max_high=MathMax(c2_high,MathMax(c3_high,c4_high));
            candle_max_min=MathMin(c2_low,MathMin(c3_low,c4_low));
            candle_mid=(candle_max_high+candle_max_min)/2;
            candle_range=candle_max_high-candle_max_min;
            trading_range_high=candle_mid+candle_range;
            trading_range_low=candle_mid-candle_range;
            trading_range=trading_range_high-trading_range_low;
            band_high=trading_range_high+trading_range/4;
            band_low=trading_range_low-trading_range/4;
            
            name=StringConcatenate("hdrup",DoubleToStr(i,0));
         
            if (ObjectFind(name) == -1)
            {
            ObjectCreate(name, OBJ_RECTANGLE, 0, Time[i],band_high,Time[i-4*period_multiplier+1],trading_range_high);
            ObjectSet(name,OBJPROP_COLOR, band_color);
            ObjectSet(name, OBJPROP_BACK, TRUE);
            ObjectSet(name, OBJPROP_WIDTH, 0);
            ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
            }   

            name=StringConcatenate("hdrmid",DoubleToStr(i,0));
         
            if (ObjectFind(name) == -1)
            {
            ObjectCreate(name, OBJ_RECTANGLE, 0, Time[i],trading_range_high,Time[i-4*period_multiplier+1],trading_range_low);
            ObjectSet(name,OBJPROP_COLOR, range_color);
            ObjectSet(name, OBJPROP_BACK, TRUE);
            ObjectSet(name, OBJPROP_WIDTH, 0);
            ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
            }   

            name=StringConcatenate("hdrlow",DoubleToStr(i,0));
         
            if (ObjectFind(name) == -1)
            {
            ObjectCreate(name, OBJ_RECTANGLE, 0, Time[i],trading_range_low,Time[i-4*period_multiplier+1],band_low);
            ObjectSet(name,OBJPROP_COLOR, band_color);
            ObjectSet(name, OBJPROP_BACK, TRUE);
            ObjectSet(name, OBJPROP_WIDTH, 0);
            ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
            }   
        
        if (overlaps_disabled==true) lastone=i;
        
        } // if
      i--;                         
     } //while 
//--------------------------------------------------------------------
   return;                         
  }

//--------------------------------------------------------------------
 int deinit()
//+------------------------------------------------------------------+
{
  RemoveObjects("hdr");
} 

//--------------------------------------------------------------------------------------
void RemoveObjects(string prefix) // (C) Squalou
//--------------------------------------------------------------------------------------
{   
   int o;
   string objname;

   for (o = ObjectsTotal(); o >= 0; o--) {
      objname = ObjectName(o);
      if (StringFind(objname, prefix, 0) > -1) ObjectDelete(objname);
   }
} /* RemoveObjects*/  