//+------------------------------------------------------------------+ //| BBands_Stop_v3.2 600+.mq4 | //| Copyright © 2006-16, TrendLaboratory Ltd. | //| http://finance.groups.yahoo.com/group/TrendLaboratory | //| E-mail: igorad2003@yahoo.co.uk | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006-16, TrendLaboratory" #property link "http://finance.groups.yahoo.com/group/TrendLaboratory" #property link "http://newdigital-world.com/forum.php" #property indicator_chart_window #property indicator_buffers 6 #property indicator_color1 clrDodgerBlue #property indicator_color2 clrCoral #property indicator_color3 clrDodgerBlue #property indicator_color4 clrCoral #property indicator_color5 clrDodgerBlue #property indicator_color6 clrCoral #property indicator_width3 2 #property indicator_width4 2 enum ENUM_MA_MODE { SMA, // Simple Moving Average EMA, // Exponential Moving Average Wilder, // Wilder Exponential Moving Average LWMA, // Linear Weighted Moving Average SineWMA, // Sine Weighted Moving Average TriMA, // Triangular Moving Average LSMA, // Least Square Moving Average (or EPMA, Linear Regression Line) SMMA, // Smoothed Moving Average HMA, // Hull Moving Average by A.Hull ZeroLagEMA, // Zero-Lag Exponential Moving Average DEMA, // Double Exponential Moving Average by P.Mulloy T3_basic, // T3 by T.Tillson (original version) ITrend, // Instantaneous Trendline by J.Ehlers Median, // Moving Median REMA, // Regularized EMA by C.Satchwell ILRS, // Integral of Linear Regression Slope IE_2, // Combination of LSMA and ILRS TriMAgen, // Triangular Moving Average generalized by J.Ehlers VWMA, // Volume Weighted Moving Average JSmooth, // M.Jurik's Smoothing SMA_eq, // Simplified SMA ALMA, // Arnaud Legoux Moving Average TEMA, // Triple Exponential Moving Average by P.Mulloy T3, // T3 by T.Tillson (correct version) Laguerre, // Laguerre filter by J.Ehlers BF2P, // Two-pole modified Butterworth filter by J.Ehlers BF3P, // Three-pole modified Butterworth filter by J.Ehlers SuperSmu, // SuperSmoother by J.Ehlers Decycler, // Simple Decycler by J.Ehlers eVWMA // Modified eVWMA }; enum ENUM_PRICE { close, // Close open, // Open high, // High low, // Low median, // Median typical, // Typical weightedClose, // Weighted Close heikenAshiClose, // Heiken Ashi Close heikenAshiOpen, // Heiken Ashi Open heikenAshiHigh, // Heiken Ashi High heikenAshiLow, // Heiken Ashi Low heikenAshiMedian, // Heiken Ashi Median heikenAshiTypical, // Heiken Ashi Typical heikenAshiWeighted // Heiken Ashi Weighted Close }; enum ENUM_BREAK { byclose, // by Close byuplo, // by Up/Lo Band Price byuploma // by Up/Lo MA(Length,MA_Mode) }; #define pi 3.14159265358979323846 //---- input parameters input ENUM_TIMEFRAMES TimeFrame = 0; // input ENUM_PRICE UpBandPrice = 0; // Upper Band Price input ENUM_PRICE LoBandPrice = 0; // Lower Band Price input ENUM_BREAK BreakOutMode = 0; // Breakout Mode input int Length = 1; // MA Period input ENUM_MA_MODE MA_Method = SMA; // MA Method input double Deviation = 2; // Deviation input int DeviationLength = 20; // Period of Standard Deviation input double Ratchet = 0; // Ratchet(-1-off,>= 0-on) input double MinDeviation = 1; // Min Deviation input double MoneyRisk = 1; // Offset Factor(eg.1.2) input int CountBars = 0; // Number of bars counted: 0-all bars input bool ShowSignals = true; // Show Signals input bool ShowLines = true; // Show Lines input bool ShowDots = true; // Show Dots input string Alerts = "=== Alerts & Emails ==="; input bool AlertOn = false; input int AlertShift = 1; // Alert Shift:0-current bar,1-previous bar input int SoundsNumber = 5; // Number of sounds after Signal input int SoundsPause = 5; // Pause in sec between sounds input string UpTrendSound = "alert.wav"; input string DnTrendSound = "alert2.wav"; input bool EmailOn = false; input int EmailsNumber = 1; input bool PushNotificationOn = false; //---- indicator buffers double UpTrend[]; double DnTrend[]; double UpSignal[]; double DnSignal[]; double UpLine[]; double DnLine[]; double trend[]; double upma[]; double loma[]; double upprice[]; double loprice[]; double mult[2], upband1[2], dnband1[2], upband2[2], dnband2[2], hh[2], ll[2]; int timeframe, masize, cBars, draw_begin, length, dev_length; datetime prevbbtime; string short_name, TF, IndicatorName, maname; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { timeframe = TimeFrame; if(timeframe <= Period()) timeframe = Period(); TF = tf(timeframe); IndicatorDigits(Digits); //---- IndicatorBuffers(11); SetIndexBuffer( 0, UpTrend); SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,159); SetIndexBuffer( 1, DnTrend); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,159); SetIndexBuffer( 2,UpSignal); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,108); SetIndexBuffer( 3,DnSignal); SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,108); SetIndexBuffer( 4, UpLine); SetIndexStyle(4, DRAW_LINE); SetIndexBuffer( 5, DnLine); SetIndexStyle(5, DRAW_LINE); SetIndexBuffer( 6, trend); SetIndexBuffer( 7, upma); SetIndexBuffer( 8, loma); SetIndexBuffer( 9, upprice); SetIndexBuffer(10, loprice); //---- length = MathMax(1,Length); dev_length = MathMax(1,DeviationLength); masize = averageSize(MA_Method); IndicatorName = WindowExpertName(); short_name = IndicatorName+"["+TF+"]("+UpBandPrice+","+LoBandPrice+","+Length+","+MA_Method+","+DeviationLength+","+DoubleToStr(Deviation,2)+","+DoubleToStr(MoneyRisk,2)+")"; IndicatorShortName(short_name); SetIndexLabel(0,"UpTrend Stop"); SetIndexLabel(1,"DnTrend Stop"); SetIndexLabel(2,"UpTrend Signal"); SetIndexLabel(3,"DnTrend Signal"); SetIndexLabel(4,"UpTrend Line"); SetIndexLabel(5,"DnTrend Line"); //---- mult[0] = Deviation; if(CountBars == 0) cBars = iBars(NULL,timeframe)*timeframe/Period() - (length + dev_length); 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,masize); //---- return(0); } //+------------------------------------------------------------------+ //| BBands_Stop_v3.2 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) { if(CountBars > 0) limit = CountBars + length + dev_length; else limit = Bars - 1; for(int i=0;i 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); } return(0); } else for(shift=limit;shift>=0;shift--) { if(prevbbtime != Time[shift]) { mult[1] = mult[0]; upband1[1] = upband1[0]; dnband1[1] = dnband1[0]; upband2[1] = upband2[0]; dnband2[1] = dnband2[0]; hh[1] = hh[0]; ll[1] = ll[0]; prevbbtime = Time[shift]; } if(trend[shift+1] != trend[shift+2]) mult[1] = Deviation; if(UpBandPrice <= 6) upprice[shift] = iMA(NULL,0,1,0,0,(int)UpBandPrice,shift); else if(UpBandPrice > 6 && UpBandPrice <= 13) upprice[shift] = HeikenAshi(0,UpBandPrice-7,cBars + length + dev_length,shift); if(LoBandPrice <= 6) loprice[shift] = iMA(NULL,0,1,0,0,(int)LoBandPrice,shift); else if(LoBandPrice > 6 && LoBandPrice <= 13) loprice[shift] = HeikenAshi(1,LoBandPrice-7,cBars + length + dev_length,shift); upma[shift] = allAveragesOnArray(0,upprice,length,MA_Method,masize,cBars + length + dev_length,shift); loma[shift] = allAveragesOnArray(1,loprice,length,MA_Method,masize,cBars + length + dev_length,shift); double upStdDev = stdDev(upprice,upma,dev_length,shift); double dnStdDev = stdDev(loprice,loma,dev_length,shift); if(mult[1] < MinDeviation) mult[1] = MinDeviation; upband1[0] = upma[shift] + mult[1]*upStdDev; dnband1[0] = loma[shift] - mult[1]*dnStdDev; upband2[0] = upband1[0] + 0.5*(MoneyRisk - 1)*(upband1[0] - dnband1[0]); dnband2[0] = dnband1[0] - 0.5*(MoneyRisk - 1)*(upband1[0] - dnband1[0]); trend[shift] = trend[shift+1]; mult[0] = mult[1]; hh[0] = hh[1]; ll[0] = ll[1]; switch(BreakOutMode) { case 1: if(upprice[shift] > upband1[1] && trend[shift+1] <= 0) {trend[shift] = 1; hh[0] = upprice[shift];} if(loprice[shift] < dnband1[1] && trend[shift+1] >= 0) {trend[shift] =-1; ll[0] = loprice[shift];} break; case 2: if(upma[shift] > upband1[1] && trend[shift+1] <= 0) {trend[shift] = 1; hh[0] = upprice[shift];} if(loma[shift] < dnband1[1] && trend[shift+1] >= 0) {trend[shift] =-1; ll[0] = loprice[shift];} break; default: if(Close[shift] > upband1[1] && trend[shift+1] <= 0) {trend[shift] = 1; hh[0] = upprice[shift];} if(Close[shift] < dnband1[1] && trend[shift+1] >= 0) {trend[shift] =-1; ll[0] = loprice[shift];} break; } hh[0] = MathMax(upprice[shift],hh[0]); ll[0] = MathMin(loprice[shift],ll[0]); UpTrend[shift] = EMPTY_VALUE; DnTrend[shift] = EMPTY_VALUE; UpSignal[shift] = EMPTY_VALUE; DnSignal[shift] = EMPTY_VALUE; UpLine[shift] = EMPTY_VALUE; DnLine[shift] = EMPTY_VALUE; if(trend[shift] > 0) { if(trend[shift+1] > 0 && Ratchet >= 0) { if(hh[0] > hh[1]) mult[0] -= Ratchet; if(dnband1[0] < dnband1[1]) dnband1[0] = dnband1[1]; if(dnband2[0] < dnband2[1]) dnband2[0] = dnband2[1]; } if(ShowDots ) UpTrend[shift] = dnband2[0]; if(ShowLines) UpLine[shift] = dnband2[0]; if(ShowSignals && trend[shift+1] < 0) UpSignal[shift] = dnband2[0]; } if(trend[shift] < 0) { if(trend[shift+1] < 0 && Ratchet >= 0) { if(ll[0] < ll[1]) mult[0] -= Ratchet; if(upband1[0] > upband1[1]) upband1[0] = upband1[1]; if(upband2[0] > upband2[1]) upband2[0] = upband2[1]; } if(ShowDots ) DnTrend[shift] = upband2[0]; if(ShowLines) DnLine[shift] = upband2[0]; if(ShowSignals && trend[shift+1] > 0) DnSignal[shift] = upband2[0]; } } //---- if(AlertOn || EmailOn || PushNotificationOn) { bool uptrend = trend[AlertShift] > 0 && trend[AlertShift+1] <= 0; bool dntrend = trend[AlertShift] < 0 && trend[AlertShift+1] >= 0; if(uptrend || dntrend) { if(isNewBar(timeframe)) { if(AlertOn) { BoxAlert(uptrend," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits)); BoxAlert(dntrend," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits)); } if(EmailOn) { EmailAlert(uptrend,"BUY" ," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits),EmailsNumber); EmailAlert(dntrend,"SELL"," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits),EmailsNumber); } if(PushNotificationOn) { PushAlert(uptrend," : BUY Signal @ " +DoubleToStr(Close[AlertShift],Digits)); PushAlert(dntrend," : SELL Signal @ "+DoubleToStr(Close[AlertShift],Digits)); } } else { if(AlertOn) { WarningSound(uptrend,SoundsNumber,SoundsPause,UpTrendSound,Time[AlertShift]); WarningSound(dntrend,SoundsNumber,SoundsPause,DnTrendSound,Time[AlertShift]); } } } } 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); } //---- 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[3]; double allAveragesOnArray(int index,double& price[],int period,int mode,int arraysize,int cbars,int bar) { if(period == 1) return(price[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 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 Average double SMAOnArray(double& array[],int per,int bar) { double sum = 0; for(int i=0;i= cbars - 2) double ema = price; else ema = prev + 2.0/(1 + per)*(price - prev); return(ema); } // MA_Method=2: Wilder - Wilder Exponential Moving Average double WilderOnArray(double price,double prev,int per,int cbars,int bar) { if(bar >= cbars - 2) double wilder = price; else wilder = prev + (price - prev)/per; return(wilder); } // MA_Method=3: LWMA - Linear Weighted Moving Average double LWMAOnArray(double& array[],int per,int bar) { double sum = 0, weight = 0; for(int i=0;i 0) return(sum/weight); else return(0); } // MA_Method=4: SineWMA - Sine Weighted Moving Average double SineWMAOnArray(double& array[],int per,int bar) { double sum = 0, weight = 0; for(int i=0;i 0) return(sum/weight); else return(0); } // MA_Method=5: TriMA - Triangular Moving Average double TriMAOnArray(double& array[],int per,int bar) { int len = MathCeil((per + 1)*0.5); double sum = 0; for(int i=0;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 Average double SMMAOnArray(double& array[],double prev,int per,int cbars,int bar) { if(bar == cbars - per) double smma = SMAOnArray(array,per,bar); else if(bar < cbars - per) { double sum = 0; for(int i=0;i= cbars - lag) double zema = price[bar]; else zema = alpha*(2*price[bar] - price[bar+lag]) + (1 - alpha)*prev; return(zema); } // MA_Method=10: DEMA - Double Exponential Moving Average by Patrick Mulloy double 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;} else if(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.Tillson double 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; } else if(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.Ehlers double 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 Median double MedianOnArray(double& price[],int per,int bar) { double array[]; ArrayResize(array,per); for(int i=0;i 0) double median = array[num]; else median = 0.5*(array[num] + array[num+1]); return(median); } // MA_Method=14: GeoMean - Geometric Mean double 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= cbars - 3) double rema = price; else rema = (array[1]*(1 + 2*lambda) + alpha*(price - array[1]) - lambda*array[2])/(1 + lambda); return(rema); } // MA_Method=16: ILRS - Integral of Linear Regression Slope double 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 0) return(sum/weight); else return(0); } // MA_Method=20: JSmooth - Smoothing by Mark Jurik double 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;} else if(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 SMA double SMA_eqOnArray(double& price[],double& array[],int per,int cbars,int bar) { if(bar == cbars - per) double sma = SMAOnArray(price,per,bar); else if(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 Cascino double 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= cbars - order) tmp[i][index][0] = price; else { if(i == 0) tmp[i][index][0] = (1 - gamma)*price + gamma*tmp[i][index][1]; else tmp[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 Dynamic double McGinleyOnArray(double price,double prev,int per,int cbars,int bar) { if(bar == cbars - 2) double md = price; else if(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 filter double 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 filter double 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 filter double 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.Ehlers double 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.Fries double 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= 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