历史图标上最后一根Bar的OnBarClose不触发且QuoteDataExist值不对

在交易时段外的图标上加载运行如下代码,预期运行到最后一根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?

关于日内收盘最后一根bar的OnBarClose
交易时段在最后一根bar上OnBar触发的BarStatus取值为1是什么原因?
收盘前最后一根bar的time怎么计算?
如何确定当日最后一根BAR线
OnBarClose() 这个事件在历史回测中,最后一件BAR不会触发,有什么替代方法
怎么实现每根Bar结束前2秒触发ONbarclose执行
最新一根K线使用开盘价模拟计算MACD值不对
老师,当前bar均线值和上一根bar均线值的差值。 这个怎么写呀?
实盘交易跨周期OnBarClose触发问题
OnBarClose的触发时间和设置的触发时间点不一致

熬夜伤身体。

>#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了,之前看文档还是不够仔细,臆断了

再次感谢老师的指点