#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 SpringGreen
#property indicator_color2 OrangeRed
#property indicator_color3 White
extern double ChannelWidth=0.5;
extern double HoursLookBack=4.0;
double RangeUP[], RangeDOWN[], AvRange[];
double RangeFactor=0;
int currday,cnt,lookback;
double TodaysLow;
double TodaysHigh;
int init()
{
lookback = (HoursLookBack*60)/Period();
SetIndexStyle(0,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(0,RangeUP);
SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(1,RangeDOWN);
SetIndexStyle(2,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(2,AvRange);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
Comment("Lookback hours = ",HoursLookBack,", Bars = ",lookback, " Channel width ratio = ",ChannelWidth);
int counted_bars = IndicatorCounted();
if(counted_bars < 0)
return(-1);
if(counted_bars > 0)
counted_bars--;
int limit = Bars - counted_bars-200;
for(cnt = 0; cnt < limit ; cnt++)
{
currday=MathFloor(cnt*Period()/1440);
//if(TimeDay(Time[cnt]) != TimeDay(Time[cnt+1]))
//{
double Range1=Range(1);
double Range5=Range(5);
double Range10=Range(10);
double Range20=Range(20);
double AverageRange=(Range1+Range5+Range10+Range20)/4;
RangeFactor=AverageRange*ChannelWidth;
RangeFactor=NormalizeDouble(RangeFactor,Digits);
//}
TodaysLow=Low[iLowest(NULL,0,MODE_LOW,lookback,cnt)];
TodaysHigh=High[iHighest(NULL,0,MODE_HIGH,lookback,cnt)];
RangeUP[cnt] = TodaysLow + RangeFactor;
RangeDOWN[cnt] = TodaysHigh - RangeFactor;
AvRange[cnt] = ((TodaysLow + RangeFactor)+(TodaysHigh - RangeFactor))/2;
}
}
//+------------------------------------------------------------------+
double Range (int Days)
{
double DailyHigh,DailyLow,DailyRange,TotalRange,AR=0;
for (int i=1;i<=Days;i++)
{
int WeekDay=TimeDayOfWeek(iTime(NULL, PERIOD_D1,i+currday));
if (WeekDay != 0 || WeekDay != 6)
{
DailyHigh=iHigh(Symbol(),PERIOD_D1,i+currday);
DailyLow=iLow(Symbol(),PERIOD_D1,i+currday);
DailyRange=(DailyHigh-DailyLow);
TotalRange=TotalRange+DailyRange;
}
else
{
Days=Days+1;
}
}
AR=TotalRange/Days;
AR=NormalizeDouble(AR,Digits);
return(AR);
}
Comments