AverageRangeLines_v1.6

Author: Copyright 2020, NickBixy
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
AverageRangeLines_v1.6
//+------------------------------------------------------------------+
//|                                            AverageRange_v1.4.mq4 |
//|                                         Copyright 2020, NickBixy |
//|             https://www.forexfactory.com/showthread.php?t=904734 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, NickBixy"
#property link      "https://www.forexfactory.com/showthread.php?t=904734"
//#property version   "1.00"
#property strict
#property indicator_chart_window

enum pipPointChoice
  {
   Pips,//Pips
   Points,//Points
  };

enum yesnoChoiceToggle
  {
   No,
   Yes
  };

input string adrHeader="-----------------Average Range Settings------------------------------------------";//----- Average Range Settings
input ENUM_TIMEFRAMES timeFrame=PERIOD_D1;//TimeFrame
input yesnoChoiceToggle useShortLines=Yes;//Draw Short Lines
input int Line_Length=15;//Length of Short Line

input int period=14;//Period
input string lineLabelHeader="-----------------Line/Label Customize  Settings------------------------------------------";//----- Line/Label Customize  Settings
input string Font="Arial";//Font
input int labelFontSize=8;//Font Size
input int ShiftLabel=10;//Label Shift +move right -move left
input string highHeader="High Line/Label Customize--------------------------------------------";//----- High Line/Label Customize
input string customHighMSG="ADR High";//High Label custom MSG
input ENUM_LINE_STYLE highLineStyle=STYLE_DOT;//High Line Style
input int highLineWidth=1;//High Line Width
input color highLineClr=clrOrange;//High Line Color
input color highLabelClr=clrOrange;//High Label Color
input string lowHeader="Low Line/Label Customize--------------------------------------------";//----- Low Line/Label Customize
input string customLowMSG="ADR Low";//Low Label custom MSG
input ENUM_LINE_STYLE lowLineStyle=STYLE_DOT;//Low Line Style
input int lowLineWidth=1;//Low Line Width
input color lowLineClr=clrOrange;//Low Line Color
input color lowLabelClr=clrOrange;//Low Label Color
string indiName="ARL"+" "+EnumToString(timeFrame)+" "+(string)period;

//+------------------------------------------------------------------+
int OnInit()
  {
   if(period<1)
     {
      Alert("Period can't be less than 1");
     }
   ObjectsDeleteAll(0,indiName,0,OBJ_TREND) ;
   ObjectsDeleteAll(0,indiName,0,OBJ_TEXT) ;
   indiName="ARL"+" "+EnumToString(timeFrame)+" "+(string)period;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void deinit()
  {
   ObjectsDeleteAll(0,indiName,0,OBJ_TREND) ;
   ObjectsDeleteAll(0,indiName,0,OBJ_TEXT) ;
  }
//+------------------------------------------------------------------+
int start()
  {
   DrawRangeLines();
   return 0;
  }
//+------------------------------------------------------------------+
void DrawRangeLines()
  {


   string highMSG="";
   string lowMSG="";

   highMSG=customHighMSG;
   lowMSG=customLowMSG;



//HIGH Range Line
   string highLine=indiName+" High";
   if(ObjectFind(highLine) != 0)
     {
      if(useShortLines==Yes)
        {
         ObjectCreate(highLine, OBJ_TREND, 0, Time[1]+Period()*60, GetAverageRangeHigh(), Time[0]+Period()*60*Line_Length, GetAverageRangeHigh());
         ObjectSet(highLine,OBJPROP_RAY,false);
        }
      else
        {
         ObjectCreate(highLine,OBJ_TREND,0,iTime(NULL,timeFrame,0),GetAverageRangeHigh(),Time[0]+Period()*60,GetAverageRangeHigh());
         ObjectSet(highLine,OBJPROP_RAY,true);
        }

      ObjectSet(highLine,OBJPROP_COLOR,highLineClr);
      ObjectSet(highLine,OBJPROP_STYLE,highLineStyle);
      ObjectSet(highLine,OBJPROP_WIDTH,highLineWidth);
      ObjectSet(highLine,OBJPROP_BACK,true);
      ObjectSet(highLine,OBJPROP_SELECTED,false);
      ObjectSet(highLine,OBJPROP_SELECTABLE,false);

     }
   else
     {
      if(useShortLines==Yes)
        {
         ObjectSet(highLine,OBJPROP_RAY,false);
         ObjectMove(highLine, 0, Time[1]+Period()*60, GetAverageRangeHigh());
         ObjectMove(highLine, 1, Time[0]+Period()*60*Line_Length, GetAverageRangeHigh());
        }
      else
        {
         ObjectSet(highLine,OBJPROP_RAY,true);
         ObjectMove(highLine,0,iTime(NULL,timeFrame,0),GetAverageRangeHigh());
         ObjectMove(highLine,1,Time[0]+Period()*60,GetAverageRangeHigh());
        }

     }

//LOW Range Line
   string lowLine=indiName+" LOW";

   if(ObjectFind(lowLine) != 0)
     {
      if(useShortLines==Yes)
        {
         ObjectCreate(lowLine, OBJ_TREND, 0, Time[1]+Period()*60, GetAverageRangeLow(), Time[0]+Period()*60*Line_Length, GetAverageRangeLow());
         ObjectSet(lowLine,OBJPROP_RAY,false);
        }
      else
        {
         ObjectCreate(lowLine,OBJ_TREND,0,iTime(NULL,timeFrame,0),GetAverageRangeLow(),Time[0]+Period()*60,GetAverageRangeLow());
         ObjectSet(lowLine,OBJPROP_RAY,true);
        }
      ObjectSet(lowLine,OBJPROP_COLOR,lowLineClr);
      ObjectSet(lowLine,OBJPROP_STYLE,lowLineStyle);
      ObjectSet(lowLine,OBJPROP_WIDTH,lowLineWidth);
      ObjectSet(lowLine,OBJPROP_BACK,true);
      ObjectSet(lowLine,OBJPROP_SELECTED,false);
      ObjectSet(lowLine,OBJPROP_SELECTABLE,false);


     }
   else
     {
      if(useShortLines==Yes)
        {
         ObjectSet(lowLine,OBJPROP_RAY,false);
         ObjectMove(lowLine, 0, Time[1]+Period()*60, GetAverageRangeLow());
         ObjectMove(lowLine, 1, Time[0]+Period()*60*Line_Length, GetAverageRangeLow());
        }
      else
        {
         ObjectSet(lowLine,OBJPROP_RAY,true);
         ObjectMove(lowLine,0,iTime(NULL,timeFrame,0),GetAverageRangeLow());
         ObjectMove(lowLine,1,Time[0]+Period()*60,GetAverageRangeLow());
        }

     }
///////////////////////////////////////////////////////////
//HIGH Range LABEL
   string highLabel=indiName+" HighLabel";

   if(ObjectFind(highLabel) != 0)
     {
      ObjectCreate(highLabel,OBJ_TEXT,0,Time[0]+Period()*60*ShiftLabel,GetAverageRangeHigh());
      ObjectSetText(highLabel,highMSG,labelFontSize,Font,highLabelClr);
      ObjectSet(highLabel,OBJPROP_BACK,true);
      ObjectSet(highLabel,OBJPROP_SELECTED,false);
      ObjectSet(highLabel,OBJPROP_SELECTABLE,false);
     }
   else
     {
      ObjectMove(highLabel, 0,Time[0]+Period()*60*ShiftLabel,GetAverageRangeHigh());
      ObjectSetText(highLabel,highMSG,labelFontSize,Font,highLabelClr);
     }

//LOW Range LABEL
   string lowLabel=indiName+" LowLabel";

   if(ObjectFind(lowLabel) != 0)
     {
      ObjectCreate(lowLabel,OBJ_TEXT,0,Time[0]+Period()*60*ShiftLabel,GetAverageRangeLow());
      ObjectSetText(lowLabel,lowMSG,labelFontSize,Font,lowLabelClr);
      ObjectSet(lowLabel,OBJPROP_BACK,true);
      ObjectSet(lowLabel,OBJPROP_SELECTED,false);
      ObjectSet(lowLabel,OBJPROP_SELECTABLE,false);
     }
   else
     {
      ObjectMove(lowLabel, 0,Time[0]+Period()*60*ShiftLabel,GetAverageRangeLow());
      ObjectSetText(lowLabel,lowMSG,labelFontSize,Font,lowLabelClr);
     }
   ChartRedraw(0);
  }
//+------------------------------------------------------------------+
double GetBidAverageRangeDistancePipsPoints(double rangeValue)
  {
   double value=0;
   double bid=MarketInfo(NULL,MODE_BID);
   double points=MarketInfo(NULL,MODE_POINT);

   if(rangeValue!=0 && rangeValue!=NULL && bid!=0 && bid!=NULL)
     {
      value=(rangeValue-bid)/points;
     }





   return value;
  }
//+------------------------------------------------------------------+
double GetAverageRangeRatioPipsPoints()
  {
   double value=0;

   double todayRange=GetTodayRangePipsPoints();
   double averageRangeNumPeriods=GetAverageRangeNumPeriodsPipsPoints();

   if((todayRange!=0 && todayRange!=NULL) && (averageRangeNumPeriods!=0 && averageRangeNumPeriods!=NULL))
     {
      value=(todayRange/averageRangeNumPeriods)*100;
     }



   return value;
  }
//+------------------------------------------------------------------+
int PipsToPointFactor()
  {
   int point=1;

   if(Digits==5 || Digits==3)
     {
      point=10; //1 pip to 10 point if 5 digit
     } //Check whether it's a 5 digit broker (3 digits for Yen)
   else
      if(Digits==4 || Digits==2)
        {
         point=1; //1 pip to 1 point if 4 digit
        }
      else
         if(Digits==1)
           {
            point=1;
           }

   return(point);
  }
//+------------------------------------------------------------------+
double GetAverageRangeNumPeriodsPipsPoints()
  {
   double value=GetAverageRangeNumPeriods();
   double points=MarketInfo(NULL,MODE_POINT);

   if(value!=0 && value!=NULL && points!=0 && points!=NULL)
     {
      value=value/points;
     }





   return value;
  }
//+------------------------------------------------------------------+
double GetTodayRangePipsPoints()
  {
   double value=0;
   double points=MarketInfo(NULL,MODE_POINT);
   double high=iHigh(NULL,timeFrame,0);
   double low=iLow(NULL,timeFrame,0);
   value=MathAbs(high-low);

   if(value!=0 && value!=NULL && points!=0 && points!=NULL)
     {
      value=value/points;
     }






   return value;
  }
//+------------------------------------------------------------------+
double GetAverageRangeNumPeriods()
  {
   double result=0;
   double averageRange=0;
   for(int i=1; i<=period; i++)
     {

      if(timeFrame==PERIOD_D1)
        {
         datetime dayCheck1=iTime(NULL,PERIOD_D1,i);
         if(TimeDayOfWeek(dayCheck1) == 0)//found sunday
           {
            continue;
           }

         datetime dayCheck2=iTime(NULL,PERIOD_D1,i);
         if(TimeDayOfWeek(dayCheck2) == 6)//found saturday
           {
            continue;
           }
        }

      double high=iHigh(NULL,timeFrame,i);
      double low=iLow(NULL,timeFrame,i);
      averageRange+=high-low;
     }
   return result=averageRange/period;
  }
//+------------------------------------------------------------------+
double GetTimeFrameHighestHigh()
  {
   return iHigh(NULL,timeFrame,0);
  }
//+------------------------------------------------------------------+
double GetTimeFrameLowestLow()
  {
   return iLow(NULL,timeFrame,0);
  }
//+------------------------------------------------------------------+
double GetAverageRangeHigh()
  {
   double todayHigh=iHigh(NULL,timeFrame,0);
   double todayLow=iLow(NULL,timeFrame,0);

   double rangeHigh=GetTimeFrameLowestLow()+GetAverageRangeNumPeriods();;

   double averageRange=GetAverageRangeNumPeriods();

   if(todayHigh - todayLow > averageRange)
     {
      if(MarketInfo(NULL,MODE_BID) >= todayHigh- (todayHigh-todayLow)/2)
        {
         rangeHigh = todayLow + averageRange;

        }
      else
        {
         rangeHigh  = todayHigh;
        }
     }

   return rangeHigh;
  }
//+------------------------------------------------------------------+
double GetAverageRangeLow()
  {
   double todayHigh=iHigh(NULL,timeFrame,0);
   double todayLow=iLow(NULL,timeFrame,0);

   double rangeLow=GetTimeFrameHighestHigh()-GetAverageRangeNumPeriods();

   double averageRange=GetAverageRangeNumPeriods();

   if(todayHigh - todayLow > averageRange)
     {
      if(MarketInfo(NULL,MODE_BID) >= todayHigh- (todayHigh-todayLow)/2)
        {
         rangeLow  = todayLow;
        }
      else
        {
         rangeLow = todayHigh - averageRange;
        }
     }

   return rangeLow;
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---