期货软件TB系统源代码解读系列40-成交量加权动量交易系统

今天解读的是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

结果就是这样了,喜欢的可以试着优化一下参数,统计一个合适的参数来,不喜欢的,就略掉了。

你可能感兴趣的:(期货软件TB系统源代码解读系列40-成交量加权动量交易系统)