//+------------------------------------------------------------------------------------------------------------------+ #property description "[!!!-MT4 X-XARDg-ARRZZ]" #define Version "[XARDg-ARRZZ]" //+------------------------------------------------------------------------------------------------------------------+ #property link "https://forex-station.com/viewtopic.php?p=1295409935#p1295409935" #property description "THIS IS A FREE INDICATOR" #property description " " #property description "Welcome to the World of Forex" #property description "Let light shine out of darkness and illuminate your world" #property description "and with this freedom leave behind your cave of denial" #property indicator_chart_window #property indicator_buffers 8 //+------------------------------------------------------------------------------------------------------------------+ int SR = 3, SRZZ = 60, MainRZZ = 60, FP = 60,//21, SMF = 3, PriceConst = 0; // 0 - Close // 1 - Open // 2 - High // 3 - Low // 4 - (H+L)/2 // 5 - (H+L+C)/3 // 6 - (H+L+2*C)/4 bool DrawZZ = false; //+------------------------------------------------------------------------------------------------------------------+ double Lmt[],LZZ[],SA[],SM[],Up[],Dn[],pUp[],pDn[]; //+------------------------------------------------------------------------------------------------------------------+ int LTF[6]={0,0,0,0,0,0},STF[5]={0,0,0,0,0}; int MaxBar, nSBZZ, nLBZZ, SBZZ, LBZZ; bool First=true; int prevBars=0; //+------------------------------------------------------------------------------------------------------------------+ void MainCalculation(int Pos) { if((Bars-Pos)>(SR+1)) SACalc(Pos); else SA[Pos]=0; if((Bars-Pos)>(FP+SR+2)) SMCalc(Pos); else SM[Pos]=0; return; } //+------------------------------------------------------------------------------------------------------------------+ void SACalc(int Pos){ int sw,i,w,ww,Shift; double sum; switch(PriceConst){ case 0: SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_CLOSE,Pos); break; case 1: SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_OPEN,Pos); break; case 4: SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_MEDIAN,Pos); break; case 5: SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_TYPICAL,Pos); break; case 6: SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_WEIGHTED,Pos); break; default: SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_OPEN,Pos); break;} for(Shift=Pos+SR+2;Shift>Pos;Shift--){sum=0.0; sw=0; i=0; w=Shift+SR; ww=Shift-SR; if(ww=Shift){i++; sum=sum+i*SnakePrice(w); sw=sw+i; w--;} while(w>=ww){i--; sum=sum+i*SnakePrice(w); sw=sw+i; w--;} SA[Shift]=sum/sw;} return;} //+------------------------------------------------------------------------------------------------------------------+ double SnakePrice(int Shift){ switch(PriceConst){ case 0: return(Close[Shift]); case 1: return(Open[Shift]); case 4: return((High[Shift]+Low[Shift])/2); case 5: return((Close[Shift]+High[Shift]+Low[Shift])/3); case 6: return((2*Close[Shift]+High[Shift]+Low[Shift])/4); default: return(Open[Shift]);}} //+------------------------------------------------------------------------------------------------------------------+ void SMCalc(int i) { double t, b; for(int Shift=i+SR+2;Shift>=i;Shift--){ t=SA[ArrayMaximum(SA,FP,Shift)]; b=SA[ArrayMinimum(SA,FP,Shift)]; SM[Shift]=(2*(2+SMF)*SA[Shift]-(t+b))/2/(1+SMF);} return;} //+------------------------------------------------------------------------------------------------------------------+ void LZZCalc(int Pos){int i,RBar,LBar,ZZ,NZZ,NZig,NZag; i=Pos-1; NZig=0; NZag=0; while(iPos){if(SM[i]>SM[Pos]){if(ZZ==1){ if(i>=Pos+MainRZZ && NZZ<5){NZZ++; LTF[NZZ]=i;} NZag=i; LZZ[i]=SM[i];}} else { if(ZZ==-1) { if(i>=Pos+MainRZZ && NZZ<5){NZZ++; LTF[NZZ]=i;} NZig=i; LZZ[i]=SM[i];}}} while(i=Pos+MainRZZ && NZZ<5) LTF[NZZ]=i; LZZ[NZig]=0; LZZ[i]=SM[i]; NZig=i;} if(ZZ==1){if(i>=Pos+MainRZZ && NZZ<5){NZZ++; LTF[NZZ]=i;} LZZ[i]=SM[i]; ZZ=-1; NZig=i;}} if(i==ArrayMaximum(SM,LBar-RBar+1,RBar)){ if(ZZ==1 && SM[i]>SM[NZag]){ if(i>=Pos+MainRZZ && NZZ<5) LTF[NZZ]=i; LZZ[NZag]=0; LZZ[i]=SM[i]; NZag=i;} if(ZZ==-1){if(i>=Pos+MainRZZ && NZZ<5){NZZ++; LTF[NZZ]=i;} LZZ[i]=SM[i]; ZZ=1; NZag=i;}} i++; if(i>MaxBar) return;} nLBZZ=Bars-LTF[5]; LZZ[Pos]=SM[Pos]; return;} //+------------------------------------------------------------------------------------------------------------------+ void SZZCalc(int Pos){int i,RBar,LBar,ZZ,NZZ,NZig,NZag; i=Pos-1; NZig=0; NZag=0; while(i<=LBZZ && ZZ==0){i++; pDn[i]=0; pUp[i]=0; Dn[i]=0; Up[i]=0; Lmt[i]=0; RBar=i-SRZZ; if(RBarPos){if(SM[i]>SM[Pos]){if(ZZ==1){ if(i>=Pos+SRZZ && NZZ<4){NZZ++; STF[NZZ]=i;} NZag=i; Dn[i-1]=Open[i-1];}} else { if(ZZ==-1){if(i>=Pos+SRZZ && NZZ<4){NZZ++; STF[NZZ]=i;} NZig=i; Up[i-1]=Open[i-1];}}} while(i<=LBZZ || NZZ<4){pDn[i]=0; pUp[i]=0; Dn[i]=0; Up[i]=0; Lmt[i]=0; RBar=i-SRZZ; if(RBar=Pos+SRZZ && NZZ<4) STF[NZZ]=i; Up[NZig-1]=0; Up[i-1]=Open[i-1]; NZig=i;} if(ZZ==1){if(i>=Pos+SRZZ && NZZ<4){NZZ++; STF[NZZ]=i;} Up[i-1]=Open[i-1]; ZZ=-1; NZig=i;}} if(i==ArrayMaximum(SM,LBar-RBar+1,RBar)){ if(ZZ==1 && SM[i]>SM[NZag]){ if(i>=Pos+SRZZ && NZZ<4) STF[NZZ]=i; Dn[NZag-1]=0; Dn[i-1]=Open[i-1]; NZag=i;} if(ZZ==-1){if(i>=Pos+SRZZ && NZZ<4){NZZ++; STF[NZZ]=i;} Dn[i-1]=Open[i-1]; ZZ=1; NZag=i;}} i++; if(i>LBZZ) return;} nSBZZ=Bars-STF[4]; return;} //+------------------------------------------------------------------------------------------------------------------+ void ArrCalc(){int i,j,k,n,z=0; double p; i=LBZZ; while(LZZ[i]==0) i--; j=i; p=LZZ[i]; i--; while(LZZ[i]==0) i--; if(LZZ[i]>p) z=1; if(LZZ[i]>0 && LZZ[i]0){if(LZZ[i]>p){z=-1; p=LZZ[i];} if(LZZ[i]>0 && LZZ[i]0 && Dn[i]>0){Lmt[i]=Open[i]; Dn[i]=0;} if(z<0 && Up[i]>0){Lmt[i]=Open[i]; Up[i]=0;} if(z>0 && Up[i]>0){if(i>1){j=i-1; k=j-SRZZ+1; if(k<0) k=0; n=j; while(n>=k && Dn[n]==0){pUp[n]=Up[i]; pDn[n]=0; n--;}} if(i==1) pUp[0]=Up[i];} if(z<0 && Dn[i]>0){if(i>1){j=i-1; k=j-SRZZ+1; if(k<0) k=0; n=j; while(n>=k && Up[n]==0){pDn[n]=Dn[i]; pUp[n]=0; n--;}} if(i==1) pDn[0]=Dn[i];} i--;} return; } //+------------------------------------------------------------------------------------------------------------------+ void deinit(){return;} //+------------------------------------------------------------------------------------------------------------------+ int init(){IndicatorBuffers(8); if(Period()>=PERIOD_H4){SRZZ=15;} SetIndexBuffer(0,Lmt); SetIndexStyle(0,DRAW_ARROW,0,5,clrSnow); SetIndexArrow(0,167); SetIndexEmptyValue(0,0.0); SetIndexBuffer(1,LZZ); if(DrawZZ){ SetIndexStyle(1,DRAW_SECTION,0,3,clrBlack); SetIndexEmptyValue(1,0.0);} else SetIndexStyle(1,DRAW_NONE); SetIndexBuffer(2,SA); SetIndexStyle(2,DRAW_NONE); SetIndexBuffer(3,SM); SetIndexStyle(3,DRAW_NONE); SetIndexBuffer(4,Up); SetIndexStyle(4,DRAW_ARROW,0,2,clrBlue); SetIndexArrow(4,233); SetIndexEmptyValue(4,0.0); SetIndexBuffer(5,Dn); SetIndexStyle(5,DRAW_ARROW,0,2,clrRed); SetIndexArrow(5,234); SetIndexEmptyValue(5,0.0); SetIndexBuffer(6,pUp); SetIndexStyle(6,DRAW_ARROW,0,1,clrDeepSkyBlue); SetIndexArrow(6,110); SetIndexEmptyValue(6,0.0); SetIndexBuffer(7,pDn); SetIndexStyle(7,DRAW_ARROW,0,1,clrViolet); SetIndexArrow(7,110); SetIndexEmptyValue(7,0.0); return(0);} //+------------------------------------------------------------------------------------------------------------------+ int start(){int counted_bars=IndicatorCounted(); int limit,i; if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; if(First==true){ if(SR<2) SR=2; if(Bars<=2*(MainRZZ+FP+SR+2)) return(-1); if(SRZZ<=SR) SRZZ=SR+1; MaxBar=Bars-(MainRZZ+FP+SR+2); LBZZ=MaxBar; SBZZ=LBZZ; prevBars=Bars; First=false;} limit=Bars-counted_bars; for(i=limit;i>=0;i--){MainCalculation(i);} if(prevBars!=Bars){SBZZ=Bars-nSBZZ; LBZZ=Bars-nLBZZ; prevBars=Bars;} SZZCalc(0); LZZCalc(0); ArrCalc(); return(0);}//EOF //+------------------------------------------------------------------------------------------------------------------+