//+------------------------------------------------------------------+ //| SnR.mq4 | //| Support & Registance Copyright 2017, fxborg | //| http://fxborg-labo.hateblo.jp/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, fxborg" #property link "http://fxborg-labo.hateblo.jp/" #property version "1.0" #property strict #property indicator_chart_window #property indicator_buffers 3 #property indicator_plots 2 //--- plot Label1 #property indicator_type1 DRAW_ARROW #property indicator_color1 clrRed #property indicator_width1 1 #property indicator_type2 DRAW_ARROW #property indicator_color2 clrDodgerBlue #property indicator_width2 1 input double InpSize1=0.4; // Damashi Size input double InpSize2=1.0; // Modoshi Size input double InpSize3=2.0; // Minimum Range Size input double InpSize4=6.0; // Maximum Range Size input int InpPeriod=30; // Channel Period input int InpLookBack=120; // LookBack double SUP[]; double REG[]; double ATR[]; int AtrPeriod=50; double AtrAlpha=2.0/(AtrPeriod+1.0); //--- #define WK_BUFF_SZ 8 #define WK_H 0 #define WK_L 1 #define WK_C 2 #define WK_UP 3 #define WK_DN 4 #define WK_UP2 5 #define WK_DN2 6 #define WK_FLG 7 //--- double wk[][WK_BUFF_SZ]; //--- //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { SetIndexBuffer(0,REG); SetIndexBuffer(1,SUP); SetIndexBuffer(2,ATR); SetIndexArrow(0,158); SetIndexArrow(1,158); SetIndexEmptyValue(0,EMPTY_VALUE); SetIndexEmptyValue(1,EMPTY_VALUE); SetIndexEmptyValue(2,0.0); //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| De-initialization | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| 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[]) { if(ArrayGetAsSeries(SUP))ArraySetAsSeries(SUP,false); if(ArrayGetAsSeries(REG))ArraySetAsSeries(REG,false); if(ArrayGetAsSeries(ATR))ArraySetAsSeries(ATR,false); if(ArrayGetAsSeries(close))ArraySetAsSeries(close,false); if(ArrayGetAsSeries(open))ArraySetAsSeries(open,false); if(ArrayGetAsSeries(high))ArraySetAsSeries(high,false); if(ArrayGetAsSeries(low))ArraySetAsSeries(low,false); //--- if(ArrayRange(wk,0)!=rates_total)ArrayResize(wk,rates_total); else return (rates_total); //--- if(prev_calculated==0) { ArrayInitialize(ATR,0.0); } //--- for(int i=(int)MathMax(prev_calculated-1,0); i up2) { wk[r][WK_UP2] = h0;} if(l0 < dn2) { wk[r][WK_DN2] = l0;} //+-------------------------------------------------+ //| expand //+-------------------------------------------------+ if(flg==-1.0 && c0>dn2+size2) { wk[r][WK_FLG]=0.0; if(up-dn2>size4) { if(dn-dn2>size3 && dn>fmax(h0,c1)) { wk[r][WK_UP]=dn; wk[r][WK_UP2]=dn; } else { double y=h0; for(int j=0;jy) y=wk[r-j][WK_H]; if(upsize2 && wk[r-j][WK_H]size4) { if(up2-up>size3 && upy)break; if(up2-y>size2 && wk[r-j][WK_L]>y+size2) { wk[r][WK_DN]=y; wk[r][WK_DN2]=y; break; } } } } wk[r][WK_UP]=up2; } if(up-dn>(max0-min0)*2.0) { wk[r][WK_UP]=max0; wk[r][WK_UP2]=max0; wk[r][WK_DN]=min0; wk[r][WK_DN2]=min0; } if(h0>up+size1) { wk[r][WK_FLG] = 1.0; } if(l0