
32种顶级均线算法合集
全维度自定义设置
多周期共振+HA平均K线适配
可视化信号+全渠道提醒
新手一键套用参数浪哥也给你们,就说浪哥宠不宠你们吧,不会调的朋友私浪哥。
快速均线:12周期 EMA 慢速均线:26周期 EMA 价格源:默认收盘价 交易逻辑:快线上穿慢线做多,快线下穿慢线做空

//+------------------------------------------------------------------+//| AllAveragesCrossover_v1.8 600+.mq4 |//| Copyright ?2016, TrendLaboratory |//| http://finance.groups.yahoo.com/group/TrendLaboratory |//| E-mail: igorad2003@yahoo.co.uk |//+------------------------------------------------------------------+#property copyright "Copyright ?2016, TrendLaboratory"#property link "http://finance.groups.yahoo.com/group/TrendLaboratory"#property link "http://newdigital-world.com"#property indicator_chart_window#property indicator_buffers 8#property indicator_color1 C' 30,160,160'#property indicator_color2 C'225, 55, 0'#property indicator_color3 C' 20, 90, 90'#property indicator_color4 C'160, 40, 0'#property indicator_color5 clrDeepSkyBlue#property indicator_color6 clrOrangeRed#property indicator_color7 clrDeepSkyBlue#property indicator_color8 clrOrangeRed#property indicator_width1 2#property indicator_width2 2#property indicator_width3 0#property indicator_width4 0#property indicator_width5 2#property indicator_width6 2#property indicator_width7 1#property indicator_width8 1enum ENUM_MA_MODE{SMA, // Simple Moving AverageEMA, // Exponential Moving AverageWilder, // Wilder Exponential Moving AverageLWMA, // Linear Weighted Moving AverageSineWMA, // Sine Weighted Moving AverageTriMA, // Triangular Moving AverageLSMA, // Least Square Moving Average (or EPMA, Linear Regression Line)SMMA, // Smoothed Moving AverageHMA, // Hull Moving Average by A.HullZeroLagEMA, // Zero-Lag Exponential Moving AverageDEMA, // Double Exponential Moving Average by P.MulloyT3_basic, // T3 by T.Tillson (original version)ITrend, // Instantaneous Trendline by J.EhlersMedian, // Moving MedianGeoMean, // Geometric MeanREMA, // Regularized EMA by C.SatchwellILRS, // Integral of Linear Regression SlopeIE_2, // Combination of LSMA and ILRSTriMAgen, // Triangular Moving Average generalized by J.EhlersVWMA, // Volume Weighted Moving AverageJSmooth, // M.Jurik's SmoothingSMA_eq, // Simplified SMAALMA, // Arnaud Legoux Moving AverageTEMA, // Triple Exponential Moving Average by P.MulloyT3, // T3 by T.Tillson (correct version)Laguerre, // Laguerre filter by J.EhlersMD, // McGinley DynamicBF2P, // Two-pole modified Butterworth filter by J.EhlersBF3P, // Three-pole modified Butterworth filter by J.EhlersSuperSmu, // SuperSmoother by J.EhlersDecycler, // Simple Decycler by J.EhlerseVWMA // Modified eVWMA};enum ENUM_PRICE{close, // Closeopen, // Openhigh, // Highlow, // Lowmedian, // Mediantypical, // TypicalweightedClose, // Weighted CloseheikenAshiClose, // Heiken Ashi CloseheikenAshiOpen, // Heiken Ashi OpenheikenAshiHigh, // Heiken Ashi HighheikenAshiLow, // Heiken Ashi LowheikenAshiMedian, // Heiken Ashi MedianheikenAshiTypical, // Heiken Ashi TypicalheikenAshiWeighted // Heiken Ashi Weighted Close};#define pi 3.14159265358979323846//----input ENUM_TIMEFRAMES TimeFrame = 0;input string FastMA = "=== Fast MA ===";input ENUM_PRICE FastPrice = 0; //Fast MA Priceinput int FastLength = 12; //Fast MA Periodinput ENUM_MA_MODE FastMethod = 1; //Fast MA Methodinput int FastShift = 0; //Fast MA Displaceinput string SlowMA = "=== Slow MA ===";input ENUM_PRICE SlowPrice = 0; //Slow MA Priceinput int SlowLength = 26; //Slow MA Periodinput ENUM_MA_MODE SlowMethod = 1; //Slow MA Methodinput int SlowShift = 0; //Slow MA Displaceinput bool ShowFilled = false;input int CountBars = 0; //Number of bars counted: 0-all barsinput string Alerts = "=== Alerts & Emails ===";input bool AlertOn = false;input int AlertShift = 1; // Alert Shift:0-current bar,1-previous barinput int SoundsNumber = 5; // Number of sounds after Signalinput int SoundsPause = 5; // Pause in sec between soundsinput string UpTrendSound = "alert.wav";input string DnTrendSound = "alert2.wav";input bool EmailOn = false;input int EmailsNumber = 1;input bool PushNotificationOn = false;double upgrow[];double dngrow[];double upfall[];double dnfall[];double fast[];double slow[];double buy[];double sell[];double trend[];double fastshift[];double slowshift[];double fastprice[];double slowprice[];int timeframe, cBars, draw_begin, fastsize, slowsize;string IndicatorName, TF, fast_name, slow_name;//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int init(){timeframe = TimeFrame;if(timeframe <= Period()) timeframe = Period();TF = tf(timeframe);IndicatorDigits(Digits);//----IndicatorBuffers(13);SetIndexBuffer( 0, upgrow); SetIndexStyle(0,DRAW_HISTOGRAM);SetIndexBuffer( 1, dngrow); SetIndexStyle(1,DRAW_HISTOGRAM);SetIndexBuffer( 2, upfall); SetIndexStyle(2,DRAW_HISTOGRAM);SetIndexBuffer( 3, dnfall); SetIndexStyle(3,DRAW_HISTOGRAM);SetIndexBuffer( 4, fast); SetIndexStyle(4, DRAW_LINE);SetIndexBuffer( 5, slow); SetIndexStyle(5, DRAW_LINE);SetIndexBuffer( 6, buy); SetIndexStyle(6, DRAW_ARROW); SetIndexArrow(6,233);SetIndexBuffer( 7, sell); SetIndexStyle(7, DRAW_ARROW); SetIndexArrow(7,234);SetIndexBuffer( 8, trend);SetIndexBuffer( 9,fastshift);SetIndexBuffer(10,slowshift);SetIndexBuffer(11,fastprice);SetIndexBuffer(12,slowprice);//----fastsize = averageSize(FastMethod );slowsize = averageSize(SlowMethod );IndicatorName = WindowExpertName();IndicatorShortName(IndicatorName+"["+TF+"]("+FastPrice+","+FastLength+","+FastMethod+","+SlowPrice+","+SlowLength+","+SlowMethod+")");SetIndexLabel(4,"Fast MA("+FastLength+")");SetIndexLabel(5,"Slow MA("+SlowLength+")");SetIndexLabel(6,"buySignal");SetIndexLabel(7,"sellSignal");//----if(CountBars == 0) cBars = iBars(NULL,timeframe)*timeframe/Period() - MathMax(FastLength,SlowLength); else cBars = CountBars*timeframe/Period();draw_begin = Bars - cBars;SetIndexDrawBegin(0,draw_begin);SetIndexDrawBegin(1,draw_begin);SetIndexDrawBegin(2,draw_begin);SetIndexDrawBegin(3,draw_begin);SetIndexDrawBegin(4,draw_begin);SetIndexDrawBegin(5,draw_begin);//----ArrayResize(tmp,MathMax(fastsize,slowsize));return(0);}//-----int deinit(){Comment("");return(0);}//+------------------------------------------------------------------+//| AllAveragesCrossover_v1.8 600+ |//+------------------------------------------------------------------+int start(){int shift,limit, counted_bars=IndicatorCounted();if(counted_bars > 0) limit = Bars - counted_bars - 1;if(counted_bars < 0) return(0);if(counted_bars < 1){limit = Bars - 1;for(int i=limit;i>=0;i--){upgrow[i] = EMPTY_VALUE;dngrow[i] = EMPTY_VALUE;upfall[i] = EMPTY_VALUE;dnfall[i] = EMPTY_VALUE;fast[i] = EMPTY_VALUE;slow[i] = EMPTY_VALUE;buy [i] = EMPTY_VALUE;sell[i] = EMPTY_VALUE;}}if(FastShift < 0) int fastlimit = MathAbs(FastShift); else fastlimit = limit;if(SlowShift < 0) int slowlimit = MathAbs(SlowShift); else slowlimit = limit;int limit1 = MathMax(limit,MathMax(fastlimit,slowlimit));if(timeframe != Period()){limit = timeframe/Period()*(limit1 + 1);for(shift=0;shift<limit;shift++){int y = iBarShift(NULL,timeframe,Time[shift]);fast[shift] = iCustom(NULL,TimeFrame,IndicatorName,0,"",FastPrice,FastLength,FastMethod,FastShift,"",SlowPrice,SlowLength,SlowMethod,SlowShift,ShowFilled,CountBars,"",AlertOn,AlertShift,SoundsNumber,SoundsPause,UpTrendSound,DnTrendSound,EmailOn,EmailsNumber,PushNotificationOn,4,y);slow[shift] = iCustom(NULL,TimeFrame,IndicatorName,0,"",FastPrice,FastLength,FastMethod,FastShift,"",SlowPrice,SlowLength,SlowMethod,SlowShift,ShowFilled,CountBars,"",AlertOn,AlertShift,SoundsNumber,SoundsPause,UpTrendSound,DnTrendSound,EmailOn,EmailsNumber,PushNotificationOn,5,y);buy [shift] = iCustom(NULL,TimeFrame,IndicatorName,0,"",FastPrice,FastLength,FastMethod,FastShift,"",SlowPrice,SlowLength,SlowMethod,SlowShift,ShowFilled,CountBars,"",AlertOn,AlertShift,SoundsNumber,SoundsPause,UpTrendSound,DnTrendSound,EmailOn,EmailsNumber,PushNotificationOn,6,y);sell[shift] = iCustom(NULL,TimeFrame,IndicatorName,0,"",FastPrice,FastLength,FastMethod,FastShift,"",SlowPrice,SlowLength,SlowMethod,SlowShift,ShowFilled,CountBars,"",AlertOn,AlertShift,SoundsNumber,SoundsPause,UpTrendSound,DnTrendSound,EmailOn,EmailsNumber,PushNotificationOn,7,y);if(ShowFilled){upgrow[shift] = iCustom(NULL,TimeFrame,IndicatorName,0,"",FastPrice,FastLength,FastMethod,FastShift,"",SlowPrice,SlowLength,SlowMethod,SlowShift,ShowFilled,CountBars,"",AlertOn,AlertShift,SoundsNumber,SoundsPause,UpTrendSound,DnTrendSound,EmailOn,EmailsNumber,PushNotificationOn,0,y);dngrow[shift] = iCustom(NULL,TimeFrame,IndicatorName,0,"",FastPrice,FastLength,FastMethod,FastShift,"",SlowPrice,SlowLength,SlowMethod,SlowShift,ShowFilled,CountBars,"",AlertOn,AlertShift,SoundsNumber,SoundsPause,UpTrendSound,DnTrendSound,EmailOn,EmailsNumber,PushNotificationOn,1,y);upfall[shift] = iCustom(NULL,TimeFrame,IndicatorName,0,"",FastPrice,FastLength,FastMethod,FastShift,"",SlowPrice,SlowLength,SlowMethod,SlowShift,ShowFilled,CountBars,"",AlertOn,AlertShift,SoundsNumber,SoundsPause,UpTrendSound,DnTrendSound,EmailOn,EmailsNumber,PushNotificationOn,2,y);dnfall[shift] = iCustom(NULL,TimeFrame,IndicatorName,0,"",FastPrice,FastLength,FastMethod,FastShift,"",SlowPrice,SlowLength,SlowMethod,SlowShift,ShowFilled,CountBars,"",AlertOn,AlertShift,SoundsNumber,SoundsPause,UpTrendSound,DnTrendSound,EmailOn,EmailsNumber,PushNotificationOn,3,y);}}if(CountBars > 0){SetIndexDrawBegin(0,Bars - cBars);SetIndexDrawBegin(1,Bars - cBars);SetIndexDrawBegin(2,Bars - cBars);SetIndexDrawBegin(3,Bars - cBars);SetIndexDrawBegin(4,Bars - cBars);SetIndexDrawBegin(5,Bars - cBars);SetIndexDrawBegin(6,Bars - cBars);SetIndexDrawBegin(7,Bars - cBars);}return(0);}else{for(shift=limit;shift>=0;shift--){if(FastPrice <= 6) fastprice[shift] = iMA(NULL,0,1,0,0,(int)FastPrice,shift);elseif(FastPrice > 6 && FastPrice <= 13) fastprice[shift] = HeikenAshi(0,FastPrice-7,shift);if(SlowPrice <= 6) slowprice[shift] = iMA(NULL,0,1,0,0,(int)SlowPrice,shift);elseif(SlowPrice > 6 && SlowPrice <= 13) slowprice[shift] = HeikenAshi(1,SlowPrice-7,shift);fastshift[shift] = allAveragesOnArray(0,fastprice,FastLength,FastMethod,fastsize,cBars + MathMax(FastLength,SlowLength),shift);slowshift[shift] = allAveragesOnArray(1,slowprice,SlowLength,SlowMethod,slowsize,cBars + MathMax(FastLength,SlowLength),shift);}for(shift=limit1;shift>=0;shift--){if(FastShift >= 0 ||(FastShift < 0 && shift >= MathAbs(FastShift))) fast[shift] = fastshift[shift+FastShift];if(SlowShift >= 0 ||(SlowShift < 0 && shift >= MathAbs(SlowShift))) slow[shift] = slowshift[shift+SlowShift];trend[shift] = trend[shift+1];buy [shift] = EMPTY_VALUE;sell[shift] = EMPTY_VALUE;if(fast[shift] > slow[shift] && fast[shift] != EMPTY_VALUE && trend[shift+1] != 1) trend[shift] = 1;if(fast[shift] < slow[shift] && slow[shift] != EMPTY_VALUE && trend[shift+1] !=-1) trend[shift] =-1;double gap = 0.5*MathCeil(iATR(NULL,0,14,shift)/Point);if(trend[shift] != trend[shift+1]){if(trend[shift] > 0) buy [shift] = MathMin(fast[shift],slow[shift]) - gap*Point;if(trend[shift] < 0) sell[shift] = MathMax(fast[shift],slow[shift]) + 2*gap*Point;}if(ShowFilled){upgrow[shift] = EMPTY_VALUE;dngrow[shift] = EMPTY_VALUE;upfall[shift] = EMPTY_VALUE;dnfall[shift] = EMPTY_VALUE;double currdiff = MathAbs(fast[shift] - slow[shift] );double prevdiff = MathAbs(fast[shift+1] - slow[shift+1]);if(trend[shift] > 0){if(trend[shift+1] <= 0) {upgrow[shift] = fast[shift]; dngrow[shift] = slow[shift];}else{if(currdiff > prevdiff) {upgrow[shift] = fast[shift]; dngrow[shift] = slow[shift];}else {upfall[shift] = fast[shift]; dnfall[shift] = slow[shift];}}}if(trend[shift] < 0){if(trend[shift+1] >= 0) {dngrow[shift] = fast[shift]; upgrow[shift] = slow[shift];}else{if(currdiff > prevdiff) {dngrow[shift] = slow[shift]; upgrow[shift] = fast[shift];}else {dnfall[shift] = slow[shift]; upfall[shift] = fast[shift];}}}}}if(CountBars > 0){SetIndexDrawBegin(0,Bars - cBars);SetIndexDrawBegin(1,Bars - cBars);SetIndexDrawBegin(2,Bars - cBars);SetIndexDrawBegin(3,Bars - cBars);SetIndexDrawBegin(4,Bars - cBars);SetIndexDrawBegin(5,Bars - cBars);SetIndexDrawBegin(6,Bars - cBars);SetIndexDrawBegin(7,Bars - cBars);}}if(AlertOn || EmailOn || PushNotificationOn){bool crossAbove = trend[limit1+AlertShift] > 0 && trend[limit1+AlertShift+1] <= 0;bool crossBelow = trend[limit1+AlertShift] < 0 && trend[limit1+AlertShift+1] >= 0;if(crossAbove || crossBelow){if(isNewBar(timeframe)){if(AlertOn){BoxAlert(crossAbove," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits));BoxAlert(crossBelow," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits));}if(EmailOn){EmailAlert(crossAbove,"BUY" ," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits),EmailsNumber);EmailAlert(crossBelow,"SELL"," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits),EmailsNumber);}if(PushNotificationOn){PushAlert(crossAbove," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits));PushAlert(crossBelow," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits));}}else{if(AlertOn){WarningSound(crossAbove,SoundsNumber,SoundsPause,UpTrendSound,Time[AlertShift]);WarningSound(crossBelow,SoundsNumber,SoundsPause,DnTrendSound,Time[AlertShift]);}}}}return(0);}//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int averageSize(int mode){int arraysize;switch(mode){case 10: arraysize = 2; break;case 11: arraysize = 6; break;case 20: arraysize = 5; break;case 23: arraysize = 4; break;case 24: arraysize = 6; break;case 25: arraysize = 4; break;default: arraysize = 0; break;}return(arraysize);}double tmp[][2][2], ma[2][4];datetime prevtime[2];double allAveragesOnArray(int index,double& price[],int period,int mode,int arraysize,int cbars,int bar){double MA[4];if(mode == 1 || mode == 2 || mode == 7 || mode == 9 || mode == 10 || mode == 11 || mode == 12 || mode == 15 || mode == 20 || mode == 21 || (mode > 22 && mode <= 31)){if(prevtime[index] != Time[bar]){ma[index][3] = ma[index][2];ma[index][2] = ma[index][1];ma[index][1] = ma[index][0];if(arraysize > 0) for(int i=0;i<arraysize;i++) tmp[i][index][1] = tmp[i][index][0];prevtime[index] = Time[bar];}if(mode == 12 || mode == 15 || mode == 21 || (mode > 26 && mode < 31)) for(i=0;i<4;i++) MA[i] = ma[index][i];}switch(mode){case 1 : ma[index][0] = EMAOnArray(price[bar],ma[index][1],period,cbars,bar); break;case 2 : ma[index][0] = WilderOnArray(price[bar],ma[index][1],period,cbars,bar); break;case 3 : ma[index][0] = LWMAOnArray(price,period,bar); break;case 4 : ma[index][0] = SineWMAOnArray(price,period,bar); break;case 5 : ma[index][0] = TriMAOnArray(price,period,bar); break;case 6 : ma[index][0] = LSMAOnArray(price,period,bar); break;case 7 : ma[index][0] = SMMAOnArray(price,ma[index][1],period,cbars,bar); break;case 8 : ma[index][0] = HMAOnArray(price,period,cbars,bar); break;case 9 : ma[index][0] = ZeroLagEMAOnArray(price,ma[index][1],period,cbars,bar); break;case 10: ma[index][0] = DEMAOnArray(index,0,price[bar],period,1,cbars,bar); break;case 11: ma[index][0] = T3_basicOnArray(index,0,price[bar],period,0.7,cbars,bar); break;case 12: ma[index][0] = ITrendOnArray(price,MA,period,cbars,bar); break;case 13: ma[index][0] = MedianOnArray(price,period,bar); break;case 14: ma[index][0] = GeoMeanOnArray(price,period,cbars,bar); break;case 15: ma[index][0] = REMAOnArray(price[bar],MA,period,0.5,cbars,bar); break;case 16: ma[index][0] = ILRSOnArray(price,period,bar); break;case 17: ma[index][0] = IE2OnArray(price,period,bar); break;case 18: ma[index][0] = TriMA_genOnArray(price,period,bar); break;case 19: ma[index][0] = VWMAOnArray(price,period,bar); break;case 20: ma[index][0] = JSmoothOnArray(index,0,price[bar],period,1,cbars,bar); break;case 21: ma[index][0] = SMA_eqOnArray(price,MA,period,cbars,bar); break;case 22: ma[index][0] = ALMAOnArray(price,period,0.85,8,bar); break;case 23: ma[index][0] = TEMAOnArray(index,price[bar],period,1,cbars,bar); break;case 24: ma[index][0] = T3OnArray(index,0,price[bar],period,0.7,cbars,bar); break;case 25: ma[index][0] = LaguerreOnArray(index,price[bar],period,4,cbars,bar); break;case 26: ma[index][0] = McGinleyOnArray(price[bar],ma[index][1],period,cbars,bar); break;case 27: ma[index][0] = BF2POnArray(price,MA,period,cbars,bar); break;case 28: ma[index][0] = BF3POnArray(price,MA,period,cbars,bar); break;case 29: ma[index][0] = SuperSmuOnArray(price,MA,period,cbars,bar); break;case 30: ma[index][0] = DecyclerOnArray(price,MA,period,cbars,bar); return(price[bar] - ma[index][0]);case 31: ma[index][0] = eVWMAOnArray(price[bar],ma[index][1],period,cbars,bar); break;default: ma[index][0] = SMAOnArray(price,period,bar); break;}return(ma[index][0]);}// MA_Method=0: SMA - Simple Moving Averagedouble SMAOnArray(double& array[],int per,int bar){double sum = 0;for(int i=0;i<per;i++) sum += array[bar+i];return(sum/per);}// MA_Method=1: EMA - Exponential Moving Averagedouble EMAOnArray(double price,double prev,int per,int cbars,int bar){if(bar >= cbars - 2) double ema = price;elseema = prev + 2.0/(1 + per)*(price - prev);return(ema);}// MA_Method=2: Wilder - Wilder Exponential Moving Averagedouble WilderOnArray(double price,double prev,int per,int cbars,int bar){if(bar >= cbars - 2) double wilder = price;elsewilder = prev + (price - prev)/per;return(wilder);}// MA_Method=3: LWMA - Linear Weighted Moving Averagedouble LWMAOnArray(double& array[],int per,int bar){double sum = 0, weight = 0;for(int i=0;i<per;i++){weight += (per - i);sum += array[bar+i]*(per - i);}if(weight > 0) return(sum/weight); else return(0);}// MA_Method=4: SineWMA - Sine Weighted Moving Averagedouble SineWMAOnArray(double& array[],int per,int bar){double sum = 0, weight = 0;for(int i=0;i<per;i++){weight += MathSin(pi*(i + 1)/(per + 1));sum += array[bar+i]*MathSin(pi*(i + 1)/(per + 1));}if(weight > 0) return(sum/weight); else return(0);}// MA_Method=5: TriMA - Triangular Moving Averagedouble TriMAOnArray(double& array[],int per,int bar){int len = MathCeil((per + 1)*0.5);double sum = 0;for(int i=0;i<len;i++) sum += SMAOnArray(array,len,bar+i);return(sum/len);}// MA_Method=6: LSMA - Least Square Moving Average (or EPMA, Linear Regression Line)double LSMAOnArray(double& array[],int per,int bar){double sum = 0;for(int i=per;i>=1;i--) sum += (i - (per + 1)/3.0)*array[bar+per-i];return(sum*6/(per*(per + 1)));}// MA_Method=7: SMMA - Smoothed Moving Averagedouble SMMAOnArray(double& array[],double prev,int per,int cbars,int bar){if(bar == cbars - per) double smma = SMAOnArray(array,per,bar);elseif(bar < cbars - per){double sum = 0;for(int i=0;i<per;i++) sum += array[bar+i+1];smma = (sum - prev + array[bar])/per;}return(smma);}// MA_Method=8: HMA - Hull Moving Average by Alan Hulldouble HMAOnArray(double& array[],int per,int cbars,int bar){double _tmp[];int len = MathSqrt(per);ArrayResize(_tmp,len);if(bar == cbars - per) double hma = array[bar];elseif(bar < cbars - per){for(int i=0;i<len;i++) _tmp[i] = 2*LWMAOnArray(array,per/2,bar+i) - LWMAOnArray(array,per,bar+i);hma = LWMAOnArray(_tmp,len,0);}return(hma);}// MA_Method=9: ZeroLagEMA - Zero-Lag Exponential Moving Averagedouble ZeroLagEMAOnArray(double& price[],double prev,int per,int cbars,int bar){int lag = 0.5*(per - 1);double alpha = 2.0/(1 + per);if(bar >= cbars - lag) double zema = price[bar];elsezema = alpha*(2*price[bar] - price[bar+lag]) + (1 - alpha)*prev;return(zema);}// MA_Method=10: DEMA - Double Exponential Moving Average by Patrick Mulloydouble DEMAOnArray(int index,int num,double price,double per,double v,int cbars,int bar){double alpha = 2.0/(1 + per);if(bar == cbars - 2) {double dema = price; tmp[num][index][0] = dema; tmp[num+1][index][0] = dema;}elseif(bar < cbars - 2){tmp[num ][index][0] = tmp[num ][index][1] + alpha*(price - tmp[num ][index][1]);tmp[num+1][index][0] = tmp[num+1][index][1] + alpha*(tmp[num][index][0] - tmp[num+1][index][1]);dema = tmp[num ][index][0]*(1+v) - tmp[num+1][index][0]*v;}return(dema);}// MA_Method=11: T3 by T.Tillsondouble T3_basicOnArray(int index,int num,double price,int per,double v,int cbars,int bar){double dema1, dema2;if(bar == cbars - 2){double T3 = price;for(int k=0;k<6;k++) tmp[num+k][index][0] = price;}elseif(bar < cbars - 2){dema1 = DEMAOnArray(index,num ,price,per,v,cbars,bar);dema2 = DEMAOnArray(index,num+2,dema1,per,v,cbars,bar);T3 = DEMAOnArray(index,num+4,dema2,per,v,cbars,bar);}return(T3);}// MA_Method=12: ITrend - Instantaneous Trendline by J.Ehlersdouble ITrendOnArray(double& price[],double& array[],int per,int cbars,int bar){double alpha = 2.0/(per + 1);if(bar < cbars - 7) double it = (alpha - 0.25*alpha*alpha)*price[bar] + 0.5*alpha*alpha*price[bar+1]- (alpha - 0.75*alpha*alpha)*price[bar+2] + 2*(1 - alpha)*array[1]- (1 - alpha)*(1 - alpha)*array[2];else it = (price[bar] + 2*price[bar+1] + price[bar+2])/4;return(it);}// MA_Method=13: Median - Moving Mediandouble MedianOnArray(double& price[],int per,int bar){double array[];ArrayResize(array,per);for(int i=0;i<per;i++) array[i] = price[bar+i];ArraySort(array,WHOLE_ARRAY,0,MODE_DESCEND);int num = MathRound((per - 1)*0.5);if(MathMod(per,2) > 0) double median = array[num]; else median = 0.5*(array[num] + array[num+1]);return(median);}// MA_Method=14: GeoMean - Geometric Meandouble GeoMeanOnArray(double& price[],int per,int cbars,int bar){if(bar < cbars - per){double gmean = MathPow(price[bar],1.0/per);for(int i=1;i<per;i++) gmean *= MathPow(price[bar+i],1.0/per);}else gmean = SMAOnArray(price,per,bar);return(gmean);}// MA_Method=15: REMA - Regularized EMA by Chris Satchwelldouble REMAOnArray(double price,double& array[],int per,double lambda,int cbars,int bar){double alpha = 2.0/(per + 1);if(bar >= cbars - 3) double rema = price;elserema = (array[1]*(1 + 2*lambda) + alpha*(price - array[1]) - lambda*array[2])/(1 + lambda);return(rema);}// MA_Method=16: ILRS - Integral of Linear Regression Slopedouble ILRSOnArray(double& price[],int per,int bar){double sum = per*(per - 1)*0.5;double sum2 = (per - 1)*per*(2*per - 1)/6.0;double sum1 = 0;double sumy = 0;for(int i=0;i<per;i++){sum1 += i*price[bar+i];sumy += price[bar+i];}double num1 = per*sum1 - sum*sumy;double num2 = sum*sum - per*sum2;if(num2 != 0) double slope = num1/num2; else slope = 0;double ilrs = slope + SMAOnArray(price,per,bar);return(ilrs);}// MA_Method=17: IE/2 - Combination of LSMA and ILRSdouble IE2OnArray(double& price[],int per,int bar){double ie = 0.5*(ILRSOnArray(price,per,bar) + LSMAOnArray(price,per,bar));return(ie);}// MA_Method=18: TriMAgen - Triangular Moving Average Generalized by J.Ehlersdouble TriMA_genOnArray(double& array[],int per,int bar){int len1 = MathFloor((per + 1)*0.5);int len2 = MathCeil ((per + 1)*0.5);double sum = 0;for(int i = 0;i < len2;i++) sum += SMAOnArray(array,len1,bar+i);return(sum/len2);}// MA_Method=19: VWMA - Volume Weighted Moving Averagedouble VWMAOnArray(double& array[],int per,int bar){double sum = 0, weight = 0;for(int i=0;i<per;i++){weight += Volume[bar+i];sum += array[bar+i]*Volume[bar+i];}if(weight > 0) return(sum/weight); else return(0);}// MA_Method=20: JSmooth - Smoothing by Mark Jurikdouble JSmoothOnArray(int index,int num,double price,int per,double power,int cbars,int bar){double beta = 0.45*(per - 1)/(0.45*(per - 1) + 2);double alpha = MathPow(beta,power);if(bar == cbars - 2) {tmp[num+4][index][0] = price; tmp[num+0][index][0] = price; tmp[num+2][index][0] = price;}elseif(bar < cbars - 2){tmp[num+0][index][0] = (1 - alpha)*price + alpha*tmp[num+0][index][1];tmp[num+1][index][0] = (price - tmp[num+0][index][0])*(1-beta) + beta*tmp[num+1][index][1];tmp[num+2][index][0] = tmp[num+0][index][0] + tmp[num+1][index][0];tmp[num+3][index][0] = (tmp[num+2][index][0] - tmp[num+4][index][1])*MathPow((1-alpha),2) + MathPow(alpha,2)*tmp[num+3][index][1];tmp[num+4][index][0] = tmp[num+4][index][1] + tmp[num+3][index][0];}return(tmp[num+4][index][0]);}// MA_Method=21: SMA_eq - Simplified SMAdouble SMA_eqOnArray(double& price[],double& array[],int per,int cbars,int bar){if(bar == cbars - per) double sma = SMAOnArray(price,per,bar);elseif(bar < cbars - per) sma = (price[bar] - price[bar+per])/per + array[1];return(sma);}// MA_Method=22: ALMA by Arnaud Legoux / Dimitris Kouzis-Loukas / Anthony Cascinodouble ALMAOnArray(double& price[],int per,double offset,double sigma,int bar){double m = MathFloor(offset*(per - 1)), s = per/sigma, w, sum = 0, wsum = 0;for (int i=0;i<per;i++){w = MathExp(-((i - m)*(i - m))/(2*s*s));wsum += w;sum += price[bar+(per-1-i)]*w;}if(wsum != 0) return(sum/wsum); else return(0);}// MA_Method=23: TEMA - Triple Exponential Moving Average by Patrick Mulloydouble TEMAOnArray(int index,double price,int per,double v,int cbars,int bar){double alpha = 2.0/(per+1);if(bar == cbars - 2) {tmp[0][index][0] = price; tmp[1][index][0] = price; tmp[2][index][0] = price;}elseif(bar < cbars - 2){tmp[0][index][0] = tmp[0][index][1] + alpha *(price - tmp[0][index][1]);tmp[1][index][0] = tmp[1][index][1] + alpha *(tmp[0][index][0] - tmp[1][index][1]);tmp[2][index][0] = tmp[2][index][1] + alpha *(tmp[1][index][0] - tmp[2][index][1]);tmp[3][index][0] = tmp[0][index][0] + v*(tmp[0][index][0] + v*(tmp[0][index][0]-tmp[1][index][0]) - tmp[1][index][0] - v*(tmp[1][index][0] - tmp[2][index][0]));}return(tmp[3][index][0]);}// MA_Method=24: T3 by T.Tillson (correct version)double T3OnArray(int index,int num,double price,int per,double v,int cbars,int bar){double len = MathMax((per + 5.0)/3.0 - 1,1), dema1, dema2;if(bar == cbars - 2){double T3 = price;for(int k=0;k<6;k++) tmp[num+k][index][0] = T3;}elseif(bar < cbars - 2){dema1 = DEMAOnArray(index,num ,price,len,v,cbars,bar);dema2 = DEMAOnArray(index,num+2,dema1,len,v,cbars,bar);T3 = DEMAOnArray(index,num+4,dema2,len,v,cbars,bar);}return(T3);}// MA_Method=25: Laguerre filter by J.Ehlersdouble LaguerreOnArray(int index,double price,int per,int order,int cbars,int bar){double gamma = 1 - 10.0/(per + 9);double aPrice[];ArrayResize(aPrice,order);for(int i=0;i<order;i++){if(bar >= cbars - order) tmp[i][index][0] = price;else{if(i == 0) tmp[i][index][0] = (1 - gamma)*price + gamma*tmp[i][index][1];elsetmp[i][index][0] = -gamma * tmp[i-1][index][0] + tmp[i-1][index][1] + gamma * tmp[i][index][1];aPrice[i] = tmp[i][index][0];}}double laguerre = TriMA_genOnArray(aPrice,order,0);return(laguerre);}// MA_Method=26: MD - McGinley Dynamicdouble McGinleyOnArray(double price,double prev,int per,int cbars,int bar){if(bar == cbars - 2) double md = price;elseif(bar < cbars - 2)if(prev != 0) md = prev + (price - prev)/(per*MathPow(price/prev,4)/2);else md = price;return(md);}// MA_Method=27: BF2P - Two-pole modified Butterworth filterdouble BF2POnArray(double& price[],double& array[],int per,int cbars,int bar){double a = MathExp(-1.414*pi/per);double b = 2*a*MathCos(1.414*1.25*pi/per);double c2 = b;double c3 = -a*a;double c1 = 1 - c2 - c3;if(bar < cbars - 7) double bf2p = c1*(price[bar] + 2*price[bar+1] + price[bar+2])/4 + c2*array[1] + c3*array[2];else bf2p = (price[bar] + 2*price[bar+1] + price[bar+2])/4;return(bf2p);}// MA_Method=28: BF3P - Three-pole modified Butterworth filterdouble BF3POnArray(double& price[],double& array[],int per,int cbars,int bar){double a = MathExp(-pi/per);double b = 2*a*MathCos(1.738*pi/per);double c = a*a;double d2 = b + c;double d3 = -(c + b*c);double d4 = c*c;double d1 = 1 - d2 - d3 - d4;if(bar < cbars - 7) double bf3p = d1*(price[bar] + 3*price[bar+1] + 3*price[bar+2] + price[bar+3])/8 + d2*array[1] + d3*array[2] + d4*array[3];else bf3p = (price[bar] + 3*price[bar+1] + 3*price[bar+2] + price[bar+3])/8;return(bf3p);}// MA_Method=29: SuperSmu - SuperSmoother filterdouble SuperSmuOnArray(double& price[],double& array[],int per,int cbars,int bar){double a = MathExp(-1.414*pi/per);double b = 2*a*MathCos(1.414*pi/per);double c2 = b;double c3 = -a*a;double c1 = 1 - c2 - c3;if(bar < cbars - 7) double supsm = c1*(price[bar] + price[bar+1])/2 + c2*array[1] + c3*array[2];else supsm = (price[bar] + price[bar+1])/2;return(supsm);}// MA_Method=30: Decycler - Simple Decycler by J.Ehlersdouble DecyclerOnArray(double& price[],double& hp[],int per,int cbars,int bar){double alpha1 = (MathCos(1.414*pi/per) + MathSin(1.414*pi/per) - 1)/MathCos(1.414*pi/per);if(bar > cbars - 4) return(0);hp[0] = (1 - alpha1/2)*(1 - alpha1/2)*(price[bar] - 2*price[bar+1] + price[bar+2]) + 2*(1 - alpha1)*hp[1] - (1 - alpha1)*(1 - alpha1)*hp[2];return(hp[0]);}// MA_Method=31: eVWMA - Elastic Volume Weighted Moving Average by C.Friesdouble eVWMAOnArray(double price,double prev,int per,int cbars,int bar){if(bar >= cbars - per) double evwma = price;else{double max = 0;for(int i=0;i<per;i++) max = MathMax(max,Volume[bar+i]);double diff = 3*max - Volume[bar];if(diff < 0) evwma = prev;elseevwma = (diff*prev + Volume[bar]*price)/(3*max);}return(evwma);}// HeikenAshi Pricedouble haClose[2][2], haOpen[2][2], haHigh[2][2], haLow[2][2];datetime prevhatime[2];double HeikenAshi(int index,int price,int bar){if(prevhatime[index] != Time[bar]){haClose[index][1] = haClose[index][0];haOpen [index][1] = haOpen [index][0];haHigh [index][1] = haHigh [index][0];haLow [index][1] = haLow [index][0];prevhatime[index] = Time[bar];}if(bar == Bars - 1){haClose[index][0] = Close[bar];haOpen [index][0] = Open [bar];haHigh [index][0] = High [bar];haLow [index][0] = Low [bar];}else{haClose[index][0] = (Open[bar] + High[bar] + Low[bar] + Close[bar])/4;haOpen [index][0] = (haOpen[index][1] + haClose[index][1])/2;haHigh [index][0] = MathMax(High[bar],MathMax(haOpen[index][0],haClose[index][0]));haLow [index][0] = MathMin(Low [bar],MathMin(haOpen[index][0],haClose[index][0]));}switch(price){case 0: return(haClose[index][0]); break;case 1: return(haOpen [index][0]); break;case 2: return(haHigh [index][0]); break;case 3: return(haLow [index][0]); break;case 4: return((haHigh[index][0] + haLow[index][0])/2); break;case 5: return((haHigh[index][0] + haLow[index][0] + haClose[index][0])/3); break;case 6: return((haHigh[index][0] + haLow[index][0] + 2*haClose[index][0])/4); break;default: return(haClose[index][0]); break;}}string tf(int itimeframe){string result = "";switch(itimeframe){case PERIOD_M1: result = "M1" ;case PERIOD_M5: result = "M5" ;case PERIOD_M15: result = "M15";case PERIOD_M30: result = "M30";case PERIOD_H1: result = "H1" ;case PERIOD_H4: result = "H4" ;case PERIOD_D1: result = "D1" ;case PERIOD_W1: result = "W1" ;case PERIOD_MN1: result = "MN1";default: result = "N/A";}if(result == "N/A"){if(itimeframe < PERIOD_H1 ) result = "M" + itimeframe;if(itimeframe >= PERIOD_H1 ) result = "H" + itimeframe/PERIOD_H1;if(itimeframe >= PERIOD_D1 ) result = "D" + itimeframe/PERIOD_D1;if(itimeframe >= PERIOD_W1 ) result = "W" + itimeframe/PERIOD_W1;if(itimeframe >= PERIOD_MN1) result = "MN" + itimeframe/PERIOD_MN1;}return(result);}datetime prevnbtime;bool isNewBar(int tf){bool res = false;if(tf >= 0){if(iTime(NULL,tf,0) != prevnbtime){res = true;prevnbtime = iTime(NULL,tf,0);}}else res = true;return(res);}string prevmess;bool BoxAlert(bool cond,string text){string mess = IndicatorName + "("+Symbol()+","+TF + ")" + text;if (cond && mess != prevmess){Alert (mess);prevmess = mess;return(true);}return(false);}datetime pausetime;bool Pause(int sec){if(TimeCurrent() >= pausetime + sec) {pausetime = TimeCurrent(); return(true);}return(false);}datetime warningtime;void WarningSound(bool cond,int num,int sec,string sound,datetime curtime){static int i;if(cond){if(curtime != warningtime) i = 0;if(i < num && Pause(sec)) {PlaySound(sound); warningtime = curtime; i++;}}}string prevemail;bool EmailAlert(bool cond,string text1,string text2,int num){string subj = "New " + text1 +" Signal from " + IndicatorName + "!!!";string mess = IndicatorName + "("+Symbol()+","+TF + ")" + text2;if (cond && mess != prevemail){if(subj != "" && mess != "") for(int i=0;i<num;i++) SendMail(subj, mess);prevemail = mess;return(true);}return(false);}string prevpush;bool PushAlert(bool cond,string text){string push = IndicatorName + "("+Symbol() + "," + TF + ")" + text;if(cond && push != prevpush){SendNotification(push);prevpush = push;return(true);}return(false);}
注意:由于时间有限加上对源码的追溯做不到最终解释权,所以我提供的源码EA仅仅只能用来做模拟测试使用,严格禁止商业使用和跑实盘!
夜雨聆风