老师好,我做期货跨期套利。我的价差模型是用时序Open价计算得出的,所以我的开仓价也用Open价。我的策略写在OnBarOpen里面,下面是我的策略代码。按理说Openbaropen在每一根bar启动后执行一次,就能获取当根bar的Open价。我的价差模型diff= Data0.Open-1.11*Data1.Open;应该是在当根bar里面始终都不会变,也就是后面都不会闪烁。但是我在图表里看到diff值在当根bar开始出现时时一个值,很快值又变了,然后再一直保持不变,直到下一根bar又是这样。也就是每根bar我的价差diff都变了一次,这就发生了闪烁。请问这是什么原因。
OnInit()
{
SubscribeBar(\"p9888.DCE\",\"1m\",20220101,0);//棕榈主力
SubscribeBar(\"p9777.DCE\",\"1m\",20220101,0);//棕榈次主力
Range[0:DataCount-1]
{
SetOrderPriceOffset(0);
SetSlippage(Enum_Rate_PointPerHand,0);
AddDataFlag(Enum_Data_AutoSwapPosition());
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());
SetOrderMap2MainSymbol(); //设置委托映射到主力
SetOrderMap2SecondMainSymbol();//设置委托映射到次主力
}
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBarOpen(ArrayRef<Integer> indexs)
{
If(CurrentBar<Boll) Return;
diff = Data0.Open-1.11*Data1.Open;
PlotNumeric(\"diff\",diff,0,White);
mb = AverageFC(diff,Boll);
PlotNumeric(\"mb\",mb,0,Yellow);
dev = StandardDev(diff,Boll,1);
up = mb+2*dev;
PlotNumeric(\"up\",up,0,Green);
closeup = mb+1*dev;
PlotNumeric(\"closeup\",closeup,0,Blue);
closedn = mb-1*dev;
PlotNumeric(\"closedn\",closedn,0,Blue);
dn = mb-2*dev;
PlotNumeric(\"dn\",dn,0,Green);
//做空价差
If(diff>=up And diff<stopup And diff[1]<up[1] And Data0.MarketPosition==0 And Data1.MarketPosition==0)
{
Data0.SellShort(d0_size,Open);
Data1.Buy(d1_size,Open);
}
//平仓做空价差
If(diff<=closeup And diff[1]>closeup[1] And Data0.MarketPosition<0 And Data1.MarketPosition>0)
{
Data0.BuyToCover(d0_size,Open);
Data1.Sell(d1_size,Open);
}
//做多价差
If(diff<=dn And diff>stopdn And diff[1]>dn[1] And Data0.MarketPosition==0 And Data1.MarketPosition==0)
{
Data0.Buy(d0_size,Open);
Data1.SellShort(d1_size,Open);
}
//平仓做多价差
If(diff>=closedn And diff[1]<closedn[1] And Data0.MarketPosition>0 And Data1.MarketPosition<0)
{
Data0.Sell(d0_size,Open);
Data1.BuyToCover(d1_size,Open);
}
}
需要做一下两个图层的同步延时控制,避免两边第一个tick触发不一致的问题,多图层使用open价经常会遇见此种问题。
我找到问题原因了,两个图层对应的每一个新bar所接收的第一个tick时间不一致的,有先有后,导致价差diff = Data0.Open-1.11*Data1.Open;出现闪烁。但是该怎么去控制呢,等两个图层都接完第一个tick之后在去交易?