使用request.security_lower_tf获取M1数据遇array.get越界错误及语法咨询
问题解答
1. 获取上一根已闭合M5 K线对应M1高点数据的语法修正
要准确获取上一根已完成的M5 K线对应的所有M1高点,不能直接用request.security_lower_tf的默认返回值——因为默认返回的是当前正在运行的M5 K线已经生成的M1数据,而非上一根已闭合M5的完整M1数据集。
正确的做法是通过缓存机制,在每根M5 K线闭合时,将当前次周期数组保存为“上一根”的历史数据:
//@version=5 indicator("上一根M5的M1高点数据", overlay=false) // 定义两个数组变量,分别存储当前M5和上一根M5的M1高点 var array<float> currentM1Highs = array.new_float() var array<float> prevM1Highs = array.new_float() // 仅当M5 K线完全闭合时,更新数组缓存 if barstate.isconfirmed // 将当前数组的内容转移给上一根数组 prevM1Highs := currentM1Highs // 获取当前刚闭合的M5对应的完整M1高点数组 currentM1Highs := request.security_lower_tf(syminfo.tickerid, "1", ta.high, lookahead=barmerge.lookahead_off)
此时prevM1Highs就是上一根已闭合M5对应的所有M1高点数组。
如果需要直接获取上一根M5的某一根M1数据(比如第2根),可以结合shift参数使用request.security(更灵活):
// 获取上一根M5的第2根M1高点(索引从0开始) prevM5_2ndM1High = request.security(syminfo.tickerid, "1", ta.high[2], shift=3)
这里shift=3是因为M5包含5根M1,要跳过当前M5已生成的M1,定位到上一根M5的对应位置。
2. 数组越界错误的原因
你用三元语句检查数组大小仍报错,核心问题是检查逻辑和数组访问的执行时机不匹配:
request.security_lower_tf在当前M5 K线未闭合时,返回的数组大小是当前已生成的M1数量(比如当前M5只走了1根M1,数组大小就是1),此时如果你的代码在barstate.islast(最后一根tick)时访问索引1,就会触发越界。- Pine Script的bar合并机制(
barmerge参数)可能导致在市场缺口、数据缺失时,返回的数组大小小于预期,而你的三元判断没有覆盖所有极端场景(比如数组大小为0或1的情况)。 - 变量的初始化时机问题:如果数组是在非
var声明的情况下,每根bar都会重新创建,导致数组状态不稳定。
修正的检查逻辑应该严格确保索引在有效范围内:
// 安全访问数组的第1个元素(索引从0开始) if array.size(prevM1Highs) > 1 targetHigh = array.get(prevM1Highs, 1) else targetHigh = na
或者使用array.get的安全替代方式,避免直接越界:
// 用array.getOrDefault避免报错,当索引越界时返回默认值na targetHigh = array.getOrDefault(prevM1Highs, 1, na)
内容的提问来源于stack exchange,提问作者AWG
相关产品推荐
相关产品推荐

