见贴图,SA888一分钟K线图在2022年12月6日9点59分后,缺失10点和10点01分的Bar数据。
请确认是否复现。
邮件已于2023年3月2日腾讯课堂直播讲解
不太明白邮件里的问题在哪里,感觉并没有描述出问题出在哪里
截图里显示不正确的输出,但是对应代码并没有在邮件里,不能说明机制有问题
再重申一边,onbaropen不存在跳过的机制,只要是第一tick肯定能驱动oknbaropen的运行,不管是当前bar内何时到来
算法不对,图上显然有个一分钟是没有行情的,你却要判断同时一个时间点有2个onbaropen 自然那个就被跳过了
就是你的十字光标上下同时有才会满足你的条件
是我这个问题老师们认为已经回答了吗?
还是这个问题太蠢了?
管理员能帮我看看上述代码吗?
2022年12月6日 市场统一停盘了几分钟。
这正是我担心的地方,因为是刚好在整点的时候没有tick过来。这样一来例如在30分钟周期图层上,10点开始的OnBarOpen()域被跳过了,没有执行OnBarOpen()域内的代码。10点02分的tick并不被视为OnBarOpen()。
不知道我的表述是否清楚?
这种情况不存在的。第一个tick驱动onbaropen,没有限定这个tick必须是某个时间段内的,你为什么会产生这种想法。
第一个tick就是第一个tick,它就算是10点59分收到,只要是第一个tick,那就会驱动onbaropen。
你可以随便找个不活跃的合约试试
请运行一下下述代码,我对跨周期图层运行是否理解正确。
重点在12月6日10点,如果小周期是3分钟以上,大周期的OnBarOpen可被正确驱动,而如果是一分钟小周期,大周期的OnBarOpen被跳过了。
Params
String symb("SA888.CZCE"); // 合约品种
String D0Frequency("30m"); // 大周期频率
Enum<String> D1Frequency(["1m","90s","3m","5m","15m"]); // 小周期频率
Vars
Global Integer gIntData_0; // 大周期图层号
Global Integer gSmallDataId; // 小周期图层号
Series<Integer> sIntSmallDataBarNr; // 大周期内小周期Bar序数
Events
OnInit()
{
gIntData_0 = SubscribeBar(symb,D0Frequency,20221201.18,20221212.18);
gSmallDataId = SubscribeBar(Data[gIntData_0].Symbol,D1Frequency,Data[gIntData_0].BeginDateTime,Data[gIntData_0].EndDateTime); // 小周期图层编号
}
OnBarOpen(ArrayRef<Integer> indexs)
{
If(ArrayFind(indexs,gSmallDataId)) // 如果被驱动的indexs[]里包含小周期图层
{
Range[gSmallDataId:gSmallDataId]
{
If(ArrayFind(indexs,gIntData_0)) // 同时大周期也被驱动时
sIntSmallDataBarNr = 1; // 小周期Bar序号重置为 1
Else // 全部图层周期中仅小周期被驱动时
sIntSmallDataBarNr = sIntSmallDataBarNr[1]+1; // 小周期Bar序号累加
}
}
}
OnBar(ArrayRef<Integer> indexs)
{
Range[gSmallDataId:gSmallDataId]
{
If(sIntSmallDataBarNr == 1)
PlotString("1st Bar",Text(sIntSmallDataBarNr),Low,Yellow);
Else Commentary("小周期序号= "+Text(sIntSmallDataBarNr));
}
}
通过对比第三方后(通达信),确认这个是没有的,是正常的。