全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
获取主力合约问题,我用指数000做策略就可以正常,999指数就不能订阅获取主力合约了。
lzxzzq 分享到
2023-07-19 21:55

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);


帮我看下是哪里出了问题,随便修改一下,谢谢

wangkaiming

data-href=

data-href=

很正常



2023-07-20 08:58
lzxzzq
@wangkaiming

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

2023-07-20 19:16
您未登录,请先 登录注册 后发表评论
顶部