软件版本:
问题描述:
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));
}
}
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即使在跨周期后仍然是正常计数的。
👍