// MA_Method=0: SMA - Simple Moving Average
double SMA(int price,int per,int bar)
{
double Sum = 0;
for(int i = 0;i < per;i++) Sum += iMA(NULL,0,1,0,0,price,bar+i);
return(Sum/per);
}
double 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 Average
double EMA(int price,double prev,int per,int bar)
{
if(bar >= Bars - 2) double ema = iMA(NULL,0,1,0,0,price,bar);
else
ema = prev + 2.0/(1+per)*(iMA(NULL,0,1,0,0,price,bar) - prev);
return(ema);
}
// MA_Method=2: Wilder - Wilder Exponential Moving Average
double Wilder(int price,double prev,int per,int bar)
{
if(bar >= Bars - 2) double wilder = iMA(NULL,0,1,0,0,price,bar); //SMA(array1,per,bar);
else
wilder = prev + (iMA(NULL,0,1,0,0,price,bar) - prev)/per;
return(wilder);
}
// MA_Method=3: LWMA - Linear Weighted Moving Average
double LWMA(int price,int per,int bar)
{
double Sum = 0;
double Weight = 0;
for(int i = 0;i < per;i++)
{
Weight+= (per - i);
Sum += iMA(NULL,0,1,0,0,price,bar+i)*(per - i);
}
if(Weight>0) double lwma = Sum/Weight;
else lwma = 0;
return(lwma);
}
double LWMAOnArray(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);
}
// MA_Method=4: SineWMA - Sine Weighted Moving Average
double SineWMA(int price,int per,int bar)
{
double pi = 3.1415926535;
double Sum = 0;
double Weight = 0;
for(int i = 0;i < per;i++)
{
Weight+= MathSin(pi*(i+1)/(per+1));
Sum += iMA(NULL,0,1,0,0,price,bar+i)*MathSin(pi*(i+1)/(per+1));
}
if(Weight>0) double swma = Sum/Weight;
else swma = 0;
return(swma);
}
// MA_Method=5: TriMA - Triangular Moving Average
double TriMA(int price,int per,int bar)
{
double sma;
int len = MathCeil((per+1)*0.5);
double sum=0;
for(int i = 0;i < len;i++)
{
sma = SMA(price,len,bar+i);
sum += sma;
}
double trima = sum/len;
return(trima);
}
// MA_Method=6: LSMA - Least Square Moving Average (or EPMA, Linear Regression Line)
double LSMA(int price,int per,int bar)
{
double Sum=0;
for(int i=per; i>=1; i--) Sum += (i-(per+1)/3.0)*iMA(NULL,0,1,0,0,price,bar+per-i);
double lsma = Sum*6/(per*(per+1));
return(lsma);
}
// MA_Method=7: SMMA - Smoothed Moving Average
double SMMA(int price,double prev,int per,int bar)
{
if(bar == Bars - per) double smma = SMA(price,per,bar);
else
if(bar < Bars - per)
{
double Sum = 0;
for(int i = 0;i < per;i++) Sum += iMA(NULL,0,1,0,0,price,bar+i+1);
smma = (Sum - prev + iMA(NULL,0,1,0,0,price,bar))/per;
}
return(smma);
}
// MA_Method=8: HMA - Hull Moving Average by Alan Hull
double HMA(int price,int per,int bar)
{
double _tmp[];
int len = MathSqrt(per);
ArrayResize(_tmp,len);
if(bar == Bars - per) double hma = iMA(NULL,0,1,0,0,price,bar);
else
if(bar < Bars - per)
{
for(int i=0;i<len;i++) _tmp[i] = 2*LWMA(price,per/2,bar+i) - LWMA(price,per,bar+i);
hma = LWMAOnArray(_tmp,len,0);
}
return(hma);
}
// MA_Method=9: ZeroLagEMA - Zero-Lag Exponential Moving Average
double ZeroLagEMA(int price,double prev,int per,int bar)
{
double alfa = 2.0/(1+per);
int lag = 0.5*(per - 1);
if(bar >= Bars - lag) double zema = iMA(NULL,0,1,0,0,price,bar);
else
zema = alfa*(2*iMA(NULL,0,1,0,0,price,bar) - iMA(NULL,0,1,0,0,price,bar+lag)) + (1-alfa)*prev;
return(zema);
}
// MA_Method=10: DEMA - Double Exponential Moving Average by Patrick Mulloy
double DEMA(int index,int num,int price,double per,double v,int bar)
{
double alpha = 2.0/(1+per);
if(bar == Bars - 2) {double dema = iMA(NULL,0,1,0,0,price,bar); tmp[num][index][0] = dema; tmp[num+1][index][0] = dema;}
else
if(bar < Bars - 2)
{
tmp[num ][index][0] = tmp[num ][index][1] + alpha*(iMA(NULL,0,1,0,0,price,bar) - 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);
}
double DEMAOnArray(int index,int num,double price,double per,double v,int bar)
{
double alpha = 2.0/(1+per);
if(bar == Bars - 2) {double dema = price; tmp[num][index][0] = dema; tmp[num+1][index][0] = dema;}
else
if(bar < Bars - 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_basic(int index,int num,int price,int per,double v,int bar)
{
double dema1, dema2;
if(bar == Bars - 2)
{
double T3 = iMA(NULL,0,1,0,0,price,bar);
for(int k=0;k<6;k++) tmp[num+k][index][0] = T3;
}
else
if(bar < Bars - 2)
{
T3 = iMA(NULL,0,1,0,0,price,bar);
dema1 = DEMAOnArray(index,num ,T3 ,per,v,bar);
dema2 = DEMAOnArray(index,num+2,dema1,per,v,bar);
T3 = DEMAOnArray(index,num+4,dema2,per,v,bar);
}
return(T3);
}
// MA_Method=12: ITrend - Instantaneous Trendline by J.Ehlers
double ITrend(int price,double& array[],int per,int bar)
{
double alfa = 2.0/(per + 1);
if(bar < Bars - 7)
double it = (alfa - 0.25*alfa*alfa)*iMA(NULL,0,1,0,0,price,bar) + 0.5*alfa*alfa*iMA(NULL,0,1,0,0,price,bar+1)
- (alfa - 0.75*alfa*alfa)*iMA(NULL,0,1,0,0,price,bar+2) + 2*(1-alfa)*array[1] - (1-alfa)*(1-alfa)*array[2];
else
it = (iMA(NULL,0,1,0,0,price,bar) + 2*iMA(NULL,0,1,0,0,price,bar+1) + iMA(NULL,0,1,0,0,price,bar)+2)/4;
return(it);
}
// MA_Method=13: Median - Moving Median
double Median(int price,int per,int bar)
{
double array[];
ArrayResize(array,per);
for(int i = 0; i < per;i++) array[i] = iMA(NULL,0,1,0,0,price,bar+i);
ArraySort(array);
int num = MathRound((per-1)/2);
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 Mean
double GeoMean(int price,int per,int bar)
{
if(bar < Bars - per)
{
double gmean = MathPow(iMA(NULL,0,1,0,0,price,bar),1.0/per);
for(int i = 1; i < per;i++) gmean *= MathPow(iMA(NULL,0,1,0,0,price,bar+i),1.0/per);
}
return(gmean);
}
// MA_Method=15: REMA - Regularized EMA by Chris Satchwell
double REMA(int price,double& array[],int per,double lambda,int bar)
{
double alpha = 2.0/(per + 1);
if(bar >= Bars - 3) double rema = iMA(NULL,0,1,0,0,price,bar);
else
rema = (array[1]*(1+2*lambda) + alpha*(iMA(NULL,0,1,0,0,price,bar) - array[1]) - lambda*array[2])/(1+lambda);
return(rema);
}
// MA_Method=16: ILRS - Integral of Linear Regression Slope
double ILRS(int 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*iMA(NULL,0,1,0,0,price,bar+i);
sumy += iMA(NULL,0,1,0,0,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 + SMA(price,per,bar);
return(ilrs);
}
// MA_Method=17: IE/2 - Combination of LSMA and ILRS
double IE2(int price,int per,int bar)
{
double ie = 0.5*(ILRS(price,per,bar) + LSMA(price,per,bar));
return(ie);
}
// MA_Method=18: TriMAgen - Triangular Moving Average Generalized by J.Ehlers
double TriMA_gen(int price,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 += SMA(price,len1,bar+i);
double trimagen = sum/len2;
return(trimagen);
}
double 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);
double trimagen = sum/len2;
return(trimagen);
}
// MA_Method=19: VWMA - Volume Weighted Moving Average
double VWMA(int price,int per,int bar)
{
double Sum = 0;
double Weight = 0;
for(int i = 0;i < per;i++)
{
Weight+= Volume[bar+i];
Sum += iMA(NULL,0,1,0,0,price,bar+i)*Volume[bar+i];
}
if(Weight>0) double vwma = Sum/Weight;
else vwma = 0;
return(vwma);
}
// MA_Method=20: JSmooth - Smoothing by Mark Jurik
double JSmooth(int index,int num,int price,int per,double pow,int bar)
{
double beta = 0.45*(per-1)/(0.45*(per-1)+2);
double alpha = MathPow(beta,pow);
double _ma = iMA(NULL,0,1,0,0,price,bar);
if(bar == Bars - 2)
{
tmp[num+4][index][0] = _ma;
tmp[num+0][index][0] = _ma;
tmp[num+2][index][0] = _ma;
}
else
if(bar < Bars - 2)
{
tmp[num+0][index][0] = (1-alpha)*_ma + alpha*tmp[num+0][index][1];
tmp[num+1][index][0] = (_ma - 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_eq(int price,double& array[],int per,int bar)
{
if(bar == Bars - per) double sma = SMA(price,per,bar);
else
if(bar < Bars - per) sma = (iMA(NULL,0,1,0,0,price,bar) - iMA(NULL,0,1,0,0,price,bar+per))/per + array[1];
return(sma);
}
// MA_Method=22: ALMA by Arnaud Legoux / Dimitris Kouzis-Loukas / Anthony Cascino
double ALMA(int price,int per,double offset,double sigma,int bar)
{
double m = MathFloor(offset * (per - 1));
double s = per/sigma;
double w, sum =0, wsum = 0;
for (int i=0;i < per;i++)
{
w = MathExp(-((i - m)*(i - m))/(2*s*s));
wsum += w;
sum += iMA(NULL,0,1,0,0,price,bar+(per-1-i))*w;
}
if(wsum != 0) double alma = sum/wsum;
return(alma);
}
// MA_Method=23: TEMA - Triple Exponential Moving Average by Patrick Mulloy
double TEMA(int index,int price,int per,double v,int bar)
{
double alpha = 2.0/(per+1);
double _ma = iMA(NULL,0,1,0,0,price,bar);
if(bar == Bars - 2) {tmp[0][index][0] = _ma; tmp[1][index][0] = _ma; tmp[2][index][0] = _ma;}
else
if(bar < Bars - 2)
{
tmp[0][index][0] = tmp[0][index][1] + alpha *(_ma - 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 T3(int index,int num,double price,int per,double v,int bar)
{
double len = MathMax((per + 5.0)/3.0-1,1), dema1, dema2;
double T3, _ma = iMA(NULL,0,1,0,0,price,bar);
if(bar == Bars - 2) for(int k=0;k<6;k++) tmp[num+k][index][0] = _ma;
else
if(bar < Bars - 2)
{
dema1 = DEMAOnArray(index,num ,_ma ,len,v,bar);
dema2 = DEMAOnArray(index,num+2,dema1,len,v,bar);
T3 = DEMAOnArray(index,num+4,dema2,len,v,bar);
}
return(T3);
}
// MA_Method=25: Laguerre filter by J.Ehlers
double Laguerre(int index,int price,int per,int order,int bar)
{
double gamma = 1-10.0/(per+9);
double _ma = iMA(NULL,0,1,0,0,price,bar);
double aPrice[];
ArrayResize(aPrice,order);
for(int i=0;i<order;i++)
{
if(bar >= Bars - order) tmp[i][index][0] = _ma;
else
{
if(i == 0) tmp[i][index][0] = (1 - gamma)*_ma + 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 McGinley(int price,double prev,int per,int bar)
{
if(bar == Bars - 2) double md = iMA(NULL,0,1,0,0,price,bar);
else
if(bar < Bars - 2 && prev > 0)
{
double p = iMA(NULL,0,1,0,0,price,bar);
md = prev + (p - prev)/(per*MathPow(p/prev,4)/2);
}
return(md);
}
微信公众号:天泓评测
发表评论