DMA即差离移动平均,算法很简单,就是用短周期均线减去长周期均线,得到一个值,再把这个值按周期算一个新的均值。
源代码及解读如下:
Params
Numeric FastLength(10 );//声明数值参数FastLength,初值10.//
Numeric SlowLength(50 );//声明数值参数SlowLength,初值50.//
Numeric SmoothLength(10);//声明数值参数SmoothLength,初值10.//
Vars
NumericSeries DMAValue;//声明数值序列变量DMAValue。//
Numeric AvgDMA;//声明数值变量AvgDMA。//
Begin
DMAValue =(AverageFC(Close, FastLength) - AverageFC(Close,SlowLength));//这里算短周期与长周期的均线,两个一相减,即可得到变量DMAValue值了。//
AvgDMA = AverageFC(DMAValue,SmoothLength); //把求得的变量DMAValue值与周期10带回求均值函数,即可求得变量AvgDMA值了。//
PlotNumeric("DMA",DMAValue); //画线DMA,值为DMAValue。//
PlotNumeric("DMA Average",AvgDMA); //画线DMA Average,值为AvgDMA。//
PlotNumeric("Ref",0);//画零线。//
End
写成简单的程序化系统,跟双均线差不多了,代码及结果如下:
Params
Numeric FastLength(10 );
Numeric SlowLength(50 );
Numeric SmoothLength(10);
Numeric DslowLength(200);
Vars
NumericSeries DMAValue;
NumericSeries AvgDMA;
NumericSeries AvgValue3;
Begin
DMAValue =(AverageFC(Close, FastLength) - AverageFC(Close,SlowLength));
AvgDMA = AverageFC(DMAValue,SmoothLength);
AvgValue3 = AverageFC(Close,DslowLength);
PlotNumeric("MA3",AvgValue3);
If(MarketPosition <>1 And DMAValue[1]>AvgDMA[1] && High >= AvgValue3[1])
{
Buy(1,Max(Open , AvgValue3 ));
}
If(MarketPosition ==1 && DMAValue[1] < AvgDMA[1])
{
Sell(1,Open);
}
If(MarketPosition <> -1 And DMAValue[1]<AvgDMA[1] && Low < AvgValue3[1])
{
SellShort(1,Min(Open , AvgValue3 ));
}
If(MarketPosition ==-1 && DMAValue[1] > AvgDMA[1])
{
BuyToCover(1,open);
}
End