处理request.security_lower_tf获取1分钟K线数组时的缺失值问题
问题描述
在高时间框架图表(如5分钟)处理更低时间框架(如1分钟)K线时,使用request.security_lower_tf(syminfo.tickerid, '1', close)理论上应返回对应高时间框架单根K线内所有低时间框架K线的数组(比如5分钟对应5个1分钟K线值),但实际中即使高流动性标的也会出现低时间框架K线缺失的情况,导致数组大小不固定(比如部分5分钟K线仅对应3-4个1分钟K线)。
以下代码可复现该问题(在XLK标的5分钟图表上绘制对应1分钟K线数量):
indicator("No of 1 min bars") array_1min_close = request.security_lower_tf(syminfo.tickerid, '1', close) // 获取所有1分钟收盘价 num_1min_bars = array.size(array_1min_close) // 获取数组大小,即1分钟K线总数 plot(num_1min_bars, title="# of 1 min bars", color=color.yellow) // 绘制1分钟K线数量
这种缺失会引发两个问题:
- 数组大小不统一,调用预期索引(如5元素数组的索引3、4)时常报错;
- 数组内低时间框架K线的位置偏移,缺失的K线不会用
na填充,后续K线会前移占据缺失位置,导致无法准确调用对应顺序的子K线。
需要实现:
- 生成固定大小的数组,缺失的低时间框架K线在对应位置用
na填充; - 适配所有大于1分钟的时间框架,比如5分钟图表始终返回5元素数组,30分钟图表始终返回30元素数组。
解决方案
核心思路
通过计算当前高时间框架K线的时间范围,遍历该范围内所有预期的低时间框架K线时间点,逐个获取对应收盘价,缺失则填充na,从而生成固定大小的标准数组。
适配任意时间框架的实现代码
indicator("Fixed Size Lower TF Bars", overlay=false) // 定义低时间框架(这里用1分钟,可按需修改) lower_tf = "1" // 计算高时间框架与低时间框架的倍数(如5分钟/1分钟=5) tf_multiplier = timeframe.multiplier / tonumber(lower_tf) // 获取当前高时间框架K线的起始和结束时间 current_bar_start = time current_bar_end = time + timeframe.multiplier * 60 * 1000 // 初始化固定大小的数组 fixed_size_array = array.new_float(size=tf_multiplier, initial_value=na) // 遍历每个预期的低时间框架K线时间点 for i = 0 to tf_multiplier - 1 // 计算当前低时间框架K线的起始时间 lower_tf_bar_start = current_bar_start + i * tonumber(lower_tf) * 60 * 1000 // 获取该时间点对应的低时间框架收盘价 lower_tf_close = request.security(syminfo.tickerid, lower_tf, close, lookahead=barmerge.lookahead_on, gaps=barmerge.gaps_on) // 将值存入数组对应位置 array.set(fixed_size_array, i, lower_tf_close) // 示例:绘制数组内的第3个1分钟K线值(索引2) plot(array.get(fixed_size_array, 2), title="3rd 1min Close", color=color.blue) // 绘制数组大小(验证是否固定) plot(array.size(fixed_size_array), title="Fixed Array Size", color=color.red)
代码说明
- 固定数组大小:通过
timeframe.multiplier / tonumber(lower_tf)计算高/低时间框架的倍数,以此确定数组的固定大小; - 时间匹配填充:遍历每个预期的低时间框架K线起始时间,用
request.security精准获取对应时间的收盘价,若该时间点无K线则自动返回na,存入数组对应索引位置; - 适配任意时间框架:只需修改
lower_tf变量(如改为"5"即可在30分钟图表上生成6元素数组),无需调整核心逻辑; - 参数设置:
lookahead=barmerge.lookahead_on和gaps=barmerge.gaps_on确保能正确获取对应时间点的数据,即使存在K线缺失。
内容的提问来源于stack exchange,提问作者paamachat
相关产品推荐
相关产品推荐

