关于OnBar代码执行方式的问题

老师,我有个OnBar代码段的代码执行的问题想请教:

1.在OnInit中我定义了多个数据源:

SubscribeBar(MainSymbol(), "15m", DateAdd(CurrentDate(), -90), 0, Enum_Data_RolloverBackWard()); // 15分钟

       data[1].hideKline();


       SubscribeBar(MainSymbol(), "1h", DateAdd(CurrentDate(), -360), 0, Enum_Data_RolloverBackWard());  // 60分钟

       data[2].hideKline();


2.我是不是可以在OnBar里面手工指定对应执行内容的,例如:

OnBar(ArrayRef<Integer> indexs)

{

If (ArrayFind(indexs, 1)) {

// 执行data1(15分钟的代码)

Print(Text(data1.Open));

}


If (ArrayFind(indexs, 2)) {

// 执行data2(60分钟的代码)

Print(Text(data2.Close));

}

}


这样我就是否可以限定只有对应数据源自己的tick来了才会指定对应代码的问题,而不是每一个tick来了都要把所有代码执行一遍?

谢谢老师。

关于历史回溯onbar执行次数的问题
关于onbar的问题
求助关于OnBar中的问题
关于onbar的问题
请问早期历史数据回测onbar多次执行的问题
求教!!关于TB的执行机制问题。
关于ReStart();执行的问题
信号执行方式
Onbar OnTick谁先更新的问题?
OnBar与OnBarOpen两个事件的执行顺序是什么?

如果是quant3,你用同一个合约,不同周期,但是可以整除,然后起始时间对齐,那么有一个同步机制的,tick数据来的时候,会不同驱动三个图层,不需要这么处理。

如果是quant,没有这个机制,tick数据驱动,三个图层可能是无序顺序执行。

但是你这样处理也没有用。

我举个例子,有点难理解,可以多思考一下。

假定现在是最大周期的最后一个tick,对应也是其他周期bar的最后一个tick,现在三个图层,1m,5m,15m。

你在代码里对每个图层都单独做了if分支控制。

如果按照三个图层,分别驱动三次,我们现在考察最后一次驱动。

最后一次驱动如果是在15m图层上驱动,那么只执行15m分支里的语句,那之前1m和5m图层执行的语句结果,就会被覆盖掉。

如果你语句里用的是global,结果还能继续保存。如果是series,或者其他类型,那可能就保存不了之前的执行结果了。

我试图理解一下老师说的意思,因为使用Series的数据类型,可能会因为别的图层的tick来了导致数据计算失效。

那么来了另外一个问题,例如在15分钟的tick上出现一个金叉的信号,这个时候3分钟的tick也出现金叉信号(假设我使用共振金叉开仓),但是3分钟在下一个tick金叉又消失了(可能15分钟的金叉信号还在),这就会导致信号闪烁,针对这个有什么好办法么?

我能想到的办法就是改指标算法。

这个非常麻烦。

以均线金叉举例,两条均线是否金叉,一个因素是当前的价格,另一个因素是过去的价格。

过去的价格是固定死的,当前的价格变动,导致了均线判断是否金叉。

那么想要固定信号的办法,就只能是,拿当前bar的最高价(最低价)和过去的价格(惯例是过去的收盘价)放在一起计算当前bar上的均线,我们称为特殊均线。而之前按常规收盘价计算的我们称为常规均线。

如果上一根bar的常规均线是1>2,而当前bar的特殊均线时1<2,那么我们就可以判定,当前bar上肯定是发生过交叉的,用这个来作为信号条件就不会闪烁。

金叉死叉使用的最高价和最低价就是反一反的关系,

思路简单来说就是这样,实现起来稍微麻烦点,也比较浪费算力。

但是也没有别的更好的办法。

谢谢老师。多周期的信号闪烁问题确实比较麻烦。