使用barmerge.lookahead_on时request.security的重绘问题求助
在Pine Script中保留lookahead_on同时避免高时间框架收盘价重绘的解决方案
首先明确问题根源:
当启用lookahead = barmerge.lookahead_on时,request.security会提前获取高时间框架下一根bar的实时数据,这本身就容易引入重绘——因为未确认的高时间bar价格会随行情波动,导致指标数值不断变化。你之前尝试用当前低时间框架的barstate.isrealtime/barstate.isconfirmed判断索引,逻辑上的问题在于:低时间框架的bar状态和高时间框架的bar状态并不同步,用前者判断后者的索引会导致取到未确认的未来数据,最终引发重绘。
解决方案:基于高时间框架的确认状态存储并返回数据
核心思路是:用var变量持久化存储高时间框架已确认的收盘价,仅当高时间框架自身的bar确认时,才更新这个存储值。这样即使开启lookahead_on,历史数据始终是已确认的固定值,不会重绘;实时行情中也只会在高时间bar确认后更新数值。
代码实现(完全无重绘)
// 无重绘的高时间框架收盘价获取函数 f_secureSecurity(_symbol, _res, _src) => // 用var变量持久化存储已确认的高时间收盘价 var float confirmed_htf_close = na // 同时获取高时间框架的当前收盘价和它的bar确认状态 [htf_current_close, htf_bar_confirmed] = request.security(_symbol, _res, [_src, barstate.isconfirmed], lookahead = barmerge.lookahead_on) // 仅当高时间bar确认时,更新存储的收盘价 if htf_bar_confirmed confirmed_htf_close := htf_current_close // 返回已确认的收盘价(完全无重绘) confirmed_htf_close // 调用函数获取60分钟收盘价 Htfclose = f_secureSecurity(syminfo.tickerid, '60', close)
可选:实时预览高时间bar价格但不重绘历史
如果你希望在实时行情中看到高时间bar的当前实时价格(仅实时动态变化,历史数据固定无重绘),可以修改返回逻辑:
f_secureSecurity(_symbol, _res, _src) => var float confirmed_htf_close = na [htf_current_close, htf_bar_confirmed] = request.security(_symbol, _res, [_src, barstate.isconfirmed], lookahead = barmerge.lookahead_on) if htf_bar_confirmed confirmed_htf_close := htf_current_close // 实时返回当前价格,历史返回已确认值 barstate.isrealtime ? htf_current_close : confirmed_htf_close
原有代码重绘的原因
你之前的逻辑依赖当前低时间框架的bar状态来选择_src的索引,但低时间bar的"实时/确认"状态和高时间bar的状态完全无关:
- 比如低时间bar还在运行(
barstate.isrealtime=true),但高时间bar可能已经确认,此时取_src[1]会拿到上一个高时间bar的收盘价,而非当前已确认的最新值; - 反之,低时间bar已确认,但高时间bar还在运行,取
_src[0]会拿到未确认的未来数据,导致后续高时间bar价格变化时,历史上的指标数值被修改,引发重绘。
只有基于**高时间框架自身的barstate.isconfirmed**来判断是否更新数据,才能精准控制重绘问题。
内容的提问来源于stack exchange,提问作者TwiMob
相关产品推荐
相关产品推荐

