You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:23:14