用tbq做了个测试,发现onbar跟ontick的驱动频率实际上并不相同。
如果是活跃的品种,每时每刻都有成交的,那么二者是一致的
但是如果是不活跃品种,onbar的驱动次数要小于ontick
当数据图层(比如data0)不是在tick级别,比如选择10秒或者1分钟的时候,似乎只有在bar数据更新(有成交)时onbar才会被驱动
如果只是买卖盘口价格变动了,但是没有成交,就不会驱动onbar
但是ontick是每秒钟都在驱动的
不太理解背后的逻辑,安理来说onbar也是每个tick更新才对
请教下老师这个问题怎么解释🤔
我们并没有发布ontick驱动域
那只是个废案。
你一定要用的话可以自己研究
主要问题是,onbar不是按每个tick驱动,而是有成交了才会驱动
但我看咱在别的帖子的回答,说onbar是按tick更新进行驱动的
似乎跟咱们这个说法有些不一致
你说的那个是onfill
onorder就是按收到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数有多少根了吗?