想使用StatusQuote函数判断当前行情状态是否是实时的,使用了如下代码在实盘环境下运行
OnReady()
{
Print("Quote Status:" + Text(QuoteStatus()));
Print("*****************************");
}
OnBar(ArrayRef<Integer> indexes)
{
if(BarStatus == 2)
{
Print(Text(SystemTimestamp) + " - Quote Status:" + Text(QuoteStatus()));
}
}
预想的结果是在OnReady()里输出的就是4, OnBar()第一次也输出4,实际运行结果如下:
请问:
1. 如何这种延迟更新是否稳定,仅仅是有一次还是会随机出现?
2. 实盘运行时这种延迟会有什么潜在风险,如何规避?
最新bar上第一次运行以历史bar状态驱动,目的是防止启动报单的情况
具体情况是这样的:
如果你的策略在最新一根bar上出现了信号,这个信号已经报单。你这个时候停止了策略,重新启动自动交易,那么这个最新bar上的信号又会再报一次单。
这种情况之前比较常见,主要是当用户夜盘刚好最后一个bar上出信号并报单交易,然后关闭计算机,第二天开盘前启动软件并继续开启自动交易,这个时候就会重复报单。
为了解决这个问题,我们把每次执行到最新bar的状态值调整为历史状态,之后再接收tick数据,才确认为实盘状态。
这个事实上并不是什么延迟更新,这个两次驱动之间的间隔大概是0.00 00 00 007,这就是7毫秒。对比tick数据是500毫秒间隔,这个误差几乎是忽略不计的。事实上这个也并不能说明行情存在延迟。
原来如此,这个设计还是很合理的,谢谢解答