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。原因你帮我检测下上面的函数代码,不知道是不是图层哪里有错误,谢谢