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

为何在1H时间框架调用request.security()获取4H数据返回1H bar_index?

为何在1H时间框架下调用request.security后,自定义类型字段返回的是1H的bar_index而非4H的?

在1H时间框架下运行以下脚本后,发现数据窗口里自定义类型字段返回的bar_index始终是1H的bar序号,而非指定的4H的,这是什么原因?

// RUN ON 1H TIMEFRAME
//@version=5
indicator("HTF bar_index",  overlay = true)

type htfData
    int             htfBi

htfF1(htfData _htf) =>
    _htf.htfBi := bar_index
    bar_index

var htfD = htfData.new()

htfBi = request.security(syminfo.tickerid, "240", htfF1(htfD), lookahead = barmerge.lookahead_off)

// turns out that request.security returns 1H bar_index
plotchar(htfBi, "htfBi","", location.belowbar)
plotchar(htfD.htfBi, "htfD.htfBi","", location.belowbar)

核心原因

问题出在自定义对象的作用域和生命周期上:

  • 用var声明的htfD是属于当前1H主时间框架的全局对象,它的所有操作都绑定在1H的bar执行周期里。
  • 当request.security调用htfF1时,虽然函数会在4H的时间上下文里执行,但传入的_htf指向的是1H框架里的那个全局对象。此时_htf.htfBi := bar_index的赋值操作,本质是在当前1H的bar执行流程中完成的,所以取到的bar_index是1H的序号,而非4H上下文里的序号。
  • 而htfF1的返回值bar_index是直接在4H上下文里计算的,所以htfBi变量能拿到正确的4H bar_index,这就导致了两个值的差异。

修正方案

如果要在自定义类型里存储4H的bar_index,需要把对象的创建放在request.security的4H上下文里,让它属于目标时间框架的作用域。示例代码如下:

// RUN ON 1H TIMEFRAME
//@version=5
indicator("HTF bar_index fixed",  overlay = true)

type htfData
    int             htfBi

htfF1() =>
    // 在4H上下文里创建对象,绑定4H的生命周期
    var _htf = htfData.new()
    _htf.htfBi := bar_index
    // 返回需要的两个值
    [_htf.htfBi, bar_index]

// 获取4H上下文里的结果
[htfD_htfBi, htfBi] = request.security(syminfo.tickerid, "240", htfF1(), lookahead = barmerge.lookahead_off)

plotchar(htfBi, "htfBi","", location.belowbar)
plotchar(htfD_htfBi, "htfD.htfBi","", location.belowbar)

这样修改后,_htf是在4H时间框架的上下文里创建的,赋值的bar_index就是4H的序号,两个字段的结果会一致。


内容的提问来源于stack exchange,提问作者Moebius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:00:46