我们并没有发布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数有多少根了吗?