//+------------------------------------------------------------------+ //| ArrZZx2.mq4 | //| Copyright © 2008 Kirill, 2007 Bookkeeper| //| StockProgrammer@mail.ru, yuzefovich@gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008 Kirill, 2007 Bookkeeper" #property link "StockProgrammer@mail.ru, yuzefovich@gmail.com" //---- #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 1 #property indicator_buffers 8 #property indicator_color1 MediumBlue #property indicator_color2 RoyalBlue #property indicator_color3 Blue #property indicator_color4 Blue #property indicator_color5 DarkGreen #property indicator_color6 Red #property indicator_color7 DarkGreen #property indicator_color8 Red //-------------------------------------------------------------------- extern int period = 0; //ïåðèîä äëÿ ðàñ÷¸òà. Íå ìîæåò áûòü ìåíüøå ïåðèîäà ãðàôèêà. extern int SR = 3; // =3..4 extern int SRZZ = 12; // =4..12..20 extern int MainRZZ = 20; // =12..20..54... extern int FP = 21; extern int SMF = 3; // =1..5 extern bool DrawZZ = false; extern int 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 //extern string Prefix="ArrZZx2"; //-------------------------------------------------------------------- double Lmt[]; double LZZ[]; double SA[]; double SM[]; double Up[]; double Dn[]; double pUp[]; double pDn[]; string name; //--------------------------------------------------------------------- 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 2: SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_HIGH,Pos); break; case 3: SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_LOW,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<Pos) ww=Pos; while(w>=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 2: return(High[Shift]); case 3: return(Low[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(i<MaxBar && ZZ==0) { i++; LZZ[i]=0; RBar=i-MainRZZ; if(RBar<Pos) RBar=Pos; LBar=i+MainRZZ; if(i==ArrayMinimum(SM,LBar-RBar+1,RBar)) { ZZ=-1; NZig=i; } if(i==ArrayMaximum(SM,LBar-RBar+1,RBar)) { ZZ=1;NZag=i; } } if(ZZ==0) return; NZZ=0; if(i>Pos) { 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<LBZZ || NZZ<5) { LZZ[i]=0; RBar=i-MainRZZ; if(RBar<Pos) RBar=Pos; LBar=i+MainRZZ; if(i==ArrayMinimum(SM,LBar-RBar+1,RBar)) { if(ZZ==-1 && SM[i]<SM[NZig]) { if(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(RBar<Pos) RBar=Pos; LBar=i+SRZZ; if(i==ArrayMinimum(SM,LBar-RBar+1,RBar)) { ZZ=-1; NZig=i; } if(i==ArrayMaximum(SM,LBar-RBar+1,RBar)) { ZZ=1; NZag=i; } } if(ZZ==0) return; NZZ=0; if(i>Pos) { if(SM[i]>SM[Pos]) { if(ZZ==1) { if(i>=Pos+SRZZ && NZZ<4) { NZZ++; STF[NZZ]=i; } NZag=i; Dn[i-1]=1; } } else { if(ZZ==-1) { if(i>=Pos+SRZZ && NZZ<4) { NZZ++; STF[NZZ]=i; } NZig=i; Up[i-1]=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) RBar=Pos; LBar=i+SRZZ; if(i==ArrayMinimum(SM,LBar-RBar+1,RBar)) { if(ZZ==-1 && SM[i]<SM[NZig]) { if(i>=Pos+SRZZ && NZZ<4) STF[NZZ]=i; Up[NZig-1]=0; Up[i-1]=1; NZig=i; } if(ZZ==1) { if(i>=Pos+SRZZ && NZZ<4) { NZZ++; STF[NZZ]=i; } Up[i-1]=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]=1; NZag=i; } if(ZZ==-1) { if(i>=Pos+SRZZ && NZZ<4) { NZZ++; STF[NZZ]=i; } Dn[i-1]=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, b; 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]<p) z=-1; p=LZZ[j]; i=j-1; while(i>0) { if(LZZ[i]>p) { z=-1; p=LZZ[i]; } if(LZZ[i]>0 && LZZ[i]<p) { z=1; p=LZZ[i]; } if(z>0 && Dn[i]>0) { Lmt[i]=1; Dn[i]=0; } if(z<0 && Up[i]>0) { Lmt[i]=1; 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() { name = WindowExpertName(); IndicatorBuffers(8); SetIndexBuffer(0,Lmt); SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,2); SetIndexEmptyValue(0,0.0); SetIndexBuffer(1,LZZ); if(DrawZZ) { SetIndexStyle(1,DRAW_SECTION,EMPTY,2); 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_HISTOGRAM,EMPTY,1); SetIndexArrow(4,233); SetIndexEmptyValue(4,0.0); SetIndexBuffer(5,Dn); SetIndexStyle(5,DRAW_HISTOGRAM,EMPTY,1); SetIndexArrow(5,234); SetIndexEmptyValue(5,0.0); SetIndexBuffer(6,pUp); SetIndexStyle(6,DRAW_HISTOGRAM); SetIndexArrow(6,217); SetIndexEmptyValue(6,0.0); SetIndexBuffer(7,pDn); SetIndexStyle(7,DRAW_HISTOGRAM); SetIndexArrow(7,218); SetIndexEmptyValue(7,0.0); return(0); } //--------------------------------------------------------------------- bool alertflag = 0; int start() { int counted_bars; int limit,i,j,n; IndicatorShortName("ArrZZx2 period: "+DoubleToStr(period, 0)); if(period == Period() || period == 0) { alertflag = 0; counted_bars=IndicatorCounted(); 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); } else if(period < Period() && period != 0) { if(alertflag == 0) {Alert("Parameter \"period\" is less than period of current graph. Please enter different period"); alertflag = 1;} return(0); } else //òóò íà÷èíàåòñÿ ÌÎÇà ! { alertflag = 0; double pos; int Pos; double tab = period /Period(); //ñêîëüêî áàðîâ ìëàäøåãî ÒÔ ñîäåðæàòñÿ â îäíîì áàðå ñòàðøåãî ÒÔ. int popr_coeff = 0; int error = 0; datetime period_time_0; static datetime recount = 0; static bool recount_flag = 0; period_time_0 = iTime(NULL, period, 0); error=GetLastError(); if(recount==0 && error==4066) { Alert("Error 4066: Data for period = ", period, " not loaded. Loading data... Indicator will be totally recounted in 1 minute."); recount = TimeCurrent() + 60; } else if(recount>0 && TimeCurrent()>recount) { Alert("Processing total recalculation of indicator."); recount = 0; recount_flag = 1; } else if(recount_flag == 2) { recount_flag = 0; Alert("Data for period = ", period, " loaded. Indicator recalculated totally."); } datetime diff = Time[0] - iTime(NULL, period, 0); //ðàñ÷èòûâàåì ñìåùåíèå 0-áàðà òåê. òô îòí. 0-áàðà òô period double delta = MathRound((diff/60)/Period()) + 1; //ñêîëüêî áàðîâ òåê. òô óæå åñòü (âêëþ÷àÿ òåê. áàð) â 0-áàðå òô period counted_bars=IndicatorCounted(); if(recount_flag == 1) { counted_bars = 1; recount_flag = 2; } //---- check for possible errors if(counted_bars<0) return(-1); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; pos=0; while(pos<=Bars-counted_bars-1) { int m = MathFloor((pos + popr_coeff - delta)/tab) + 1; Pos = MathRound(pos); //ôîðìàëüíîñòü if(Time[Pos] < iTime(NULL, period, m)) {popr_coeff++; continue;} //íà ñëó÷. ñóáá. è âîñêð. (òàì ïðîïàäàåò îäèí áàð H1) [êîíòðîëü ñëåâà] if(m>=1 && Time[Pos] >= iTime(NULL, period, m-1)) {popr_coeff--; continue;} //íà ñëó÷. ñóáá. è âîñêð. (òàì ïðîïàäàåò îäèí áàð H1) [êîíòðîëü ñïðàâà] Lmt[Pos] = iCustom(NULL, period, name, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 0, m); LZZ[Pos] = iCustom(NULL, period, name, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 1, m); SA[Pos] = iCustom(NULL, period, name, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 2, m); SM[Pos] = iCustom(NULL, period, name, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 3, m); Up[Pos] = iCustom(NULL, period, name, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 4, m); Dn[Pos] = iCustom(NULL, period, name, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 5, m); pUp[Pos] = iCustom(NULL, period, name, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 6, m); pDn[Pos] = iCustom(NULL, period, name, period, SR, SRZZ, MainRZZ, FP, SMF, DrawZZ, PriceConst, 7, m); pos++; } } } //---------------------------------------------------------------------
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Implements a curve of type DRAW_HISTOGRAM
Implements a curve of type DRAW_SECTION
Implements a curve of type DRAW_NONE
Indicators Used:
Moving average indicator
Custom Indicators Used:
name
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen