策略说明:
本策略基于用波动加权后的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
这是一个很不错的系统,有兴趣的可以自己测试了解一下