我之前已发过一个贴说多图层时TB的OnBarOpen存在重复调用的现象,现在我或许要调整一下说法,应该改为不稳定,因为我完全不清楚调用多少次才是对的,按客服的说法就是多少个图层调用多少次,那么按这个说法如何解释下图里蓝色框里两个图层只调用了一次的现象呢?TB是不是应该要检查一下有没有出现某些bug呢?
另外,我附赠输出以上日志的代码给老师:
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
}
//在新bar的第一次执行之前调用一次,参数为新bar的图层数组
OnBarOpen(ArrayRef<Integer> indexs)
{
If(BarStatus == 2)
{
FileAppend("E://输出数据//test1//"+FormulaName+"_"+symbolname+"_"+text(date)+".txt", "This is OnBarOpen1" );
FileAppend("E://输出数据//test1//"+FormulaName+"_"+symbolname+"_"+text(date)+".txt", "bartime=" + Text(SystemDateTime));
FileAppend("E://输出数据//test1//"+FormulaName+"_"+symbolname+"_"+text(date)+".txt", "data0.High=" + Text(Data0.High));
FileAppend("E://输出数据//test1//"+FormulaName+"_"+symbolname+"_"+text(date)+".txt", "data1.High=" + Text(Data1.High));
FileAppend("E://输出数据//test1//"+FormulaName+"_"+symbolname+"_"+text(date)+".txt", " " );
}
}
我就是用这段代码运行两个图层的策略单元,策略单元如下图 ,然后发现了以上问题,请老师指教,谢谢!
这个问题好像之前回答过了。你用的是同一个合约,新的行情数据肯定是同时到来的,那么不管几个图层,肯定只驱动一次,同一个合约的数据怎么还会有前后顺序呢?
如果用的不是同一个合约,这个时候是有可能驱动一次,也可能驱动两次,因为不同的两个合约,数据有可能是同时来,也可能不是同时来。多个合约就是这个机制。
另外,onbaropen里的indexs参数是装载了驱动运行的图层序号,这是一个数组。比如数组如果是[0,1],就是表示第一,第二个图层的数据驱动了onbaropen运行,如果是[1,3],就表示第二个,第四个图层的数据驱动了onbaropen的运行
老师,我之前也回复过您了,这里再回复一次。
既然您说同一个合约的数据是同时来的,只运行一次,那么您如何解释上图输出日志里--红色框的输出结果呢?它们明显运行了两次,这不就与你说的不一样了吗?
找开发人员确认了一下,即使是同一个合约,不同图层,也有先后顺序,所以机制应该是一个图层的tick触发一次。
但是还有一个排队机制,就是如果一个图层的tick触发当前事件域运行还没结束,新的tick数据来了,就会逐个进入排队队列,等当前事件域运行完毕,会把队列里的tick统一打包进行处理,所以indexs参数会有多个。
一般来说,多图层的情况下,要用indexs控制实盘驱动的图层,辅助用bar时间来判断是否对齐
不太理解,能给个实际案例我吗?例如,如何调整代码,把上图蓝色框或红色框的其中一种情况完全消除呢?不然,程序执行时总会出错
For i = 0 To GetArraySize(indexs) - 1
if(indexs[i]==0)
这段控制图层0,i==1,控制图层1