今天解读的是TB系统里自带的程序化系统,即成交量加权动量交易系统,也不废话了,直接来看它的策略规则,如下:
基于动量系统, 通过交易量加权进行判断
系统要素:
1. 用VWM上穿零轴判断多头趋势
2. 用VWM下穿零轴判断空头趋势
入场条件:
1. 价格高于VWM上穿零轴时价格通道,且在SetupLen的BAR数目内,做多
2. 价格低于UWM下穿零轴时价格通道,在SetupLen的BAR数目内,做空
出场条件:
1. 空头势多单出场
2. 多头势空单出场
TB里多空代码是分开来写的,我这也不给合在一起了,两代码内容差不多,就是多空买卖的时候把条件反过来就行,先看它做空的代码及解读如下:
Params
Numeric MomLen(5); //声明数值参数MomLen,初值5,即VWM的参数了。//
Numeric AvgLen(20); //声明数值参数AvgLen,初值20,亦即VWM的参数。//
Numeric ATRLen(5); //声明数值参数ATRLen,初值5,即ATR的参数。//
Numeric ATRPcnt(0.5); //声明数值参数ATRPcnt,初值0.5,即入场价格波动率参数。//
Numeric SetupLen(5); //声明数值参数SetupLen,初值5,即条件持续有效K线数。//
Vars
NumericSeries VWM(0); //声明序列变量VWM,初值0.//
NumericSeries AATR(0); //声明序列变量AATR,初值0.//
NumericSeries SEPrice(0); //声明序列变量SEPrice,初值0.//
BoolSeries BullSetup(False); //声明布尔型序列变量BullSetup,初值为假。//
BoolSeries BearSetup(False); //声明布尔型序列变量BearSetup,初值为假。//
NumericSeries SSetup(0);//声明序列变量SSetup,初值0.//
Begin
If(!CallAuctionFilter()) Return;// 集合竞价和小节休息过滤。//
VWM = XAverage(Vol * Momentum(Close, MomLen), AvgLen); //固定函数Vol,直接用表示的就是成交量;求动量函数Momentum(Close, MomLen),意思计算5周期以来的收盘价的动量值;函数XAverage,就是求平均值,把动量乘以成交量所得的值与20周期返回去求平均值了。//
AATR = AvgTrueRange(ATRLen);//函数AvgTrueRange,求真实波动值,这个之前也解读过了,把参数5返回去求值就得了。//
BullSetup = CrossOver(VWM,0); // 函数CrossOver,即突破了,变量VWM突破0线。//
BearSetup = CrossUnder(VWM,0); //变量VWM下穿0线。//
If (BearSetup ) //假如布尔型序列变量BearSetup为真。//
{
SSetup = 0;//变量SSetup = 0 //
SEPrice = Close; //变量SEPrice = 当前收盘价。//
}
Else //变量BearSetup为假的时候。//
SSetup = SSetup[1] + 1; //变量SSetup = 前一个变量SSetup[1] + 1.//
//系统入场
If (CurrentBar > AvgLen and MarketPosition == 0 ) //假如当前公式应用商品在当前Bar的索引值 > 5,并且当前没有持仓的。//
{
If( Low <=SEPrice[1] - (ATRPcnt * AATR[1]) and SSetup[1] <= SetupLen and SSetup >= 1 And Vol > 0) //假如当前最低价Low <= 前一个变量SEPrice[1] - (0.5*前一个AATR[1] ),并且前一变量SSetup[1] <= 当前变量SetupLen ,并且SSetup >=1 ,并且成交量Vol >0//
{
SellShort(0, Min(Open,SEPrice[1] - (ATRPcnt * AATR[1]))) ; //卖出1手,价格就是开盘价与这计算公式的价格对比了,取小值。//
}
}
//系统出场
If (MarketPosition == -1 and BarsSinceEntry > 0 And Vol > 0) //假如持有空单,并且建仓位大于0,而且成交量大于0。//
{
If( BullSetup[1] == True )//假如前一个变量BullSetup[1] 为真。//
{
Buytocover(0,Open);//以开盘价平空单仓。//
}
}
End
结果看着一般吧,但这个只是做空的,还没有跟做多的结合起来,下列就是做多代码及结果:
Params
Numeric MomLen(5);
Numeric AvgLen(20);
Numeric ATRLen(5);
Numeric ATRPcnt(0.5);
Numeric SetupLen(5);
Vars
NumericSeries VWM(0);
NumericSeries AATR(0);
NumericSeries LEPrice(0);
NumericSeries SEPrice(0);
boolSeries BullSetup(False);
boolSeries BearSetup(False);
NumericSeries LSetup(0);
NumericSeries SSetup(0);
Begin
// 集合竞价和小节休息过滤
If(!CallAuctionFilter()) Return;
VWM = XAverage(Vol * Momentum(Close, MomLen), AvgLen);
AATR = AvgTrueRange(ATRLen);
BullSetup = CrossOver(VWM,0);
BearSetup = CrossUnder(VWM,0);
If (BullSetup)
{
LSetup = 0;
LEPrice = Close;
}
Else LSetup = LSetup[1] + 1;
//系统入场
IF ( CurrentBar > AvgLen and MarketPosition == 0 )
{
If(High >= LEPrice[1] + (ATRPcnt * AATR[1]) and LSetup[1] <= SetupLen and LSetup >= 1 And Vol > 0)
{
Buy(0, max(Open,LEPrice[1] + (ATRPcnt * AATR[1])));
}
}
//系统出场
IF (MarketPosition == 1 and BarsSinceEntry>0 And Vol > 0)
{
If(BearSetup[1] == True)
{
Sell(0,Open);
}
}
End
结果就是这样了,喜欢的可以试着优化一下参数,统计一个合适的参数来,不喜欢的,就略掉了。