我在使用tb的教程中历史涨跌停模板时:见链接: https://www.tbquant.net/helper?navigate=tbquant&words=%E6%B6%A8%E8%B7%8C%E5%81%9C&cid=2041;
如果我订阅的品种较多,如20个品种,就发现最后几个品种夜盘数据不全,见下面复现代码:
Params
array<string> mysymbol([au888.SHFE,cu888.SHFE,ru888.SHFE,CF888.CZCE, ss888.SHFE,zn888.SHFE,al888.SHFE,sn888.SHFE,
i9888.DCE,p9888.DCE,rb888.SHFE,m9888.DCE, fu888.SHFE,TA888.CZCE,sp888.SHFE, AP888.CZCE, jd888.DCE,lh888.DCE,SA888.CZCE, MA888.CZCE]);//20个*/
//array<string> mysymbol([au888.SHFE,cu888.SHFE,ru888.SHFE,CF888.CZCE, ss888.SHFE,zn888.SHFE]);
Vars
Dic<Array<Numeric>> mysettleprice(TB_SettlePrice); //结算价
Dic<Array<Numeric>> mypricelimit(TB_PriceLimit); //停板比例
Series<Numeric> myuplimit(0,1); //涨停价
Series<Numeric> mydnlimit(0,1); //跌停价
Numeric myjump; //每跳值/最小价格变动
global Numeric f(2); //切换周期数-15m,1d;
Numeric i;
Events
OnInit()
{
f=2;
for i =0 to GetArraySize(mysymbol)-1
{
SubscribeBar(mysymbol[i],1d,20230201);
SubscribeBar(mysymbol[i],5m,20230201);
}
}
OnBar(ArrayRef<Integer> indexs)
{
data[f*i+1].Commentary(标识1);
for i = 0 to GetArraySize(mysymbol)-1//
{
data[f*i+1].Commentary(标识2);
//涨跌停板模块
data[f*i+1].myjump=data[f*i+1].MinMove*data[f*i+1].pricescale;
If(data[f*i+1].ExchangeCode==CZCE)
{
data[f*i+1].myuplimit=data[f*i+1].RoundUp(mysettleprice[0][0]*(1+0.01*data[f*i+1].mypricelimit[0][0])/myjump,0)*data[f*i+1].myjump;
data[f*i+1].mydnlimit=data[f*i+1].RoundDown(mysettleprice[0][0]*(1-0.01*data[f*i+1].mypricelimit[0][0])/myjump,0)*data[f*i+1].myjump;
}Else If(data[f*i+1].ExchangeCode==DCE)
{
data[f*i+1].myuplimit=data[f*i+1].RoundDown(mysettleprice[0][0]*(1+0.01*data[f*i+1].mypricelimit[0][0])/myjump,0)*data[f*i+1].myjump;
data[f*i+1].mydnlimit=data[f*i+1].RoundUp(mysettleprice[0][0]*(1-0.01*data[f*i+1].mypricelimit[0][0])/myjump,0)*data[f*i+1].myjump;
}Else If(data[f*i+1].ExchangeCode==SHFE)
{
data[f*i+1].myuplimit=data[f*i+1].RoundDown(mysettleprice[0][0]*(1+0.01*data[f*i+1].mypricelimit[0][0])/myjump,0)*data[f*i+1].myjump;
data[f*i+1].mydnlimit=data[f*i+1].RoundDown(mysettleprice[0][0]*(1-0.01*data[f*i+1].mypricelimit[0][0])/myjump,0)*data[f*i+1].myjump;
}Else If(data[f*i+1].ExchangeCode==CFFEX)
{
data[f*i+1].myuplimit=data[f*i+1].RoundDown(mysettleprice[0][0]*(1+0.01*data[f*i+1].mypricelimit[0][0])/myjump,0)*data[f*i+1].myjump;
data[f*i+1].mydnlimit=data[f*i+1].RoundUp(mysettleprice[0][0]*(1-0.01*data[f*i+1].mypricelimit[0][0])/myjump,0)*data[f*i+1].myjump;
}
If(data[f*i+1].myuplimit<=data[f*i+1].mydnlimit) Return;
}
}
见下面图,我通过Commentary(标识2)来识别,图1中看到9:10时,有标识2显示,图2显示时间是22:35,但标识2没有显示。接着如果我把历史涨跌停模板删除,“//涨跌停板模块”以下删除,发现图1图2都有显示标识2,可以看出涨跌停模板影响后面品种夜盘数据的获取。 请问怎样解决该问题,在使用涨跌停模板情况下?
If(data[f*i+1].myuplimit<=data[f*i+1].mydnlimit) Return;
最后这句代码的问题,如果这个图层的涨停价格小于跌停价格,停止循环,有可能是出现异常数据的情况。
非常感谢,测试代码ok,正式策略测试中,应该没问题。只是不知道怎样才会出现涨停小于跌停?
0
无法复现,请补充一下你的问题 和你想要解决的问题 详细说明
谢谢您的回复,我的代码是直接在tb终端复制过来,您可能没注意对齐等方面而造成无法运行,下图是我代码并编译成功的截图
如还有什么我没表达清楚的,请指出。