期货软件TB系统源代码解读系列71-波动加权后的OBV交易系统

策略说明:

本策略基于用波动加权后的OBV进行判断入场条件,结合高低点突破入场

系统要素:

1. 计算波动加权WOBV,根据WOBV预期均值关系,设定触发条件单

入场条件:

1.当WOBV上穿它的MA时,在当根K线高点建立做多触发单

2.当WOBV下穿它的MA时,在当根K线低点建立做空触发单

出场条件:

1.当WOBV上穿它的MA时,次根K线开盘平空仓

2.当WOBV下穿它的MA时,次根K线开盘平多仓

做多代码及解读如下:

Params

Numeric AvgLength(25);   // 声明数值参数AvgLength,初值25,为计算WOBV的ma周期值。//

Vars

NumericSeries WOBV(0);     // 声明数值序列变量WOBV,初值0,即指标变量。//

NumericSeries SSMA(0);   // 声明数值序列变量SSMA,初值0,即WOBV指标均值变量。//

boolSeries BuySetup(False);  //声明布尔型序列变量BuySetup,初值为假,开多标识。//

NumericSeries LEPrice(0);   //声明数值序列变量LEPrice,初值0,多头触发线。//

bool con;           // 声明布尔型变量con。//

bool con2;          // 声明布尔型变量con2.//

boolSeries con3;       // 声明布尔型序列变量con3.//

Numeric minpoint;    // 声明数值变量minpoint,即最小变动价位。//

Begin

If(!CallAuctionFilter()) Return; // 集合竞价和小节休息过滤。//

minpoint = Minmove*PriceScale;             // 计算最小变动价位。//

// WOBV指标计算。//

If(High - Low <> 0)//假如最高价High - 最低价Low 不等于 0.//

{

WOBV = WOBV + (((Close - Open)/(High - Low))*Vol); // 代入相应初始数值,计算波动加权后的OBV,即得WOBV值。//

}

SSMA = Average(WOBV,AvgLength);    // 计算25周期的WOBV的MA均线。//       

// 多空触发条件计算。//

con = CrossOver(WOBV,SSMA);//变量WOBV上穿SSMA均线。//

If(con) //假如条件con为真。//

{

BuySetup = True;//开多标识BuySetup赋值为真。//

LEPrice = High; //变量LEPrice = 当前最高价High。//

}

con2 = CrossUnder(WOBV,SSMA);//变量WOBV跌穿SSMA均线。//

If(con2) //假如条件con2为真。//

{

BuySetup = False; //开多标识BuySetup赋值为假。//

}

// 做多标识初始化。//

If(MarketPosition == 1)//假如当前持有多单。//

BuySetup = False;//则开多标识赋值为假,即初始化。//

// 系统入场。//

If(MarketPosition == 0)//当前没有持仓。//

{

If(BuySetup[1] and High >= LEPrice[1] + minpoint) //假如前一个开多标识为真,且当前最高价大于等于前一变量LEPrice值加上一跳价格。//

{

Buy(0,max(Open,LEPrice[1] + minpoint));//开多,两价格比较取较大值。//

}

}

// 系统出场 。//

con3 = CrossUnder(WOBV,SSMA); //变量WOBV跌穿SSMA均线。//

If(MarketPosition == 1 and BarsSinceEntry > 0) //当前持有多单,且建仓数位大于0.//

{

If (con3[1]) //假如条件con3[1]成立。//

{

Sell(0,Open);//以开盘价平仓。//

}

}

End

做空代码及结果如下:

Params

Numeric AvgLength(25);   

Vars

NumericSeries WOBV(0);   

NumericSeries SSMA(0);   

boolSeries SellSetup(False); 

NumericSeries SEPrice(0);   

bool con;         

bool con2;         

boolSeries con3;      

Numeric minpoint;    

Begin

If(!CallAuctionFilter()) Return;

minpoint = Minmove*PriceScale;          

If(High - Low <> 0)

{

WOBV = WOBV + (((Close - Open)/(High - Low))*Vol); 

}

SSMA = Average(WOBV,AvgLength);            

con = CrossOver(WOBV,SSMA);

If(con) 

{

SellSetup = False;

}

con2 = CrossUnder(WOBV,SSMA);

If(con2) 

{

SellSetup = True;

SEPrice = Low; 

}

If(MarketPosition == -1 )

SellSetup = False;

If(MarketPosition == 0)

{

If(SellSetup[1] and Low <= SEPrice[1] - minpoint) 

{

SellShort(0,min(Open,SEPrice[1] - minpoint));

}

}

con3 = CrossOver(WOBV,SSMA);

If(MarketPosition == -1 and BarsSinceEntry > 0)

{

If (con3[1]) 

{

Buytocover(0,Open); 

}

}

End

这是一个很不错的系统,有兴趣的可以自己测试了解一下

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