系列1主要解释的是移动平均线,接下来解释的也是我们常用MACD指标,及用它编写成的程序化交易。
我们先来看它的函数求指数的平均值XAverage,写好了这个,才好方便直接调用的。代码如下:
Params
NumericSeries Price(10);
Numeric Length(10);
Vars
Numeric sFcactor;
NumericSeries XAvgValue;
Begin
sFcactor = 2 / ( Length + 1 );
if (CurrentBar == 0 )
{
XAvgValue = Price;
}else
{
XAvgValue = XAvgValue[1] + sFcactor * ( Price - XAvgValue[1] ) ;
}
Return XAvgValue;
End
解释如下:
Params
NumericSeries Price(10); //声明参数序列变量价格Price,初始值为10个价格。//
Numeric Length(10); //声明参数Length,初始值为10个周期。//
Vars
Numeric sFcactor;//声明数值型变量为sFcactor//
NumericSeries XAvgValue; //声明数值型序列变量为XAvgValue//
Begin
sFcactor = 2 / ( Length + 1 );//我写个数学式,你们看就懂y=2/(x+1),至于为什么要用这样的公式,那你就去查指数平均详细公式吧,这里再解释太费劲了,你就当它为随周期变化的固定比重系数。//
if (CurrentBar == 0 )//假如是第一个k线。//
{
XAvgValue = Price;//XAvgValue就给它赋值为那根k线的价格。//
}else //除了第一根k线之外的,进行下列计算//
{
XAvgValue = XAvgValue[1] + sFcactor ( Price - XAvgValue[1] ) ; //当前XAvgValue的指数价格 = 它前一根k线的价格+周期比重系数 * (当前的价格 - 前一个的价格)//
}
Return XAvgValue;//昨天解释的,除了返回XAvgValue计算以外,还有一个意思是把计算得到的值反馈给主函数,主函数直接调用这个值。//
End
好了,指数平均值的函数我们解释完了,接下来就该解释MACD的代码意思了,其实,你要是把MACD的计算原理看懂了,这代码看着也就很简单了,这里我也不去费劲解释MACD是怎么计算的了,百度里有详细解释的。
Params
Numeric FastLength(12);//声明数值型参数为FastLength,初始值赋值它为12个周期//
Numeric SlowLength(26);//声明数值型参数为SlowLength,初始值为26个周期。//
Numeric MACDLength(9);//声明数组型参数为MACDLength,初始值为9个周期。//
Vars
NumericSeries MACDValue; //跟k线价格相关,所以用声明数组型序列变量名为MACDValue。//
Numeric AvgMACD;//声明数值型变量名为AvgMACD。//
Numeric MACDDiff;//声明数值型变量名为MACDDiff。//
Begin
MACDValue = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ; //看到直接调用函数XAverage了,它把收盘价输入到上面的Price,FastLength为12替代上面的那个Length数10,计算出结果了,返回这边来。后边那个同理计算出指数价格。//
AvgMACD = XAverage(MACDValue,MACDLength);//这次还是如此,它把上一步计算得到MACDValue的值,返回替代Price的值,用MACDLength周期9,替代10,计算出AvgMACD值。//
MACDDiff = MACDValue - AvgMACD;//MACDDiff值等于MACDValue的值减去AvgMACD的值。//
PlotNumeric("MACD",MACDValue);//MACDValue的值用线MACD画出来。//
PlotNumeric("MACDAvg",AvgMACD);//AvgMACD的值用MACDAvg画出来。//
If (MACDDiff >= 0) //假如MACDDiff的值是大于零的。//
PlotNumeric("MACDDiff",MACDDiff,0,Red); //用红色单线画出MACDDiff。//
Else//否则MACDDiff小于零的情况。//
PlotNumeric("MACDDiff",MACDDiff,0,Green); //用绿色单线画出MACDDiff。//
PlotNumeric("零线",0); //画出值为零的零线。//
End
以上这些代码就是编写了MACD的各线是什么意思,好了,明白了各线的具体求法,那我们就可以运用它了,把你买卖的指令添加进去就可以,其实跟移动平均线的指令差不多。记住了,这MACD程序化针对周期30分钟以上的比较好,时间过小,它的快慢线穿插的过快,交易手续费都不够的,所以时间一般选择30min以上的才好操作。
这个系统如何,我一般不怎么用它的,但观察了一段时间,看着还好吧,可它不符合我的操作风格,一直就搁置着不用的,有兴趣的朋友,可以自己试着观测一段时间,看看如何。这次系统它直接反手买卖,但时间周期长,我就不给它加以限制了。
程序化交易代码如下:
Params
Numeric FastLength(12);
Numeric SlowLength(26);
Numeric MACDLength(9);
Vars
NumericSeries MACDValue;
NumericSeries AvgMACD;
Numeric MACDDiff;
Begin
MACDValue = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;
AvgMACD = XAverage(MACDValue,MACDLength);
MACDDiff = MACDValue - AvgMACD;
// 集合竞价和小节休息过滤
If(!CallAuctionFilter()) Return;
If(MarketPosition <>1 && MACDValue[1] > AvgMACD[1] && MACDDiff >= 0)
{
Buy(1,Open);
}
If(MarketPosition ==1 && MACDValue[1] < AvgMACD[1] )
{
Sell(1,Open);
}
If(MarketPosition <>-1 && MACDValue[1] < AvgMACD[1] && MACDDiff < 0)
{
SellShort(1,Open);
}
If(MarketPosition ==-1 && MACDValue[1] > AvgMACD[1])
{
BuyToCover(1,open);
}
End