为何在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
相关产品推荐
相关产品推荐

