//+------------------------------------------------------------------+ //| Swing_ZZ.mq4 | //+------------------------------------------------------------------+ //---- Alert by FerruFx #property copyright "onix" #property link "http://onix-trade.net/forum/index.php?s=&showtopic=118&view=findpost&p=131476" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Aqua #property indicator_color2 Blue #property indicator_color3 Red //---- indicator parameters extern int minBars = 2; extern bool SignalAlert = false; extern bool SendAlertEmail = false; //---- indicator buffers double zzL[]; double zzH[]; double zz[]; //---- Alert int up =0; int down =0; string Timeframe=""; double time_frame; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { // IndicatorBuffers(3); //---- drawing settings SetIndexStyle(2,DRAW_ARROW); SetIndexStyle(1,DRAW_ARROW); SetIndexStyle(0,DRAW_SECTION); SetIndexArrow(2,159); SetIndexArrow(1,159); //---- indicator buffers mapping SetIndexBuffer(0,zz); SetIndexBuffer(1,zzH); SetIndexBuffer(2,zzL); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); //---- indicator short name IndicatorShortName("Swing_ZZ("+minBars+")"); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int cbi; double lLast=0,hLast=0; int fs=0; int ai,bi,ai0,aip0,bi0,bip0; datetime tai,tbi,taip,tbip,ti; // Переменные для Свингов Ганна double lLast_m=0, hLast_m=0; int countBarExt; // счетчик внешних баров int countBarl,countBarh; int i,n; ArrayInitialize(zz,0.0); ArrayInitialize(zzL,0.0); ArrayInitialize(zzH,0.0); // lLast, hLast - минимум и максимум активного бара // lLast_m, hLast_m - минимум и максимум "промежуточных" баров // cbi=Bars-IndicatorCounted()-1; cbi=Bars-1; //--------------------------------- for (i=cbi; i>=0; i--) { //------------------------------------------------- // Устанавливаем начальные значения минимума и максимума бара if (lLast==0) {lLast=Low[i]; hLast=High[i]; ai=i; bi=i;} if (ti!=Time[i]) { ti=Time[i]; if (lLast_m==0 && hLast_m==0) { if (lLast>Low[i] && hLastLow[i] && hLast>=High[i]) // Тенденция на текущем баре нисходящая { lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0; if (fs!=2) countBarl++; else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];} } } else if (lLast_m>0 && hLast_m>0) // Внешний бар (предыдущий) { if (lLast_m>Low[i] && hLast_mLow[i] && hLast_m>=High[i]) // Тенденция на текущем баре нисходящая { lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0; if (fs!=2) countBarl++; else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];} } } else if (lLast_m>0) { if (lLast_m>Low[i] && hLastLow[i] && hLast>=High[i]) // Тенденция на текущем баре нисходящая { lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0; if (fs!=2) countBarl++; else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];} } } else if (hLast_m>0) { if (lLast>Low[i] && hLast_mLow[i] && hLast_m>=High[i]) // Тенденция на текущем баре нисходящая { lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0; if (fs!=2) countBarl++; else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];} } } // Определяем направление тренда. if (fs==0) { if (lLasthLast_m) // внутренний бар { lLast=Low[i]; hLast=High[i]; ai=i; bi=i; countBarl=0;countBarh=0;countBarExt=0; } if (countBarh>countBarl && countBarh>countBarExt && countBarh>minBars) { lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; fs=1;countBarh=0;countBarl=0;countBarExt=0; zz[bi]=Low[bi]; zzL[bi]=Low[bi]; zzH[bi]=0; ai=i; tai=Time[i]; } else if (countBarl>countBarh && countBarl>countBarExt && countBarl>minBars) { lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; fs=2;countBarl=0;countBarh=0;countBarExt=0; zz[ai]=High[ai]; zzH[ai]=High[ai]; zzL[ai]=0; bi=i; tbi=Time[i]; } } else { if (lLast_m==0 && hLast_m==0) { countBarl=0;countBarh=0;countBarExt=0; } // Тенденция восходящая if (fs==1) { if (countBarl>countBarh && countBarl>countBarExt && countBarl>minBars) // Определяем точку смены тенденции. { // запоминаем значение направления тренда fs на предыдущем баре ai0=iBarShift(Symbol(),0,tai); bi0=iBarShift(Symbol(),0,tbi); fs=2; countBarl=0; zz[ai]=High[ai]; zzH[ai]=High[ai]; zzL[ai]=0; bi=i; tbi=Time[i]; lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; for (n=0;countBarExtHigh[i+n+1]) {countBarExt++; countBarh++; lLast=Low[i+n+1]; hLast=High[i+n+1]; hLast_m=High[i];} else break; } lLast=Low[i]; hLast=High[i]; } } // Тенденция нисходящая if (fs==2) { if (countBarh>countBarl && countBarh>countBarExt && countBarh>minBars) // Определяем точку смены тенденции. { // запоминаем значение направления тренда fs на предыдущем баре ai0=iBarShift(Symbol(),0,tai); bi0=iBarShift(Symbol(),0,tbi); fs=1; countBarh=0; zz[bi]=Low[bi]; zzL[bi]=Low[bi]; zzH[bi]=0; ai=i; tai=Time[i]; lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; for (n=0;countBarExtHigh[i+n+1]) {countBarExt++; countBarl++; lLast=Low[i+n+1]; hLast=High[i+n+1]; lLast_m=Low[i];} else break; } lLast=Low[i]; hLast=High[i]; } } } } if (i==0) { if (hLastLow[i] && fs==2) // Тенденция на текущем баре нисходящая { bi=i; tbi=Time[i]; zz[bi]=Low[bi]; zzL[bi]=Low[bi]; zzH[bi]=0; } //=================================================================================================== // Нулевой бар. Расчет первого луча ZigZag-a ai0=iBarShift(Symbol(),0,tai); bi0=iBarShift(Symbol(),0,tbi); if (bi0>1) if (fs==1) {for (n=bi0-1; n>=0; n--) {zzH[n]=0.0; zz[n]=0.0;} zz[ai0]=High[ai0]; zzH[ai0]=High[ai0]; zzL[ai0]=0.0;} if (ai0>1) if (fs==2) {for (n=ai0-1; n>=0; n--) {zzL[n]=0.0; zz[n]=0.0;} zz[bi0]=Low[bi0]; zzL[bi0]=Low[bi0]; zzH[bi0]=0.0;} if (ti