onbar 跟ontick的驱动频率似乎并不相同

用tbq做了个测试,发现onbar跟ontick的驱动频率实际上并不相同。如果是活跃的品种,每时每刻都有成交的,那么二者是一致的但是如果是不活跃品种,onbar的驱动次数要小于ontick当数据图层(比如data0)不是在tick级别,比如选择10秒或者1分钟的时候,似乎只有在bar数据更新(有成交)时onbar才会被驱动如果只是买卖盘口价格变动了,但是没有成交,就不会驱动onbar但是ontick是每秒钟都在驱动的不太理解背后的逻辑,安理来说onbar也是每个tick更新才对请教下老师这个问题怎么解释🤔

我们并没有发布ontick驱动域那只是个废案。你一定要用的话可以自己研究

回复:主要问题是,onbar不是按每个tick驱动,而是有成交了才会驱动但我看咱在别的帖子的回答,说onbar是按tick更新进行驱动的似乎跟咱们这个说法有些不一致

回复:你说的那个是onfillonorder就是按收到tick驱动的。如果你质疑这个说法,请提出完整的证据证明这个说法是错的。

回复:这里可能表达不清晰,是onbar只有在bar里面有新的成交了才会驱动,不是我自己账户有成交了驱动我晚点把测试的代码放上来

回复:什么叫onbar只有在bar里面有新的成交?完全听不懂了

回复:Vars global Integer n(0); global Integer m(0); global bool button(true); Events OnInit() { PrintClear; subscribetick("ag2604.SHFE"); } OnTick(TickRef evtTick) { m=m+1; print("m:"+text(m)); } OnBar(ArrayRef<Integer> indexs) { if(BarStatus==2 and button) //用来确保ontick和onbar同时开始计数,避免历史bar对n的干扰 { n=0; button=false; } n=n+1; print("n:"+text(n)); } 例如:data0加载"au2612.SHFE"这个相对不活跃品种插入以上代码的公式按理来说,onbar是按tick更新进行驱动,最终在控制台输出的m和n数值应该一致(或者是固定的差额比如固定差1这样)才对但是实际结果会发现,只有当bar发生变动时,才会驱动n的计算最终输出结果会出现m远大于n的情况

回复:实际结果如这个图片,m已经到568了,n才到313

回复:.......你这个demo只能证明onbar和ontick的驱动源事件是不同的,如何证明onbar在实盘的时候不是按tick驱动?

回复:这个就是实盘运行中测试的n和m就是对实盘驱动的简化,有驱动才有运行n和m的加1算法在onbar里面运行的n+1的结果,最终小于ontick运行的m+1结果,不就说明onbar不是每个tick都驱动运算吗

回复:Vars global integer n; Defs Events OnInit() { PrintClear; } OnBar(ArrayRef<Integer> indexs) { if (time==0.1055) { n=n+1; print("n:"+text(n)); } }或者,data0加载 au2702.SHFE的1分钟K线,插入以上公式按500ms一个tick,1分钟应该有120个tick如果onbar是按tick驱动,上述代码1分钟之后n应该等于120但是实际中结果会不到120,只有100出头

回复:你如果真的想测试,很简单,就完整测试一根一分钟k线盘中会驱动多少次,然后再把tick图调出来,数一数有多少tick。上面的所有所谓的demo,全都有漏洞。之前的只能说明onbar和ontick驱动事件不一样。第二个demo也没有考虑到,一个合约一分钟的tick只是最多120,并不是一定是120,如果没有成交,交易所就不推送tick,那就是小于120,你凭什么说一分钟一定应该是120跳?你查了这一分钟的tick数有多少根了吗?