【BarCount】在图表加载多个数据源时数据异常

软件版本:

问题描述:

1. 创建了一个新的页面,只加入了【K线图表】这一个控件

2. 加载了测试用的公式

3. 通过界面人工添加了同一个品种不同周期的数据源,起始时间设置一致

4. 运行发现30分钟的BarCount返回值不对,而5分钟的是正常的

5. 删除掉了5分钟的数据源,再次运行,30分钟的BarCount就正确了

测试应用公式sbx_barcount代码如下:

Params
    //此处添加参数

Vars
    //此处添加变量

Defs
    //此处添加策略函数
    
Events
    
    //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
    OnReady()
    {
        Range[0: DataCount - 1]
        {
            Print("--" + Frequency + "--");
            Print(" > Bars Time Range: " + Text(BeginDateTime) + "~" + Text(EndDateTime));
            Print(" > Bar Count: " + Text(BarCount));
            Bool ret = HistoryDataExist();
            Print("HistoryDataExist:" + IIFString(ret, "True", "False"));
            
        }
        
        Print("\n----------------\n");
    }
    
    OnBar(ArrayRef<Integer> indexes)
    {
        Range[0: DataCount - 1]
        {
           Print(" >" + Frequency + "--> Bar Count:" + Text(BarCount));
        }
    
    }


不同数据源的数据时间起点不同,在多个图层存在的情况下如何判断某个时刻有哪些数据源有数据。
策略单元中有多个数据源时 分割方式选择的问题
加载策略时,如何忽略加载前的历史图表的信号,重新初始化运行?
多个数据源操作,用range函数,可否奇数数据源和偶数数据源分开?
双图层多数据源判断出现的异常
策略优化中数据源为多个品种时,出来的参数优化报告仅为一个品种报告,如何解决?
实测数据源策略函数中多个函数持续返回0
报告一个bug,barcount
关于多数据源方面得问题
如何批量修改数据源

barcount函数不建议跨周期使用

已复现,暂时没有什么头绪,转发给研发人员。

能复现就好,顺便说一下,当出现这个问题的时候即使在已经加载的最后一根Bar上显示BarStatus,其值是1不是2

可以从TBQ和TBQ3的差异点入手,分析Bug原因,是我一开始大胆猜测的依据。2款软件主要升级点就涉及到跨周期机制上的升级。TBQ3跨周期机制升级后之所以能够在跨周期历史回测时,在大周期上可以取到真实的当下小周期颗粒度的数据,无非就是在Bar时间对齐后,在2根大周期Bar之间插入了很多小周期的虚拟Bar数据。这一点会影响到OnReady事件域中调用BarCount的计数逻辑。

嗯,上面说了,由于是动态合成的,所以onready时取得就不对,等于取不到

应该是TBQ3的Bug。TBQ没有问题。表面现象上,跨周期数据源加载的K线数据应该都已经加载成功了。所以,问题可能出在BarCount函数内部计数判断逻辑上,TBQ3的计数逻辑的判断上面出问题了。

大小周期同时加载时,TB内部一定会先进行时间对齐,这样必然是大周期要迁就小周期的bar时间对齐,那么大周期在形式上就会被拉开距离,大周期的K线上就会出现很多(虚拟)空档,如果BarCount内部计数时把这些空档作为数据源加载结束标志的话,就会可能在OnReady里面输出结果1。

以上我猜测TBQ3的BarCount的计数逻辑,不代表官方回答。因为我发现TBQ即使在跨周期后仍然是正常计数的。

👍