我在多周期策略编程中,发现问题。代码如下。运行的时候发现,在短周期图层(例如10秒),每次onbarclose被激活,按照tbq的逻辑range[0:0]部分被执行,但是range[1:1]部分不会执行。但是在交易时段,range[1:1]部分长周期图层(例如2分钟)onbarclose仍被激活执行了。我将这个问题反馈给你们的客服。他们复现了这个情况,花了2个小时告诉我到论坛上请代码老师解决。请问代码是否有问题,如果我想让图层1每2分钟执行一次该如何解决。谢谢
OnBarClose(ArrayRef<Integer> indexs)
{
range[1:1] {
print(symbol() + ":" + text(date) + ", "+ TimeToString(CurrentTime) + ", 长周期计算" );
}
range[0:0] {
print(symbol() + ":" + text(date) + ", "+ TimeToString(CurrentTime) + ",短周期计算" );
}
}
OnBarClose(ArrayRef<Integer> indexs)
{
Integer i;
range[i = 0:dataCount-1]
{
if(ArrayFind(indexs,i))
{
//执行操作
print(symbol() + ":" + text(date) + ", "+ TimeToString(CurrentTime) + ", 长周期计算" );
}
}
}这样试一试
我可以试试,但是请问原有的range逻辑只能在onbar事件域里使用吗,如果是那么说明文档里没有介绍。。还有就是range逻辑有什么问题吗,他单独使用在未来编程里面有什么特别需要注意的话,请明示。。我现在很多代码都使用这个函数,这么搞,我都不知道该如何开发了
range在onbar里也是同理,不过是tick驱动罢了,1.遇到事件触发,事件下的代码都会运行 2.range只是一个图层循环(在哪个图层运行),如果没有过滤那么就是所有图层都运行,,如果想在特定图层就加过滤,,,两者并没有特别的联系
我想表达的是,如果不过滤。那么在回测的时候表现与实盘的表现不一致。回测的时候不会出现这个情况。我打印数据发现的。希望tb能介绍清楚,否则开发走很多弯路。我可以通过这种方式来重新开发。
您说的情况是说历史回测,哪个图层有变动就会执行单一图层?上面也做出了解答,历史情况不会存在这个问题
客服也想帮您解决,可能发现自己水平不够,所以让您来社区咨询,抱歉哈,onbarclose触发机制,只要触发,onbarclose内都会执行,我觉得不会存在您说的历史情况,只执行小周期,或只执行大周期的图层,您说的实时情况,运行机制就是这样,所以没问题,如果您只想运行触发的图层,您可以过去index's 的参数,加判断条件来执行相应的图层
这个我们要测试看看了
收到,谢谢王老师。等待结果了