根据2023年2月2日腾讯课堂“模型编写实战演练”第一个问题的回答,下述小程序在大周期的onbarclose内执行错误,具体表现为:
请问这是个什么情况呢?
Params
String symb(SA305.CZCE);
Integer Length(7);
Vars
Global Integer Data_0;
Global Integer Data_N;
Natural Series<Numeric> MA;
Natural Series<Numeric> C_MA;
Events
OnInit()
{
Data_0 = SubscribeBar(symb, 3m,DateTimeAdd(CurrentDate(),-1*60*60)); // 大周期图层编号
Data_N = SubscribeBar(symb,20s,Data[Data_0].BeginDateTime); // 小周期图层编号
}
OnBar(ArrayRef<Integer> indexs)
{
Range[Data_0:Data_0]
{
MA = Average(Close,Length); // 用来校验
Commentary(--- OnBar ---);
Commentary( MA= +Text(MA));
PlotString(BarNr,Text(CurrentBar),Low,Yellow);
PlotAuto(MA,MA,0,Green,Enum_Cross);
}
}
OnBarClose(ArrayRef<Integer> indexs)
{
If(ArrayFind(indexs,Data_0))
{
Range[Data_0:Data_0]
{
C_MA = Average(Close,Length);
Commentary(--- OnBarClose ---);
Commentary(C_MA= +Text(C_MA));
PlotAuto(C_MA,C_MA,0,Yellow,Enum_Dot,Enum_3Pix);
If(BarStatus==2)
{
Print(----- CurrentBar= +Text(CurrentBar));
Print( C_MA= +Text(C_MA)+ / MA= +Text(MA));
}
}
}
}
非常感谢您提供示例,我们才得以快速的定位问题。
1.多数据源对齐机制时,当对不齐时,落后数据源的序列变量和信号会被冻结。
如白盘合约,与有夜盘合约对齐时,夜盘行情来时,白盘的合约的数据源的序列变化和信号会被冻结。
2.盘中行情也有先后顺序,也会触发对不齐的情况,我们下个版本会完善这个问题。
3.最近会更新版本,请留意升级
请问老师,我这个帖子里遇到的问题是否也是您说的情况,是否近期升级后可以解决? https://www.tbquant.net/forumDetail?cur=tbquan&id=10245&cid=all
修改完代码以后复现你说的内容了,转给研发人员看看什么问题
首先,和OnBarOpen没有关系。
上面的程序在每根大周期Bar上的OnBar和OnBarClose里分别用同一参数计算简单移动平均值,记为MA和C_MA。我的理解是,OnBar里计算的终值应该和OnBarClose里计算的值相等,也就是说 C_MA==MA。
但是结果确显示,在OnBarClose里打印出来的这两个值不相等,具体如下图所示。红色框内是在OnBarClose里的计算结果,黄色框内是OnBar的计算结果。经过若干不相同的结果后,绿色框内又显示两者相同了。
知道老师们挺忙的,我这儿也提供了完整程序和图片说明,行数也不多。请劳驾把上述程序加载,在交易时间执行一下,花不了几分钟的时间。请不要先入为主,理解一下我的意思。
代码过不了编译,还得手动修改
下次直接导出工作区文件作为附件上传,记得附带策略公式,尽量开源
onbarclose的触发时机本来就应该是下一根bar的onbaropen之前....
程序在OnBar和OnBarClose里分别计算同一参数的均线,两个均线值在历史Bar上是相等的,但是在实时Bar上的结果不同。
实时Bar上onBarClose里的计算结果print出来经常是上一根onBarClose的结果,并且onBarClose里的Commentary也没有显示,那就表示OnBarClose里没有执行。但偶尔又会执行一次,使结果和OnBar里的计算一致。
不知我表述清楚没有,还没有的话请加载上面的程序跑一下,谢谢!
偶尔执行一次是什么意思 这个没看出来哪里有问题
请老师复现一下
OnBarClose到底是什么一个执行机制?