//+------------------------------------------------------------------+
//|                                                          AvgRg.mq4 |
//|                                   Copyright © 2012, ericjschroed |
//+------------------------------------------------------------------+


#property copyright "Copyright ericjschroed"
//#property link "http://www.metaquotes.net"

#property indicator_chart_window
//#property indicator_buffers 1
//#property indicator_color1 EMPTY

extern int     PeriodToUse = PERIOD_D1;
extern int     NumberOfPeriods = 14;
extern color   LineTargetColor  = DodgerBlue;
extern color   LineExceededColor  = Blue;
extern color   TextColor  = White;
extern int     ShiftLabel = 7;
extern bool    Show.Comment = false;
extern bool    FullScreenLines = false;
extern string  FSL = "If False, lines start at current bar";
extern int     DayStartHour = 0;
extern string  DSH1 = "If chart Day does not start at 000";
color LineColor;

//double ExtMapBuffer1[];
string Period_Text, LineLabel, AvgRgLine, PeriodTxt;
int    LineType;
int multiplier;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
   PeriodTxt = tf2txt(PeriodToUse);
//   if(Digits == 2 || Digits == 4) multiplier = 1;
//   if(Digits == 3 || Digits == 5) multiplier = 10;

//   IndicatorBuffers(1);
//   SetIndexStyle(0,DRAW_ARROW);
//   SetIndexArrow(0,159);
//   SetIndexBuffer(0, ExtMapBuffer1);

   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
   DeleteLines();
   Comment("");
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
   //---- exit if period is greater than hourly charts
   if(Period() > PeriodToUse)
   {
//      Print("Error - Chart period is greater than ",PeriodToUse);
      return(-1); // then exit
   }

   double AvgRange = 0;

   for(int i = 1; i <= NumberOfPeriods; i++)
      AvgRange = AvgRange + (iHigh(NULL, PeriodToUse, i) - iLow(NULL, PeriodToUse, i));

   AvgRange = AvgRange / NumberOfPeriods;

   double AvgRgHigh, AvgRgLow;
   double low0 = iLow(NULL, PeriodToUse, 0);
   double high0 = iHigh(NULL, PeriodToUse, 0);
   double TodaysRange = high0 - low0;
//      int StartOfDay = iBarShift(NULL, 0, iTime(NULL, PERIOD_D1, iBarShift(NULL, PERIOD_D1, Time[i], false)), false);
//      double low0 = iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, StartOfDay, 0));
//      double high0 = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, StartOfDay, 0));
   AvgRgHigh = NormalizeDouble(low0 + AvgRange, Digits);
   AvgRgLow =  NormalizeDouble(high0 - AvgRange, Digits);
   if(Show.Comment)
   {
//      Comment("Previous ",Period_Text,"s High= ",prior_high,"   Previous ",Period_Text,"s AvgRange= ",nP,"\nPrevious ",Period_Text,"s Low= ",prior_low,"    Current ",Period_Text,"s AvgRange= ",nD,"\nPrevious ",Period_Text,"s Close= ",prior_close);
//      Comment("Range1= ",Range1,"\nRAvg= ",RAvg,"\n(Range1 - RAvg) / RAvg = ",RangePercent ,"\nPercentADR/100= ",PercentADR/100);
   }
   
   if(FullScreenLines)
      LineType = OBJ_HLINE;
   else
      LineType = OBJ_TREND;
      
   //---- Set line labels on chart window

   if(TodaysRange > AvgRange)
      LineColor = LineExceededColor;
   else
      LineColor = LineTargetColor;

   string HighName = "AvgRg"+PeriodTxt+"High";
   string LowName = "AvgRg"+PeriodTxt+"Low";
   string HighText = HighName+": "+DoubleToStr(AvgRgHigh,Digits);
   string LowText = LowName+": "+DoubleToStr(AvgRgLow,Digits);
   string HighLabel = HighName+" Label";
   string LowLabel = LowName+" Label";

   DrawLine(HighLabel, HighText, HighName, LineType, LineColor, AvgRgHigh, TodaysRange, AvgRange);
   DrawLine(LowLabel, LowText, LowName, LineType, LineColor, AvgRgLow, TodaysRange, AvgRange);
   //---- End Of Program
   return(0);
}

//+-------------------------------------------------------------------------------------------+
//| Subroutine to draw lines and labels                                |                                                                                  |
//+-------------------------------------------------------------------------------------------+

void DrawLine(string LineLabel, string LineText, string AvgRgLine, int LineType, color LineColor, double LinePrice, double TodaysRange, double AvgRange)
   {
      if(ObjectFind(LineLabel) != 0)
      {
         ObjectCreate(LineLabel, OBJ_TEXT, 0, Time[0]+Period()*60*ShiftLabel, LinePrice);
         ObjectSetText(LineLabel, LineText, 8, "Arial", TextColor);
      }
      else
      {
         ObjectMove(LineLabel, 0, Time[0]+Period()*60*ShiftLabel, LinePrice);
         ObjectSetText(LineLabel, LineText, 8, "Arial", TextColor);
      }

   int Style, Width;
   if(TodaysRange > AvgRange)
   {
      Style = STYLE_SOLID;
      Width = 2;
   }
   else
   {
      Style = STYLE_DOT;
      Width = 1;
   }
      if(ObjectFind(AvgRgLine) != 0)
      {
         ObjectCreate(AvgRgLine, LineType, 0, Time[1], LinePrice, Time[0], LinePrice);
         ObjectSet(AvgRgLine, OBJPROP_STYLE, Style);
         ObjectSet(AvgRgLine, OBJPROP_COLOR, LineColor);
         ObjectSet(AvgRgLine, OBJPROP_WIDTH, Width);
//         ObjectSet(AvgRgLine, OBJPROP_RAY, true);
      }
      else
      {
         ObjectMove(AvgRgLine, 0, Time[1], LinePrice);
         ObjectMove(AvgRgLine, 1, Time[0], LinePrice);
      }
   }
//---------------------------------------------------------
string tf2txt(int tf)
{
   if (tf == PERIOD_M1)
      return("M1");
   if (tf == PERIOD_M5)    
      return("M5");
   if (tf == PERIOD_M15)   
      return("M15");
   if (tf == PERIOD_H1)    
      return("H1");
   if (tf == PERIOD_H4)    
      return("H4");
   if (tf == PERIOD_D1)    
      return("D1");  
   if (tf == PERIOD_W1)    
      return("W1");  
   if (tf == PERIOD_MN1)
      return("MN1");
   if (tf == PERIOD_M30)    
      return("M30"); 
   
   return("??");
}
  
//---------------------------------------------------------
void DeleteLines(){

  int    obj_total=ObjectsTotal();
  string ObjName;
  
  for(int i = ObjectsTotal() - 1; i > -1; i--)
    {
         
     ObjName=ObjectName(i); 
     if (StringFind(ObjName,"AvgRg",0) == 0) ObjectDelete(ObjName);
    }
}
//+------------------------------------------------------------------+

