//+--------------------------------------------------------------------------------------------+
//|                                                                                            |
//|                                      DWMRanges.mq4                                         | 
//|                                                                                            |
//+--------------------------------------------------------------------------------------------+ 
#property copyright "Copyright  @  2012 Zool  @  email: angyalzoltan@gmail.com"
#property link      "https://www.forexfactory.com/thread/post/13999981#post13999981" 
#property version  "3.59"  //с кнопкой  
#property indicator_chart_window
#define  NL    "\n"

//Global External Inputs------------------------------------------------------------------------ 
extern bool   Daily_Range_On                  = true;
extern int    Daily_Range_Period              = 24;
extern bool   Weekly_Range_On                 = true;
extern int    Weekly_Range_Period             = 24;
extern bool   Monthly_Range_On                = true;
extern int    Monthly_Range_Period            = 24;
extern bool   Show_Comments                   = true;
extern string Lines_Settings                   = "Lines Settings:"; 
extern color  DRangeHigh_Color                 = clrSalmon;
extern color  DRangeLow_Color                  = clrSkyBlue;
extern color  WRangeHigh_Color                 = clrCrimson;
extern color  WRangeLow_Color                  = clrRoyalBlue;
extern color  MRangeHigh_Color                 = clrBrown;  //Maroon;
extern color  MRangeLow_Color                  = clrBlue;  //Navy;
extern ENUM_LINE_STYLE LineStyle               = STYLE_SOLID;    
extern int    LineThickness                    = 2;

extern color  Range_Labels_Color        = clrGray;
extern string Range_Labels_FontStyle    = "Verdana"; 
extern int    Range_Labels_FontSize     = 8;  

extern color             buttColor  =  clrWhite;  //Red;   //Yellow;  //Aqua;
extern int                buttSize  =  10;
extern color             backColor  =  clrMediumBlue;  //Lime;  //Brown;  //SlateBlue;  //Bisque;  //Yellow;  //C'15,15,115';  //clrNONE;                     
extern int                   axisX  =  0;
extern int                   axisY  =  543;

//Deinit Section
int        obj_total,k;
string     name;

//Range Section
int        TodayBar;
double     HiToday,LoToday,HiWeek,LoWeek,HiMonth,LoMonth;
double     DRangeAvg, DRangeHigh, DRangeLow, WRangeAvg, WRangeHigh, WRangeLow, MRangeAvg, MRangeHigh, MRangeLow;
double     DARg, WARg, MARg, TodayRange,WeekRange,MonthRange;  
int        Factor,i;

//Draw Lines
int        a,b,c,R2;  
//string     line;
datetime   startline, stopline;

//Draw Labels
string     spc, screeninfo;  //linelabel
datetime   startlabel; 
string PREF = "DWMR["+(string)Daily_Range_Period+"+"+(string)Weekly_Range_Period+"+"+(string)Monthly_Range_Period+"] ";
//+-------------------------------------------------------------------------------------------+
//| Indicator Initialization                                                                  |                                                        
//+-------------------------------------------------------------------------------------------+      
int init()
   {
   if (Digits == 5 || Digits == 3) {Factor = 10;} 
   else {Factor = 1;} //cater for 5 digits 
//---
   if (ObjectFind(0,PrefBT)!=0)  DrawBUTTON(PrefBT,"DWMRanges ON");       
//---
return(0);   
   }
//+-------------------------------------------------------------------------------------------+
//| Indicator De-initialization                                                               |                                                        
//+-------------------------------------------------------------------------------------------+       
void OnDeinit(const int reason)
{ 
   ObjectsDeleteAll(0,PREF,-1,-1);  Comment("");
   //---
   switch(reason)
    {
   //case REASON_PARAMETERS  :
     case REASON_CHARTCHANGE :
     case REASON_RECOMPILE   :
     case REASON_CLOSE       : break;
     default : ObjectDelete(0,PrefBT);
    }
}     
//+-------------------------------------------------------------------------------------------+
//| Indicator Start                                                                           |                                                        
//+-------------------------------------------------------------------------------------------+         
int start()
   {
   if (getButtonState(PrefBT)=="OFF")  return(0); 
   //---
   //Panel and Range lines - Define today's bar/data                   
   TodayBar   = iBarShift(NULL,PERIOD_D1,Time[0]);
   HiToday    = iHigh (NULL,PERIOD_D1,TodayBar);
   LoToday    = iLow  (NULL,PERIOD_D1,TodayBar); 
   HiWeek    = iHigh (NULL,PERIOD_W1,0);
   LoWeek    = iLow  (NULL,PERIOD_W1,0); 
   HiMonth    = iHigh (NULL,PERIOD_MN1,0);
   LoMonth    = iLow  (NULL,PERIOD_MN1,0); 
   TodayRange = ((HiToday - LoToday)/Point)/Factor; 
   WeekRange = ((HiWeek - LoWeek)/Point)/Factor; 
   MonthRange = ((HiMonth - LoMonth)/Point)/Factor; 
   
   //Range High/Low lines----------------------------------------------------------------------
      Ranges();
      DRangeAvg = NormalizeDouble(DARg/Daily_Range_Period,4);                
      WRangeAvg = NormalizeDouble(WARg/Weekly_Range_Period,4);                
      MRangeAvg = NormalizeDouble(MARg/Monthly_Range_Period,4);                
      DRangeHigh =  DRangeAvg + iLow(NULL,PERIOD_D1,TodayBar);
      DRangeLow  = -DRangeAvg + iHigh(NULL,PERIOD_D1,TodayBar);
      WRangeHigh =  WRangeAvg + iLow(NULL,PERIOD_W1,0);
      WRangeLow  = -WRangeAvg + iHigh(NULL,PERIOD_W1,0);
      MRangeHigh =  MRangeAvg + iLow(NULL,PERIOD_MN1,0);
      MRangeLow  = -MRangeAvg + iHigh(NULL,PERIOD_MN1,0);
      if (HiToday - LoToday > DRangeAvg)
         {            
         if (Bid >= HiToday- (HiToday-LoToday)/2) {DRangeHigh = LoToday + DRangeAvg; DRangeLow  = LoToday;}
         else {DRangeHigh  = HiToday; DRangeLow = HiToday - DRangeAvg;}
         }

      if (HiWeek - LoWeek > WRangeAvg)
         {            
         if (Bid >= HiWeek- (HiWeek-LoWeek)/2) {WRangeHigh = LoWeek + WRangeAvg; WRangeLow  = LoWeek;}
         else {WRangeHigh  = HiWeek; WRangeLow = HiWeek - WRangeAvg;}
         }

      if (HiMonth - LoMonth > MRangeAvg)
         {            
         if (Bid >= HiMonth- (HiMonth-LoMonth)/2) {MRangeHigh = LoMonth + MRangeAvg; MRangeLow  = LoMonth;}
         else {MRangeHigh  = HiMonth; MRangeLow = HiMonth - MRangeAvg;}
         }

//Comments        
      if (Show_Comments)
         {
         screeninfo = "";
         screeninfo = StringConcatenate(screeninfo, NL);
         screeninfo = StringConcatenate(screeninfo,"        | Avg | Curr | RoomUP | RoomDWN ", NL);
         screeninfo = StringConcatenate(screeninfo,"Daily   |",DoubleToStr((DRangeAvg/Point)/Factor,0)," | ",DoubleToStr(TodayRange,0)," | ",DoubleToStr(((MathAbs(DRangeHigh-Close[0]))/Point)/Factor,0)," | ",DoubleToStr(((MathAbs(DRangeLow-Close[0]))/Point)/Factor,0), NL);
         screeninfo = StringConcatenate(screeninfo,"Weekly  |",DoubleToStr((WRangeAvg/Point)/Factor,0)," | ",DoubleToStr(WeekRange,0)," | ",DoubleToStr(((MathAbs(WRangeHigh-Close[0]))/Point)/Factor,0)," | ",DoubleToStr(((MathAbs(WRangeLow-Close[0]))/Point)/Factor,0), NL);
         screeninfo = StringConcatenate(screeninfo,"Monthly |",DoubleToStr((MRangeAvg/Point)/Factor,0)," | ",DoubleToStr(MonthRange,0)," | ",DoubleToStr(((MathAbs(MRangeHigh-Close[0]))/Point)/Factor,0)," | ",DoubleToStr(((MathAbs(MRangeLow-Close[0]))/Point)/Factor,0), NL);
         Comment (screeninfo);
         }

             
      //Range Lines data to subroutine                                                             
   if (Daily_Range_On && Period()< 1440)
      {         
      DrawLines("D Range High", 1, DRangeHigh, DRangeHigh_Color, LineStyle, LineThickness);   
      DrawLines("D Range Low", 1, DRangeLow,  DRangeLow_Color, LineStyle, LineThickness);
      }
   if (Weekly_Range_On && Period()< 10080)
      {         
      DrawLines("W Range High", 2, WRangeHigh, WRangeHigh_Color, LineStyle, LineThickness);   
      DrawLines("W Range Low", 2, WRangeLow,  WRangeLow_Color, LineStyle, LineThickness);
      }
   if (Monthly_Range_On && Period()< 43200)
      {         
      DrawLines("M Range High", 3, MRangeHigh, MRangeHigh_Color, LineStyle, LineThickness);   
      DrawLines("M Range Low", 3, MRangeLow,  MRangeLow_Color, LineStyle, LineThickness);
      }
   
   //End Ranges
  
   //End of program computations---------------------------------------------------------------        
   return(0);
   }
//+-------------------------------------------------------------------------------------------+
//| Indicator Subroutine To Compute Average Ranges                                            |                                                 
//+-------------------------------------------------------------------------------------------+ 
void Ranges ()
   {
   int ii, iii, x, xx;
   //Add ranges over period.  Count number of Sundays and exclude Sunday ranges.         
   DARg = 0; for(i=1; i<=Daily_Range_Period; i++)
       {
       if (TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))!=0) {
       DARg = DARg + iHigh(NULL,PERIOD_D1,i)- iLow(NULL,PERIOD_D1,i);}
       else {x=x+1;}
       }
   //For number of Sundays, add additional days of range
   for(ii=i+1; ii<i+x+1; ii++) 
       {
       if (TimeDayOfWeek(iTime(NULL,PERIOD_D1,ii))!=0) {       
       DARg = DARg + iHigh(NULL,PERIOD_D1,ii)- iLow(NULL,PERIOD_D1,ii);}
       else {xx=xx+1;}       
       }      
   //If a Sunday reduced added days above, add additional day of range
   for(iii=ii+1; iii<ii+xx+1; iii++) 
       {
       DARg = DARg + iHigh(NULL,PERIOD_D1,iii)- iLow(NULL,PERIOD_D1,iii);
       }                     
   //Weekly ranges
   WARg = 0; for(i=1; i<=Weekly_Range_Period; i++)
       {
       WARg = WARg + iHigh(NULL,PERIOD_W1,i)- iLow(NULL,PERIOD_W1,i);
       }
   //Monthly ranges
   MARg = 0; for(i=1; i<=Monthly_Range_Period; i++)
       {
       MARg = MARg + iHigh(NULL,PERIOD_MN1,i)- iLow(NULL,PERIOD_MN1,i);
       }
  }
//+-------------------------------------------------------------------------------------------+
//| Subroutine To name and draw Range HL lines and line labels                |                                                                                  |
//+-------------------------------------------------------------------------------------------+
void DrawLines(string text, int Line_Selection_Number, double level, color Color, int linestyle, int thickness)
   {
   
   //Lines=====================================================================================  
   //Name lines 
   
   text = StringTrimLeft(text);       
   string line = PREF+text+" line";  //"[DWMRanges]  " + text + " Line";  

   //Define variables  
   a = linestyle; b = thickness; c =1; if (a==0)c=b;  
   //Where to Start lines
   if (Line_Selection_Number == 1) {startline = iTime(NULL, PERIOD_D1, 0);}
   else if(Line_Selection_Number == 2) {startline = iTime(NULL, PERIOD_W1, 0);}                  
   else if(Line_Selection_Number == 3) {startline = iTime(NULL, PERIOD_MN1, 0);}
                                                                   
   //Where to Stop Lines   
   stopline = Time[0]; R2 = true;
                       
   //Draw lines 
   if (ObjectFind(line) != 0)
      {
      ObjectCreate(line, OBJ_TREND, 0, startline, level, stopline, level);    
      ObjectSet(line, OBJPROP_STYLE, a);
      ObjectSet(line, OBJPROP_COLOR, Color);
      ObjectSet(line, OBJPROP_WIDTH, c);
      ObjectSet(line, OBJPROP_BACK, true); 
      ObjectSet(line, OBJPROP_RAY, R2);
      ObjectSet(line, OBJPROP_SELECTABLE, false);
      }
   else
      {
      ObjectMove(line, 0, startline, level);
      ObjectMove(line, 1, stopline, level);
      }
   
   //Labels===================================================================================
      //Name label       
      string linelabel = PREF+StringTrimLeft(text) + " Label";  //"[DWMRanges]  " + StringTrimLeft(text) + " Label";
        
      //Where to put labels                          
           
         if (Time[WindowFirstVisibleBar()] < iTime(NULL, PERIOD_D1, 0)) //start at day separator
            {
            spc="       "; //07                           
            startlabel= iTime(NULL, PERIOD_D1, 0);  
            }          
         else //start start mid chart     
            {
         spc = ""; //00  
         startlabel = Time[WindowFirstVisibleBar()/2];                         
            }                        
                                    
      //Draw labels                            
      if (ObjectFind(linelabel) != 0)
         {
         ObjectCreate(linelabel, OBJ_TEXT, 0, startlabel, level);     
         ObjectSetText(linelabel, spc + text +" ("+ DoubleToStr(((level-Close[0])/Point)/Factor,0)+" pts)", Range_Labels_FontSize, Range_Labels_FontStyle, Range_Labels_Color);
         ObjectSet(linelabel, OBJPROP_BACK, false);
         ObjectSet(linelabel, OBJPROP_SELECTABLE, false);
         }        
      else 
         {
         ObjectMove(linelabel, 0, startlabel, level);
         ObjectSetText(linelabel, spc + text +" ("+ DoubleToStr(((level-Close[0])/Point)/Factor,0)+" pts)", Range_Labels_FontSize, Range_Labels_FontStyle, Range_Labels_Color);
         }     
//      WindowRedraw();      
   }
//****************************************************************************
//***                 Custom indicator ChartEvent function                 ***
//****************************************************************************
bool tickCount=false;   string prevState="", newState="",  PrefBT = "w"+PREF+"Butt";   //sTFR+
//------
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)       
{
   if (id==CHARTEVENT_OBJECT_CLICK && sparam==PrefBT)
    {
     newState = getButtonState(PrefBT);   tickCount=true;  
     //---
     if (newState!=prevState)
     if (newState=="OFF")  { 
       Comment(""); ObjectsDeleteAll(0,PREF,-1,-1);  //InitZero();   
       prevState = newState; }  
     else { 
       if (tickCount) { start();  tickCount=false; }
       prevState = newState; }
     //---
     ObjectSetString(0,PrefBT,OBJPROP_TEXT,"DWMRanges "+newState);
    }
   //---
   //if (newState!="OFF" && id==CHARTEVENT_CHART_CHANGE)  { ChartSetInteger(0,CHART_FOREGROUND,0,false);  DrawHistoLine(); }   ChartRedraw();
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%                            AutoRefresh TT x5                         %%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bool DrawBUTTON(const string Name, const string Text)                
{ 
   if (buttColor==clrNONE || buttSize<5)  return(false);
   //---
   string objName = Name; //PREF+  //+(string)i;  //+TimeToStr(Time[i],TIME_MINUTES)+"_"+DoubleToStr(Close[i],DGTS);
   //--- пред-удаление обектов   
   ObjectDelete(0,objName);   
   //--- создадим кнопку 
   if (!ObjectCreate(0,objName,OBJ_BUTTON, 0, 0, 0)) return(false);
   //--- установим координаты кнопки 
   ObjectSetInteger(0,objName,OBJPROP_XDISTANCE, 5+axisX);          // координата по оси X 
   ObjectSetInteger(0,objName,OBJPROP_YDISTANCE, 5+axisY);          // координата по оси Y 
   ObjectSetInteger(0,objName,OBJPROP_XSIZE, buttSize*12.5);        // ширина кнопки   //133
   ObjectSetInteger(0,objName,OBJPROP_YSIZE, buttSize*2.0);         // высота кнопки    //33
   ObjectSetInteger(0,objName,OBJPROP_CORNER, CORNER_LEFT_UPPER);   // угол графика для привязки кнопки
   ObjectSetString(0,objName,OBJPROP_TEXT, Text);                   // текст 
   ObjectSetString(0,objName,OBJPROP_FONT, "Arial Black");          // шрифт 
   ObjectSetInteger(0,objName,OBJPROP_FONTSIZE, buttSize);          // размер шрифта 
   ObjectSetInteger(0,objName,OBJPROP_COLOR, buttColor);            // цвет текста 
   ObjectSetInteger(0,objName,OBJPROP_BGCOLOR, backColor);          // цвет фона    //C'236,233,216'
   ObjectSetInteger(0,objName,OBJPROP_BORDER_COLOR, clrNONE);       // цвет границы 
   ObjectSetInteger(0,objName,OBJPROP_BACK, false);                 // на заднем плане 
   ObjectSetInteger(0,objName,OBJPROP_SELECTABLE, false);           // кнопку можно выделить
   ObjectSetInteger(0,objName,OBJPROP_SELECTED, false);             // выделить для перемещений 
   ObjectSetInteger(0,objName,OBJPROP_HIDDEN, false);               // скрыт в списке объектов 
   ObjectSetInteger(0,objName,OBJPROP_ZORDER, 0);                   // приоритет на нажатие мышью 
   ObjectSetInteger(0,objName,OBJPROP_STATE, true);                 // кнопка нажата/отжата 
//--- успешное выполнение 
return(true); 
} 
//****************************************************************************
//***                              AL Aggressive                           ***
//****************************************************************************
string getButtonState(string Name)
{
   bool curState = ObjectGetInteger(0,Name,OBJPROP_STATE);
   if (curState)   return("ON");
   else            return("OFF");
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++                            Heiken Ashi PA                            +++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*void InitZero()
{
   ArrayInitialize(wkUP,0.0);     ArrayInitialize(wkDN,0.0);
   ArrayInitialize(bdUP,0.0);     ArrayInitialize(bdDN,0.0);
   //---
  //for (int i=0; i<Bars-1; i++)  ObjectDelete(0,PREF+"day"+(string)i);   //ObjectsDeleteAll(0,PREF,-1,-1);  
}*/
//₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽
//₽₽₽                             CCI 4TF w NRP                            ₽₽₽
//₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽₽
//+-------------------------------------------------------------------------------------------+
//| Indicator End                                                                             |                                                        
//+-------------------------------------------------------------------------------------------+    