在交易时段外的图标上加载运行如下代码,预期运行到最后一根Bar的OnBarClose会被触发,且QuoteDataExist在各个Bar上应该都是False (因为是交易时段外,没有行情数据)
Events
OnInit()
{
PrintClear();
}
OnBarOpen(ArrayRef<Integer> indexes)
{
PlotAuto("BarIndex",Text(CurrentBar),Low);
Print("--------Bar #" + Text(CurrentBar) +"---------");
Print("OnBarOpen - " + Text(CurrentBar));
Print(" * BarStatus: " + Text(BarStatus));
Print(" * QuoteStatus:" + Text(QuoteStatus()));
Bool ret = QuoteDataExist();
Print(" * QuoteDataExist:" + IIFString(ret, "True", "False"));
}
OnBarClose(ArrayRef<Integer> indexes)
{
Print("OnBarClose - " + Text(CurrentBar));
Print(" * BarStatus: " + Text(BarStatus));
Print(" * QuoteStatus:" + Text(QuoteStatus()));
Bool ret = QuoteDataExist();
Print(" * QuoteDataExist:" + IIFString(ret, "True", "False"));
}
只加载了4根Bar, 实际运行结果如下:
请问:
#1 为什么最后一个Bar的OnBarClose代码没执行?
#2 为什么最后一个Bar的QuoteDataExist值为True?
熬夜伤身体。
>#1 为什么最后一个Bar的OnBarClose代码没执行?
因为你对【OnBarClose】的驱动时机的机制还没有掌握,简单来说结论:【OnBarClose】的驱动信号是【OnBarOpen】但是又先于【OnBarOpen】被执行。
原因和原理可以看以下视频:
https://www.bilibili.com/video/BV18G411f7YF/?spm_id_from=333.1387.collection.video_card.click
https://video.tbquant.net/video?id=video398
>#2 为什么最后一个Bar的QuoteDataExist值为True?
官网的原文文档:【如果当前数据源订阅实时行情,并且是最后一根bar,则行情数据有效。】
原文只要求【订阅】实时行情,并没要求是【实时Bar】,并且【QuoteDataExist返回为True的Bar】的确是【最后一根Bar】,没毛病。按在官网文档的语义描述与测试结果是一致的。
#1 快速拖了一下,明白您说的“【OnBarClose】的驱动信号是【OnBarOpen】但是又先于【OnBarOpen】被执行” 的含义了,睡醒了仔细看下
#2 把策略单元的【范围】改成了时间起始和结束的时间段,果然为False了,之前看文档还是不够仔细,臆断了
再次感谢老师的指点