//+------------------------------------------------------------------+
//|     xADR v1.1  
//|     xecret modified by Totowah  
//|                                                                  
//|     v1.0 Nov/22/14 v1.0 
//|      - Added Spread,  Pair, Timeframe, WarningColor
//|     v1.1 Dec/08/14 v1.1 
//|      - ADR calculated over 10 days to save mem & CPU
//+------------------------------------------------------------------+
#property copyright "xecret + totowah"
#property indicator_chart_window

extern int     StartingHour      =0;
extern bool    ExcludeSundayData =true;
extern double  RoomLimitRatio    =0.2;
extern color   TradeableColor    =Lime;
extern color   UntradeableColor  =Red;
extern color   WarningColor      =Orange;
extern color   OtherColor        =White;
extern int     DisplayC          =3;
extern int     DisplayX          =-200;
extern int     DisplayY          =1;
extern string  FontType          ="Arial Black";
extern int     FontSize          =10;
int            ATR1_Prd=5,ATR2_Prd=25;
double point;
int    LastBars0=0;
int    DisplayCorner;
int    x,y;

//+------------------------------------------------------------------+
//|  INIT                                                            |
//+------------------------------------------------------------------+
int init()
  {
   point=Point;
   if(Digits==3 || Digits==5) point=point*10;

   //if(DisplayPosition==0) {DisplayCorner=0;x=0;y=0;} else {DisplayCorner=2;x=-215;y=1;}
   DisplayCorner=DisplayC;x=DisplayX;y=DisplayY;

   ObjectCreate("xADR2",OBJ_LABEL,0,0,0);  //"Y="+adr1+"  ADR="+adr+"  5d="+adr5+"  10d="+adr10+"  20d="+adr20;
   ObjectSet("xADR2",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR2",OBJPROP_XDISTANCE,215+x);
   ObjectSet("xADR2",OBJPROP_YDISTANCE,y);

   ObjectCreate("xADR3",OBJ_LABEL,0,0,0);
   ObjectSet("xADR3",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR3",OBJPROP_XDISTANCE,215+x);
   ObjectSet("xADR3",OBJPROP_YDISTANCE,25+y);

   ObjectCreate("xADR4",OBJ_LABEL,0,0,0);
   ObjectSet("xADR4",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR4",OBJPROP_XDISTANCE,300+x);
   ObjectSet("xADR4",OBJPROP_YDISTANCE,25+y);

   ObjectCreate("xADR5",OBJ_LABEL,0,0,0);  // Spread
   ObjectSet("xADR5",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR5",OBJPROP_XDISTANCE,390+x);
   ObjectSet("xADR5",OBJPROP_YDISTANCE,25+y);
   
   ObjectCreate("xADR6",OBJ_LABEL,0,0,0);  // First line Symbol()
   ObjectSet("xADR6",OBJPROP_CORNER,DisplayCorner);
   ObjectSet("xADR6",OBJPROP_XDISTANCE,215+x);
   ObjectSet("xADR6",OBJPROP_YDISTANCE,50+y);
   return(0);
  }
  
//+------------------------------------------------------------------+
//| DEINIT                                                           |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete("xADR1");ObjectDelete("xADR2");ObjectDelete("xADR3");ObjectDelete("xADR4");ObjectDelete("xADR5");ObjectDelete("xADR6");
   return(0);
  }
  
//+------------------------------------------------------------------+
//| START                                                            |
//+------------------------------------------------------------------+
int start()
  {
   string text; color Color;
   
   text=+Symbol();
   if (Period() == 15) text=text+" M15"; else if (Period()==60) text=text+" H1" ;
   ObjectSetText("xADR6",text,FontSize,FontType,OtherColor);
   
   int Bars0=Bars;
   if(Bars0>LastBars0)
     {
     
 // ATR Calculation
      int atr1,atr2;
      atr1=MathRound(iATR(NULL,0,ATR1_Prd,1)/point);
      atr2=MathRound(iATR(NULL,0,ATR2_Prd,1)/point);
      text="ATR" + ATR1_Prd + "=" + atr1 + "  ATR" + ATR2_Prd + "=" + atr2;
      if(atr1<atr2) Color=UntradeableColor; else Color=TradeableColor;
      ObjectSetText("xADR1",text,FontSize,FontType,Color);




 // ADR Calculation
      int n=1;
      static int adr1,adr5,adr10,adr;
      double s=0.0;
      if(StartingHour!=0)
        {
         bool Today= true;
         int shift = 0;
         int CurrentHour=TimeHour(Time[0]);
         double avgdr=0;
         double highest=-1; // low enough number, lower than any possible price
         double lowest=1000000000; // large enough number, higher than any possible price

         for(int rng=0; rng<=10; rng++)
           {
            double Range=0;

            while(rng<=20)
              {
               if(CurrentHour == 0)
                  CurrentHour = 24;

               // find highest, lowest //
               if(iHigh(Symbol(),PERIOD_H1,shift)>highest)
                  highest=iHigh(Symbol(),PERIOD_H1,shift);
               if(iLow(Symbol(),PERIOD_H1,shift)<lowest)
                  lowest=iLow(Symbol(),PERIOD_H1,shift);

               shift++;

               if(CurrentHour==StartingHour)
                 {
                  Range=highest-lowest;

                  if(Today)
                    {
                     Today=false;
                    }
                  else
                    {
                     avgdr+=Range;
                    }

                  highest=-1; // low enough number, lower than any possible price
                  lowest=1000000000; // large enough number, higher than any possible price
                                     // one day down //
                  CurrentHour--;
                  break;
                 }
               CurrentHour--;
              }
            s=avgdr/Point;
            if(rng==1)
               adr1=  MathRound(s)/10;
            if(rng == 5)
               adr5=  MathRound(s/5)/10;
            if(rng == 10)
               adr10=MathRound(s/10)/10;
            // if(rng==20)  adr20=MathRound(s/20)/10;   // 10 jours
           }// end for(int rng=1;rng<=20;rng++)
         adr=MathRound((adr1+adr5+adr10)/3.0);
        }// end if(StartingHour != 0)
      else
        {
         for(int i=1;i<=10;i++)
           {
            while(ExcludeSundayData && TimeDayOfWeek(iTime(NULL,PERIOD_D1,n))==0) n++;
            s=s+(iHigh(NULL,PERIOD_D1,n)-iLow(NULL,PERIOD_D1,n))/point;
            if(i==1) adr1=MathRound(s);
            if(i==5) adr5=MathRound(s/5);
            if(i==10) adr10=MathRound(s/10);
            //if(i==20) adr20=MathRound(s/20);
            n++;
           }
         adr=MathRound((adr1+adr5+adr10)/3.0);
        }
      text="Y="+adr1+"  ADR="+adr+"  5d="+adr5+"  10d="+adr10;
      if(adr<90) Color=WarningColor; else Color=OtherColor;
      ObjectSetText("xADR2",text,FontSize,FontType,Color);
      LastBars0=Bars0;
     }

//Today's Range and Room============================================  
   int RmUp,RmDn,RmLmt;
   
   double low0  =  iLow(NULL,PERIOD_D1,0);
   double high0 =  iHigh(NULL,PERIOD_D1,0);
   if(StartingHour!=0)
     {
         shift = 0;
         CurrentHour=TimeHour(Time[0]);
         avgdr=0;
         highest=-1; // low enough number, lower than any possible price
         lowest=1000000000; // large enough number, higher than any possible price

         for(rng=0; rng<1; rng++)
           {
            Range=0;

            while(rng<1)
              {
               if(CurrentHour == 0)
                  CurrentHour = 24;

               // find highest, lowest //
               if(iHigh(Symbol(),PERIOD_H1,shift)>highest)
                  highest=iHigh(Symbol(),PERIOD_H1,shift);
               if(iLow(Symbol(),PERIOD_H1,shift)<lowest)
                  lowest=iLow(Symbol(),PERIOD_H1,shift);

               shift++;

               if(CurrentHour==StartingHour)
                 {
                  double TodayHigh= highest;
                  double TodayLow = lowest;
                  break;
                 }
               CurrentHour--;
              }
           }// end for(int rng=0;rng<1;rng++)
      low0=TodayLow;
      high0=TodayHigh;
     }

 // RmUP & RmDW calculation
   RmUp =  MathRound(adr - (Bid - low0)/point);
   RmDn =  MathRound(adr - (high0 - Bid)/point);
   RmLmt=  MathRound(adr*RoomLimitRatio);    
   text="RmUp:"+RmUp;
   if(RmUp<RmLmt) Color=UntradeableColor; else Color=TradeableColor;
   ObjectSetText("xADR3",text,FontSize,FontType,Color);
   text="RmDn:"+RmDn;
   if(RmDn<RmLmt) Color=UntradeableColor; else Color=TradeableColor;
   ObjectSetText("xADR4",text,FontSize,FontType,Color);


 // SPREAD calculation
   double spread = (Ask - Bid)/point;
   if(spread<1) Color=TradeableColor; 
      else if(spread>1.5) Color=UntradeableColor; 
            else Color=WarningColor;
   text="S="+spread;
   ObjectSetText("xADR5",text,FontSize,FontType,Color);

   return(0);
  }
//+------------------------------------------------------------------+
