//+------------------------------------------------------------------+ //| SnR_TL.mq5 | //| SnR_TL Copyright 2016, fxborg | //| http://fxborg-labo.hateblo.jp/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, fxborg" #property link "http://fxborg-labo.hateblo.jp/" #property version "1.00" #property indicator_chart_window #property indicator_buffers 12 #property indicator_plots 4 #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 #property indicator_type3 DRAW_ARROW #property indicator_color3 clrRed #property indicator_width3 2 #property indicator_type4 DRAW_ARROW #property indicator_color4 clrDodgerBlue #property indicator_width4 2 #property indicator_type5 DRAW_ZIGZAG #property indicator_color5 clrBlue #property indicator_width5 2 int WinNo=ChartWindowFind(); //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ input string Settings1="SnR Settings"; input double InpSize1=0.4; // Damashi Size input double InpSize2=1.0; // Modoshi Size input double InpSize3=1.8; // Minimum Range Size input double InpSize4=6.0; // Maximum Range Size input int InpPeriod=30; // Channel Period input int InpLookBack=120; // LookBack input string Settings2="ZigZag Settings"; input int InpDepth=3; // Depth input double InpZZSize=1.0; // ZigZag Size input string Settings3="TL Settings"; input int InpTLPeriod1=50; // TL Period1(min) input int InpTLPeriod2=200; // TL Period2(max) input int InpTLSpan=10; // TL Span double wk1[][8]; double wk2[][9]; double HI[]; double LO[]; double ZZUP[]; double ZZDN[]; double BTM[]; double TOP[]; double TOP_BK[]; double BTM_BK[]; double SUP[]; double REG[]; double SUP2[]; double REG2[]; double ATR[]; double LATR[]; int AtrPeriod=36; double AtrAlpha=2.0/(AtrPeriod+1.0); int LAtrPeriod=50; double LAtrAlpha=2.0/(AtrPeriod+1.0); //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { ObjectDeleteByName("SnR_Trend"); SetIndexBuffer(0,REG,INDICATOR_DATA); SetIndexBuffer(1,SUP,INDICATOR_DATA); SetIndexBuffer(2,TOP,INDICATOR_DATA); SetIndexBuffer(3,BTM,INDICATOR_DATA); SetIndexBuffer(4,ZZUP,INDICATOR_DATA); SetIndexBuffer(5,ZZDN,INDICATOR_DATA); SetIndexBuffer(6,ATR,INDICATOR_DATA); SetIndexBuffer(7,LATR,INDICATOR_DATA); SetIndexBuffer(8,TOP_BK,INDICATOR_DATA); SetIndexBuffer(9,BTM_BK,INDICATOR_DATA); SetIndexBuffer(10,HI,INDICATOR_DATA); SetIndexBuffer(11,LO,INDICATOR_DATA); PlotIndexSetInteger(0,PLOT_ARROW,158); PlotIndexSetInteger(1,PLOT_ARROW,158); PlotIndexSetInteger(2,PLOT_ARROW,217); PlotIndexSetInteger(3,PLOT_ARROW,218); PlotIndexSetInteger(2,PLOT_ARROW_SHIFT,-20); PlotIndexSetInteger(3,PLOT_ARROW_SHIFT,20); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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[]) { for(int i=(int)MathMax(prev_calculated-1,0); isize1)TOP_BK[i]=0; if(SUP[i-1]-SUP[i]>size1)BTM_BK[i]=0; if(i<=100)continue; //--- //--- if(dir==0 || up_i==0 || dn_i==0)continue; //--- bool isTop=false; bool isBtm=false; //--- if(dir==-1) { if(TOP_BK[i]!=1) { int imax=ArrayMaximum(high,dn_i,i-dn_i-1); if(high[imax]==REG[i]) { TOP[up_i]=high[up_i]; TOP_BK[i]=1; isTop=true; } } } else if(dir==1) { if(BTM_BK[i]!=1) { int imin=ArrayMinimum(low,up_i,i-up_i-1); if(low[imin]==SUP[i]) { BTM[dn_i]=close[dn_i]; BTM_BK[i]=1; isBtm=true; } } } if(fmin(dn_i,up_i)<=InpTLPeriod2)continue; if(isBtm) calcTL(high,low,close,time,dn_i); if(isTop) calcTL(high,low,close,time,up_i); } //--- return(rates_total); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void calcTL(const double &hi[],const double &lo[],const double &cl[],const datetime &t[],const int i) { double fits[][4]; lm(cl,fits,i,InpTLPeriod1,InpTLPeriod2,InpTLSpan); double rslt[][2]; double stdv[][3]; optimize(hi,lo,fits,rslt,stdv,i); int sz=ArraySize(rslt)/2; double min= rslt[sz-1][1]; int best=sz-1; for(int j=sz-1;j>=0;j--) { double tmp= rslt[j][1]; if(tmp=fabs(my-lo[x0-x])); double y =isH ? hi[x0-x]:lo[x0-x]; double diff= y-my; double err2=fabs(diff); //--- if(err2>rslt[i][0])rslt[i][0]=err2; rslt[i][1]+=err2; } } } //--- for(int i=0;iwk2[r][UP]) { wk2[r][UP]=h0; wk2[r][iUP]=r; } if(r-wk2[r][iUP]>=depth && wk2[r][UP]-h0>size) { int iup=(int)wk2[r][iUP]; zup[iup]=wk2[r][UP]; wk2[r][iUP2]=iup; wk2[r][DN]=l0; wk2[r][iDN]=r; wk2[r][DIR]=-1.0; } } else if(wk2[r][DIR]==-1.0) { if(l0=depth && l0-wk2[r][DN]>size) { int idn=(int)wk2[r][iDN]; zdn[idn]=wk2[r][DN]; wk2[r][iDN2]=idn; wk2[r][UP]=l0; wk2[r][iUP]=r; wk2[r][DIR]=1.0; } } dir=(int)wk2[r][DIR]; up_i=(int)wk2[r][iUP2]; dn_i=(int)wk2[r][iDN2]; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void calcSnR(double ®[],double &sup[],double h0,double l0,double c0,double max0,double min0, double size1,double size2,double size3,double size4,int period,int lookback,int r,int bars) { int H=0; int L=1; int C=2; int UP=3; int DN=4; int UP2=5; int DN2=6; int FLG=7; if(ArrayRange(wk1,0)!=bars) ArrayResize(wk1,bars); wk1[r][H]=h0; wk1[r][L]=l0; wk1[r][C]=c0; if(r<=period+1) { wk1[r][FLG]=0.0; wk1[r][UP ]=max0; wk1[r][DN ]=min0; wk1[r][UP2]=max0; wk1[r][DN2]=min0; } else { wk1[r][FLG]=wk1[r-1][FLG]; wk1[r][UP ]=wk1[r-1][UP ]; wk1[r][DN ]=wk1[r-1][DN ]; wk1[r][UP2]=wk1[r-1][UP2]; wk1[r][DN2]=wk1[r-1][DN2]; } int back=fmin(lookback,r-1); double c1=wk1[r-1][C]; double flg=wk1[r][FLG]; double up = wk1[r][UP]; double dn = wk1[r][DN]; double up2 = wk1[r][UP2]; double dn2 = wk1[r][DN2]; //+-------------------------------------------------+ //| update range //+-------------------------------------------------+ if(h0 > up2) { wk1[r][UP2] = h0;} if(l0 < dn2) { wk1[r][DN2] = l0;} //+-------------------------------------------------+ //| expand //+-------------------------------------------------+ if(flg==-1.0 && c0>dn2+size2) { wk1[r][FLG]=0.0; if(up-dn2>size4) { if(dn-dn2>size3 && dn>fmax(h0,c1)) { wk1[r][UP]=dn; wk1[r][UP2]=dn; } else { double y=h0; for(int j=0;jy) y=wk1[r-j][H]; if(upsize2 && wk1[r-j][H]size4) { if(up2-up>size3 && upy)break; if(up2-y>size2 && wk1[r-j][L]>y+size2) { wk1[r][DN]=y; wk1[r][DN2]=y; break; } } } } wk1[r][UP]=up2; } if(up-dn>(max0-min0)*2.0) { wk1[r][UP]=max0; wk1[r][UP2]=max0; wk1[r][DN]=min0; wk1[r][DN2]=min0; } if(h0>up+size1) { wk1[r][FLG] = 1.0; } if(l0=0; i--) { string objName=ObjectName(0,i); if(StringSubstr(objName,0,length)==prefix) { ObjectDelete(0,objName); } } } //+------------------------------------------------------------------+