//+------------------------------------------------------------------+ //| Volatility_Step_Channel.mq4 | //| Volatility Step Channel v1.01 Copyright 2015, fxborg | //| http://fxborg-labo.hateblo.jp/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, fxborg" #property link "http://fxborg-labo.hateblo.jp/" #property version "1.01" //--- #property indicator_chart_window #property indicator_buffers 3 #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_type3 DRAW_LINE //--- #property indicator_color1 DarkGray #property indicator_color2 DarkGray #property indicator_color3 DeepPink //--- #property indicator_label1 "Upper Channel" #property indicator_label2 "Lower Channel" #property indicator_label3 "Median Line" //--- #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 2 //--- #property indicator_style1 STYLE_DASH #property indicator_style2 STYLE_DASH #property indicator_style3 STYLE_SOLID //--- input parameters input double InpScaleFactor=2.0; // Scale factor input int InpMaPeriod=3; // Smooth Period input string Description1="--- For BaseVolatility Indicator ---"; input int InpFastPeriod=10; // Fast Period input int InpSlowPeriod=70; // Slow Period input ENUM_MA_METHOD InpMaMethod=MODE_SMMA; // Ma Method input string Description2="--- 1:Simple Mode 2:hybrid Mode ---"; input int InpMode=2; // 1:Simple Mode 2:hybrid Mode //---- will be used as indicator buffers double UpperBuffer[]; double MiddleBuffer[]; double LowerBuffer[]; //--- double UpperMaBuffer[]; double MiddleMaBuffer[]; double LowerMaBuffer[]; //--- double HighBuffer[]; double LowBuffer[]; double CloseBuffer[]; //---- declaration of global variables int min_rates_total; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- Initialization of variables of data calculation starting point min_rates_total=1+InpFastPeriod+InpSlowPeriod+InpMaPeriod+InpMaPeriod+1; //--- indicator buffers mapping IndicatorBuffers(9); //--- indicator buffers SetIndexBuffer(0,UpperMaBuffer); SetIndexBuffer(1,LowerMaBuffer); SetIndexBuffer(2,MiddleMaBuffer); SetIndexBuffer(3,UpperBuffer); SetIndexBuffer(4,LowerBuffer); SetIndexBuffer(5,MiddleBuffer); SetIndexBuffer(6,HighBuffer); SetIndexBuffer(7,LowBuffer); SetIndexBuffer(8,CloseBuffer); //--- SetIndexEmptyValue(0,0); SetIndexEmptyValue(1,0); SetIndexEmptyValue(2,0); SetIndexEmptyValue(3,0); SetIndexEmptyValue(4,0); SetIndexEmptyValue(5,0); SetIndexEmptyValue(6,0); SetIndexEmptyValue(7,0); SetIndexEmptyValue(8,0); SetIndexDrawBegin(0,min_rates_total); SetIndexDrawBegin(1,min_rates_total); SetIndexDrawBegin(2,min_rates_total); SetIndexDrawBegin(3,min_rates_total); SetIndexDrawBegin(4,min_rates_total); SetIndexDrawBegin(5,min_rates_total); SetIndexDrawBegin(6,min_rates_total); SetIndexDrawBegin(7,min_rates_total); SetIndexDrawBegin(8,min_rates_total); //--- string short_name="Volatility Step Channel v1.01(" +IntegerToString(InpScaleFactor)+","+IntegerToString(InpMaPeriod)+"," +IntegerToString(InpSlowPeriod)+","+IntegerToString(InpFastPeriod)+"," +IntegerToString(InpMode)+")"; IndicatorShortName(short_name); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int i,j,first; //--- check for bars count if(rates_total<=min_rates_total) return(0); //--- MathSrand(int(TimeLocal())); //--- indicator buffers ArraySetAsSeries(UpperMaBuffer,false); ArraySetAsSeries(LowerMaBuffer,false); ArraySetAsSeries(MiddleMaBuffer,false); ArraySetAsSeries(UpperBuffer,false); ArraySetAsSeries(LowerBuffer,false); ArraySetAsSeries(MiddleBuffer,false); ArraySetAsSeries(HighBuffer,false); ArraySetAsSeries(LowBuffer,false); ArraySetAsSeries(CloseBuffer,false); //--- rate data ArraySetAsSeries(high,false); ArraySetAsSeries(low,false); ArraySetAsSeries(close,false); ArraySetAsSeries(time,false); //+----------------------------------------------------+ //|Set High Low Buffeer | //+----------------------------------------------------+ first=InpMaPeriod+InpMaPeriod+1; if(first+1min_rates_total*2 && UpperBuffer[i]!=0) continue; double h,l,c,hsum=0.0,lsum=0.0,csum=0.0; //--- for(j=0;jHighBuffer[i-1]) HighBuffer[i]=h; else if(h+baseLowBuffer[i-1]) LowBuffer[i]=l-base; else LowBuffer[i]=LowBuffer[i-1]; //--- if((c-base/2)>CloseBuffer[i-1]) CloseBuffer[i]=c-base/2; else if(c+base/2HighBuffer[i-1]) HighBuffer[i]=h; else if(h+baseLowBuffer[i-1]) LowBuffer[i]=l-base; else LowBuffer[i]=LowBuffer[i-1]; //--- if((c-base)>CloseBuffer[i-1]) CloseBuffer[i]=c-base; else if(c+base