多周期在OnBarClose内的执行问题

根据2023年2月2日腾讯课堂“模型编写实战演练”第一个问题的回答,下述小程序在大周期的onbarclose内执行错误,具体表现为:

  1. 交易时间内偶尔执行一次大周期的onbarclose,不能控制。
  2. 在历史Bar上,例如刷新后,执行正确

请问这是个什么情况呢?


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

}

}

}

}



data-href=

同一策略内多周期开平仓问题
多周期数据执行频率问题
请教:ONBARCLOSE函数,在当天收盘的最后一根K线时不会执行,而要等到明日或晚盘开盘的那根K线才执行的问题
onbarclose函数中range问题
OnBarClose每天上午9点开盘时,第一个周期每个Tick都执行问题
如何解决多周期策略中,大周期代码被执行多次的问题?
关于OnBarClose()回溯的问题
【不能回复重发】OnBarClose每天上午9点开盘时,第一个周期每个Tick都执行问题
onbarclose为什么会在刚开盘执行
在OnBarClose中编写的交易代码,却在bar开始时执行,这是什么原因

非常感谢您提供示例,我们才得以快速的定位问题。

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的计算结果。经过若干不相同的结果后,绿色框内又显示两者相同了。


知道老师们挺忙的,我这儿也提供了完整程序和图片说明,行数也不多。请劳驾把上述程序加载,在交易时间执行一下,花不了几分钟的时间。请不要先入为主,理解一下我的意思。

data-href=

代码过不了编译,还得手动修改

下次直接导出工作区文件作为附件上传,记得附带策略公式,尽量开源

onbarclose的触发时机本来就应该是下一根bar的onbaropen之前....

程序在OnBar和OnBarClose里分别计算同一参数的均线,两个均线值在历史Bar上是相等的,但是在实时Bar上的结果不同。

实时Bar上onBarClose里的计算结果print出来经常是上一根onBarClose的结果,并且onBarClose里的Commentary也没有显示,那就表示OnBarClose里没有执行。但偶尔又会执行一次,使结果和OnBar里的计算一致。

不知我表述清楚没有,还没有的话请加载上面的程序跑一下,谢谢!

偶尔执行一次是什么意思 这个没看出来哪里有问题

请老师复现一下

OnBarClose到底是什么一个执行机制?