//+------------------------------------------------------------------+ //| CCI_OnStepChannel.mq4 | //| CCI on StepChannel v1.00 Copyright 2015, fxborg | //| http://fxborg-labo.hateblo.jp/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, fxborg" #property link "http://fxborg-labo.hateblo.jp/" #property version "1.00" //--- #property indicator_separate_window #property indicator_buffers 3 #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_HISTOGRAM #property indicator_type3 DRAW_HISTOGRAM #property indicator_level1 -80.0 #property indicator_level2 80.0 #property indicator_levelcolor clrSilver #property indicator_levelstyle STYLE_DOT //--- #property indicator_color1 DarkGray #property indicator_color2 DodgerBlue #property indicator_color3 DeepPink #property indicator_label1 "CCI" #property indicator_label2 "CCI Upper" #property indicator_label3 "CCI Lower" #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_style1 STYLE_SOLID #property indicator_style2 STYLE_SOLID #property indicator_style3 STYLE_SOLID //--- input parameters input string Description1="--- Step Channel Settings---"; input double InpScaleFactor=2.25; // Scale factor input int InpMaPeriod=3; // Smooth Period input int InpVolatilityPeriod=70; // Volatility Period input string Description2="--- CCI Settings ---"; input int InpCCIPeriod=32; // CCI Period //--- int InpFastPeriod=(int)MathRound(InpVolatilityPeriod/7); // Fast Period int InpMode=2; // 1:Simple Mode 2:hybrid Mode ENUM_MA_METHOD InpMaMethod=MODE_SMMA; // Ma Method //---- will be used as indicator buffers double UpperBuffer[]; double MiddleBuffer[]; double LowerBuffer[]; //--- double UpperMaBuffer[]; double MiddleMaBuffer[]; double LowerMaBuffer[]; //--- double CCI_Buffer[]; double CCI_H_Buffer[]; double CCI_L_Buffer[]; double PriceBuffer[]; double BaseBuffer[]; //--- double HighBuffer[]; double LowBuffer[]; double CloseBuffer[]; double StdDevBuffer[]; //---- 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+InpVolatilityPeriod+InpMaPeriod+InpMaPeriod+1+InpCCIPeriod+1; //--- indicator buffers mapping IndicatorBuffers(14); //--- indicator buffers SetIndexBuffer(0,CCI_Buffer); SetIndexBuffer(1,CCI_H_Buffer); SetIndexBuffer(2,CCI_L_Buffer); SetIndexBuffer(3,UpperMaBuffer); SetIndexBuffer(4,MiddleMaBuffer); SetIndexBuffer(5,LowerMaBuffer); SetIndexBuffer(6,UpperBuffer); SetIndexBuffer(7,MiddleBuffer); SetIndexBuffer(8,LowerBuffer); SetIndexBuffer(9,HighBuffer); SetIndexBuffer(10,LowBuffer); SetIndexBuffer(11,CloseBuffer); SetIndexBuffer(12,StdDevBuffer); SetIndexBuffer(13,PriceBuffer); //--- SetIndexEmptyValue(0,EMPTY_VALUE); SetIndexEmptyValue(1,EMPTY_VALUE); SetIndexEmptyValue(2,EMPTY_VALUE); SetIndexEmptyValue(3,0); SetIndexEmptyValue(4,0); SetIndexEmptyValue(5,0); SetIndexEmptyValue(6,0); SetIndexEmptyValue(7,0); SetIndexEmptyValue(8,0); SetIndexEmptyValue(9,0); SetIndexEmptyValue(10,0); SetIndexEmptyValue(11,0); SetIndexEmptyValue(12,0); SetIndexEmptyValue(13,0); //--- SetIndexDrawBegin(0,min_rates_total); SetIndexDrawBegin(1,min_rates_total); SetIndexDrawBegin(2,min_rates_total); //--- string short_name="CCI on Step Channel (" +IntegerToString(InpCCIPeriod)+"," +IntegerToString(InpScaleFactor)+"," +IntegerToString(InpMaPeriod)+"," +IntegerToString(InpVolatilityPeriod)+")"; 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(CCI_Buffer,false); ArraySetAsSeries(CCI_H_Buffer,false); ArraySetAsSeries(CCI_L_Buffer,false); 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); ArraySetAsSeries(StdDevBuffer,false); ArraySetAsSeries(PriceBuffer,false); ArraySetAsSeries(BaseBuffer,false); //--- rate data ArraySetAsSeries(high,false); ArraySetAsSeries(low,false); ArraySetAsSeries(close,false); ArraySetAsSeries(time,false); //+----------------------------------------------------+ //| Set StdDev Buffeer | //+----------------------------------------------------+ first=InpFastPeriod+1-1; if(first+1min_rates_total*2 && MiddleBuffer[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/2CCI_Buffer[i]) CCI_L_Buffer[i]=CCI_Buffer[i]; } //---- return(rates_total); } //+----------------------------------------------------+ //| random func | //+----------------------------------------------------+ bool random(int x) { int ran=MathRand(); bool res=(MathMod(ran,x)==0); return(res); } //+------------------------------------------------------------------+