BarStatus的状态,Tb旗舰版和TbQuant3版本不一样。

1 Tb 旗舰版BarStatus 在onBar函数(比喻,旗舰的代码可以认为是onBar函数)运行的时候,以前Tb旗舰版本的时候,当前Bar的tick运行完成,会把这个状态修改为BarStatus=1,然后从新触发一次onBar函数.2 TbQuant3版本在onBar函数这个状态BarStatus=2,不会变成1,但是在结束后会触发一次OnBarClose 函数调用,但是BarStatus依然是2的。现在问题是什么呢?两个机制不一样了,我以前在tb旗舰版的一些为了优化运行效率的代码无效了,无法在tbquant3优化这个效率。比如我一个bar只想触发有限次数的tick,不想全部的tick都触发,减少cpu占用,提高效率。//Bar 触发有限次数Tick,开始3次和bar结束BarStatus 为1时候触发If(BarStatus != 2 || lastCalcBarTime != Time() ){ }完整的逻辑如下:VarsNumeric lastCalcBarTime(0); //最后计算的bar的时间Numeric lastCalcBarDate(0); //最好计算的bar的日期Numeric barTickCount(0);Beginif(BarStatus == 0){ SetGlobalVar(11,0); SetGlobalVar(12,0); SetGlobalVar(13,0);} lastCalcBarDate = GetGlobalVar(11); lastCalcBarTime = GetGlobalVar(12); barTickCount = GetGlobalVar(13);//Bar 触发有限次数If(BarStatus != 2 || lastCalcBarTime != Time() ){}/* *************************************************************************************记录处理过的bar序列的日期和时间************************************************************************************** */if(BarStatus == 2 ){ barTickCount = barTickCount + 1; } else { barTickCount = 0; }SetGlobalVar(13, barTickCount);//<设置3次即可,运行时的k才用3次tick。if(BarStatus == 2 ){ if(barTickCount >= 3 && barTickCount < 6){ lastCalcBarDate = TrueDate(0); SetGlobalVar(11, lastCalcBarDate); lastCalcBarTime = Time(); SetGlobalVar(12, lastCalcBarTime); }} else { lastCalcBarDate = TrueDate(0); SetGlobalVar(11, lastCalcBarDate); lastCalcBarTime = Time(); SetGlobalVar(12, lastCalcBarTime);}End但是在Tbquant3以后很难了,你不能把逻辑放到OnBarClose。因为涉及序列变量或者序列函数的时候,两个都地方都修改序列变量或者两个地方都调用相同的序列函数,会导致不可预料的问题。我的建议是保持这个tbQuant3的扩展性,你们可以加OnBarClose,但是也需要能在onBar里面重复掉一次onBar,并把这个BarStatus赋值为1,以便通知onbar函数bar结束了。本来你们的架构有OnBarClose,看来是可以的,但是实际因为序列函数和序列变量的原因,OnBarClose和在onbar调用效果完全不一样。OnBarClose反而作用很小。或者你们不想变化当前的架构,但是建议设置一个属性,默认为false,不触发onbar BarStatus赋值为1的调用,设置为True的时候,触发,这样可以保持和Tb旗舰版一致。

伪代码就是:BarEndActiveOnBar 这个属性可以设置为false或者trueif(new bar){ if(BarEndActiveOnBar){ barStatus =1 onBar(pre bar) } barStatus =2? onBarClose(pre bar) onBarOpen(new Bar) onBar(new bar)}