老师,我有个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来了都要把所有代码执行一遍?
谢谢老师。
如果是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上肯定是发生过交叉的,用这个来作为信号条件就不会闪烁。
金叉死叉使用的最高价和最低价就是反一反的关系,
思路简单来说就是这样,实现起来稍微麻烦点,也比较浪费算力。
但是也没有别的更好的办法。
谢谢老师。多周期的信号闪烁问题确实比较麻烦。