//+------------------------------------------------------------------+ //| AllAverages_v1.1.mq4 | //| Copyright © 2007-08, TrendLaboratory | //| http://finance.groups.yahoo.com/group/TrendLaboratory | //| E-mail: igorad2003@yahoo.co.uk | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007-08, TrendLaboratory" #property link "http://finance.groups.yahoo.com/group/TrendLaboratory" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Orange #property indicator_width1 2 //---- indicator parameters extern int Price=0; extern int MA_Period=14; extern int MA_Shift=0; extern int MA_Method=12; //---- indicator buffers double MA[]; double aPrice[]; double tmp[][6]; double tmp2[]; double tmp3[]; double tmp4[]; //---- int draw_begin; string short_name; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- drawing settings SetIndexStyle(0,DRAW_LINE); SetIndexShift(0,MA_Shift); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); draw_begin=MA_Period; //---- indicator short name switch(MA_Method) { case 1 : short_name="EMA("; break; case 2 : short_name="Wilder("; break; case 3 : short_name="LWMA("; break; case 4 : short_name="SineWMA("; break; case 5 : short_name="TriMA("; break; case 6 : short_name="LSMA("; break; case 7 : short_name="SMMA("; break; case 8 : short_name="MMA("; break; case 9 : short_name="HMA("; break; case 10: short_name="ZeroLagEMA("; break; case 11: short_name="DEMA("; break; case 12: short_name="T3("; break; default: MA_Method=0; short_name="SMA("; } IndicatorShortName(short_name+MA_Period+")"); SetIndexDrawBegin(0,draw_begin); SetIndexLabel(0,short_name+MA_Period+")"); //---- indicator buffers mapping IndicatorBuffers(2); SetIndexBuffer(0,MA); SetIndexBuffer(1,aPrice); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int limit, i, shift; int counted_bars=IndicatorCounted(); ArrayResize(tmp,Bars+1); if(counted_bars<1) for(i=1;i<=draw_begin;i++) MA[Bars-i]=iMA(NULL,0,1,0,0,Price,Bars-i); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars-1; for(shift=limit; shift>=0; shift--) aPrice[shift] = iMA(NULL,0,1,0,0,Price,shift); for(shift=limit; shift>=0; shift--) { switch(MA_Method) { case 1 : MA[shift] = EMA(aPrice,MA,MA_Period,shift); break; case 2 : MA[shift] = Wilder(aPrice,MA,MA_Period,shift); break; case 3 : MA[shift] = LWMA(aPrice,MA_Period,shift); break; case 4 : MA[shift] = SineWMA(aPrice,MA_Period,shift); break; case 5 : MA[shift] = TriMA(aPrice,MA_Period,shift); break; case 6 : MA[shift] = LSMA(aPrice,MA_Period,shift); break; case 7 : MA[shift] = SMMA(aPrice,MA,MA_Period,shift); break; case 8 : MA[shift] = MMA(aPrice,MA_Period,shift); break; case 9 : MA[shift] = HMA(aPrice,MA_Period,shift); break; case 10: MA[shift] = ZeroLagEMA(aPrice,MA,MA_Period,shift); break; case 11: MA[shift] = DEMA(0,aPrice[shift],MA_Period,1,shift); break; case 12: MA[shift] = T3(aPrice[shift],MA_Period,0.7,shift); break; default: MA[shift] = SMA(aPrice,MA_Period,shift); break; } } //---- done return(0); } double SMA(double array[],int per,int bar) { double Sum = 0; for(int i = 0;i < per;i++) Sum += array[i+bar]; return(Sum/per); } double EMA(double array1[],double array2[],int per,int bar) { if(bar == Bars - 2) double ema = array1[bar]; else if(bar < Bars - 2) ema = array2[bar+1] + 2.0/(1+per)*(array1[bar] - array2[bar+1]); return(ema); } double Wilder(double array1[],double array2[],int per,int bar) { if(bar == Bars - per) double wilder = SMA(array1,per,bar); else if(bar < Bars - per) wilder = array2[bar+1] + (array1[bar] - array2[bar+1])/per; return(wilder); } double LWMA(double array[],int per,int bar) { double Sum = 0; double Weight = 0; for(int i = 0;i < per;i++) { Weight+= (per - i); Sum += array[bar+i]*(per - i); } if(Weight>0) double lwma = Sum/Weight; else lwma = 0; return(lwma); } double SineWMA(double array[],int per,int bar) { double pi = 3.1415926535; double Sum = 0; double Weight = 0; double del = 0.5*pi/per; for(int i = 0;i < per;i++) { Weight+= MathSin(0.5*pi - del*i); Sum += array[bar+i]*MathSin(0.5*pi - del*i); } if(Weight>0) double swma = Sum/Weight; else swma = 0; return(swma); } double TriMA(double array[],int per,int bar) { double sma[]; int len = MathCeil((per+1)*0.5); ArrayResize(sma,len); for(int i = 0;i < len;i++) sma[i] = SMA(array,len,bar+i); double trima = SMA(sma,len,0); return(trima); } double LSMA(double array[],int per,int bar) { double Sum=0; for(int i=per; i>=1; i--) Sum += (i-(per+1)/3.0)*array[per-i+bar]; double lsma = Sum*6/(per*(per+1)); return(lsma); } double SMMA(double array1[],double array2[],int per,int bar) { if(bar == Bars - per) double smma = SMA(array1,per,bar); else if(bar < Bars - per) { double Sum = 0; for(int i = 0;i < per;i++) Sum += array1[i+bar+1]; smma = (Sum - array2[bar+1] + array1[bar])/per; } return(smma); } double MMA(double array[],int per,int bar) { double Slope = 0; for (int i = 1;i <= per;i++) { double Factor = 1 + (2 * (i - 1)); Slope += (array[bar + i - 1] * ((per - Factor)/2)); } double sma = SMA(array,per,bar); double mma = sma + (6 * Slope) / ((per + 1) * per); return(mma); } double HMA(double array[],int per,int bar) { double tmp[]; int len = MathSqrt(per); ArrayResize(tmp,len); for(int i = 0; i < len;i++) tmp[i] = 2*LWMA(array,per/2,bar+i) - LWMA(array,per,bar+i); double hma = LWMA(tmp,len,0); return(hma); } double ZeroLagEMA(double array1[],double array2[],int per,int bar) { double alfa = 2.0/(1+per); int lag = 0.5*(per - 1); if(bar == Bars - lag) double zema = array1[bar]; else if(bar < Bars - lag) zema = alfa*(2*array1[bar] - array1[bar+lag]) + (1-alfa)*array2[bar+1]; return(zema); } double DEMA(int num,double price,int per,double v,int bar) { int b = Bars - bar; if(bar == Bars - 2) {double dema = price; tmp[b][num] = dema; tmp[b][num+1] = dema;} else if(bar < Bars - 2) { tmp[b][num] = tmp[b-1][num] + 2.0/(1+per)*(price - tmp[b-1][num]); tmp[b][num+1] = tmp[b-1][num+1] + 2.0/(1+per)*(tmp[b][num] - tmp[b-1][num+1]); dema = (1+v)*tmp[b][num] - v*tmp[b][num+1]; //if(bar==0) Print("Bars=",Bars," bar=", bar," tmp0=",tmp[b][num]," tmp1=",tmp[b-1][num]," pr=",price); } return(dema); } double T3(double price,int per,double v,int bar) { int b = Bars - bar; if(bar == Bars - 2) { double T3 = price; for(int k=0;k<=5;k++) tmp[b][k] = T3; } else if(bar < Bars - 2) { double dema1 = DEMA(0,price,per,v,bar); double dema2 = DEMA(2,dema1,per,v,bar); T3 = DEMA(4,dema2,per,v,bar); } return(T3); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features: