先说一下策略的思路:在现货指数突破某个价位时,对应的期货实时发单,下面是核心代码:
var
Global Numeric BuyLine; //全局变量,触发的临界值,用现货指数计算
OnInit()
{
Range[0:DataCount-1]
{
//=========数据源相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
}
}
OnBar(ArrayRef<Integer> indexs)
{
Range[0:0] //现货指数图层
{
...........................此处省略代码
BuyLine = Open[0] + Ks_temp*R
}
Range[2:2] //期货指数图层
{
If(data0.High > BuyLine and MarketPosition==0)
{
Buy(lot,max(open,buyline));//我在此处假设期货的价格与现货不会有太大的升贴水,让期货以buyline的价格买入。
//Commentary(\"RealOpen=\" + Text(RealOpen) + \" Buyline=\" + Text(BuyLine));
data1.PlotString(\"Buy\",\"多\",low,red);
}
}
回到策略的思路:在现货指数突破某个价位时,对应的期货实时发单。
我假设期货的价格与现货不会有太大的升贴水,当现货价格突破buyline时,因为期货价格无法确定,所以让期货以buyline的价格买入进行回测。
但回测时发现,由于后复权的原因,导致期货的open价格总是大于buyline,这样max(open,buyline)执行的结果就是总是以期货K线的open价格买入,而不是突破价,这就导致了偷价情况的发生,回测结果严重偏高!
该怎么实现较真实的回测效果呢,求各位老师指导!
现货指数是什么东西?TB里没有提供这个东西吧?后复权也只是针对888,主力连续指数才有的,现货指数跟后复权又有什么关系?
现货指数,比如说沪深300指数000300,对应的期货主连是if888。
如果你是看沪深300作为条件 然后交易期货主连映射 那为什么期货主连要复权?
“如果你是看沪深300作为条件 然后交易期货主连映射”这正是我想实现的效果,图层0、1是指数,图层2是期货主连。
“为什么期货主连要复权?”老师的意思是说“ AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权”这个代码只需要在range[0:1]图层设置即可?