获取主力合约问题,我用指数000做策略就可以正常,999指数就不能订阅获取主力合约了。

Global Integer IsSubs; //是否加载多周期K线标记 Series<String> Contract; //获取合约代码 String ContactMain; //图层1代码 String ContactIndex; //对应指数代码 String Period1; //K线周期 //期货 //Dic<Array<String>> fRollover(\"TB_ROLLOVER\"); //[期货换月合约,期货换月前价格,期货换月后价格] Dic<Array<String>> fRollover(\"TB_ROLLOVER_v2\"); //[期货换月合约,期货换月前价格,期货换月后价格] Series<String> ContactDeal; //交易合约 //共有变量 Series<Numeric> rOpen(0,60); //除权换月后新的开盘价 Series<Numeric> rHigh(0,60); //除权换月后新的最高价 Series<Numeric> rLow(0,60); //除权换月后新的最低价 Series<Numeric> rClose; //除权换月后新的收盘价 Series<Numeric> myRollover(1); //除权换月系数 Defs //此处添加公式函数 Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次OnInit() { If (IsShow==1) cqLine.figure(0); If (IsShow==1) plt_macd.figure(0);//plt_macd和k线同一个画板,独立图表显示 //除权换月 AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 //SetSlippage(Enum_Rate_PointPerHand,1); //设置滑点为1跳/手 //SetOrderPriceOffset(2); //设置委托价为叫买/卖价偏移2跳 SetOrderMap2MainSymbol(); //设置委托映射到主力 } //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 OnBar(ArrayRef<Integer> indexs) { //初始化跨周期K线数据 If (CurrentBar==0 And IsSubs==0) { //获取合约名称 Contract=Symbol(); Print(\"Contract:\"+Contract); SubscribeBar(Contract,Period,BeginDateTime, 0, Enum_Data_RolloverBackWard()); //分钟周期 If (BarType==1) { Period1=Text(BarInterval())+\"m\"; } //获取对应指数代码 ContactMain=Symbol(); String mySymbol=Left(ContactMain,2); String str=Right(mySymbol,1); //截取后面一位看是数字还是字母 If (Exact(Upper(str),Lower(str))) { //Print(\"转换大小写相等,是数字\"); ContactIndex=Left(ContactMain,1)+\"9888\"; }Else { //Print(\"转换大小写不相等,是字母\"); ContactIndex=Left(ContactMain,2)+\"888\"; } Array<String> arr; StringSplit(ContactMain,\".\",arr); ContactIndex=ContactIndex+\".\"+arr[1]; //订阅用于计算均线的日K线和2H数据 SubscribeBar(ContactIndex,Period1,BeginDateTime,0,Enum_Data_RolloverBackWard()); IsSubs=1; }Range[2:2] { Hide(); Commentary(DateTimeToString(GetDicTime(fRollover, 1))); ContactDeal=fRollover[0][0]; Commentary(\"ContactDeal:\"+ContactDeal); If(ExchangeName <> \"上海证券交易所\" And ExchangeName <> \"深圳证券交易所\") //期货换月 { //仅适合1秒到1天之间的周期(包括1秒和1天)。其它周期判断会出现错误 Commentary(TextArray(fRollover[0])); If(GetDicTime(fRollover, 0) <> GetDicTime(fRollover, 1) And fRollover[0][1] <> InvalidString And fRollover[0][2] <> InvalidString) { PlotBool(\"换月\", True); Data0.PlotBool(\"换月\", True); Commentary(\"原合约代码:\" + ContactDeal[1]); Commentary(\"原合约收盘价:\" + fRollover[0][1]); Commentary(\"新合约代码:\" + ContactDeal); Commentary(\"新合约收盘价:\" + fRollover[0][2]); Data0.Commentary(\"原合约代码:\" + Data1.ContactDeal[1]); Data0.Commentary(\"原合约收盘价:\" + Data1.fRollover[0][1]); Data0.Commentary(\"新合约代码:\" + Data1.ContactDeal); Data0.Commentary(\"新合约收盘价:\" + Data1.fRollover[0][2]); myRollover = rClose / Value(fRollover[0][2]); //Lots = Max(1, Round(Data0.CurrentContracts * Value(fRollover[0][1]) / Value(fRollover[0][2]),0)); //Commentary(\"Lots\"); Lots=1; Integer i; Array<Integer> orderIds; //委托ID If(Data0.MarketPosition == 1 And BarStatus==2) { For i = 0 To A_AccountCount - 1 { A_SendOrderEx(ContactDeal[1],Enum_Sell,Enum_Exit,Lots,Q_BidPrice() ,orderIds,\"\",\"\",A_AccountIndex(A_AccountID(i),A_BrokerID(i))); A_SendOrderEx(ContactDeal,Enum_Buy,Enum_Entry,Lots,Q_AskPrice() ,orderIds,\"\",\"\",A_AccountIndex(A_AccountID(i),A_BrokerID(i))); } //Data0.Sell(0, Value(fRollover[0][1]), Enum_Signal_UnCorrectPrice); //Data0.Buy(Lots, Value(fRollover[0][2]), Enum_Signal_UnCorrectPrice); } Else If(Data0.MarketPosition == -1 And BarStatus==2) { For i = 0 To A_AccountCount - 1 { A_SendOrderEx(ContactDeal[1],Enum_Buy,Enum_Exit,Lots,Q_AskPrice() ,orderIds,\"\",\"\",A_AccountIndex(A_AccountID(i),A_BrokerID(i))); A_SendOrderEx(ContactDeal,Enum_Sell,Enum_Entry,Lots,Q_BidPrice() ,orderIds,\"\",\"\",A_AccountIndex(A_AccountID(i),A_BrokerID(i))); } //Data0.BuyToCover(0, Value(fRollover[0][1]), Enum_Signal_UnCorrectPrice); //Data0.SellShort(Lots, Value(fRollover[0][2]), Enum_Signal_UnCorrectPrice);帮我看下是哪里出了问题,随便修改一下,谢谢

很正常

回复:这个是写入了自动移仓,因为我替换成商品000指数就正常了,唯独999就提示警告订阅不到主连888。原因你帮我检测下上面的函数代码,不知道是不是图层哪里有错误,谢谢