如何使Renko图表中的高时间框架(HTF)脚本避免重绘?
无重绘HTF Renko图表实现方案
问题根源
你的脚本在Renko图表中出现重绘,核心原因有三点:
- Renko K线是价格触发生成,和时间驱动的普通K线逻辑完全不同,原脚本的
barstate.isconfirmed无法适配Renko的K线确认规则。 request.security中使用了lookahead = barmerge.lookahead_on,会引入未确认的未来数据,导致后续重绘。- 直接调用
_src[1]无法保证HTF数据的稳定性,因为Renko K线和HTF时间周期K线不同步,HTF数据更新时会回溯修改历史信号。
修改后的无重绘代码
//@version=5 indicator(title='无重绘HTF Renko', overlay=true) // 输入HTF时间框架 ht = input.timeframe('60', '高时间框架') // 安全获取HTF数据的函数,禁用前瞻,只获取已确认的HTF bar数据 f_getConfirmedHTF(_symbol, _tf, _src) => // 标记当前HTF bar是否已关闭 htfBarClosed = ta.change(time(_tf)) // 用var变量存储已确认的HTF数据,避免重绘 var float confirmedHTFVal = na // 仅当HTF bar完全关闭时,更新存储的数值 if htfBarClosed confirmedHTFVal := request.security(_symbol, _tf, _src, lookahead=barmerge.lookahead_off) confirmedHTFVal // 获取已确认的HTF收盘价 confirmedHtfClose = f_getConfirmedHTF(syminfo.tickerid, ht, close) // 绘制HTF收盘价线(无重绘) plot(confirmedHtfClose, color=color.green, title='已确认HTF收盘价') // 生成无重绘信号:仅在Renko bar确认且HTF数据已确认时触发 // 用var变量存储信号状态,避免回溯修改 var bool buySignal = false var bool sellSignal = false // Renko bar确认逻辑:当前bar不是最后一根未完成的bar renkoBarConfirmed = not barstate.islast // 更新信号:仅在Renko bar确认且HTF数据有效时 if renkoBarConfirmed buySignal := close > confirmedHtfClose and not na(confirmedHtfClose) sellSignal := close < confirmedHtfClose and not na(confirmedHtfClose) // 绘制信号,仅在信号触发的bar显示 plotshape(buySignal, style=shape.labelup, location=location.belowbar, size=size.tiny, color=color.green, text='BUY') plotshape(sellSignal, style=shape.labeldown, location=location.abovebar, size=size.tiny, color=color.red, text='SELL') // 重置信号:下一个Renko bar开始时清空状态 if barstate.islast buySignal := false sellSignal := false
关键修改说明
- 禁用前瞻数据:将
lookahead设为barmerge.lookahead_off,确保只获取已完全关闭的HTF bar数据,从根源避免未来数据导致的重绘。 - 用var变量存储状态:
var声明的变量不会在每根bar重置,仅在HTF bar真正关闭时更新,确保历史数据不会被回溯修改。 - 适配Renko bar确认逻辑:用
not barstate.islast判断Renko bar是否已确认(Renko的最后一根bar是未完成的,会随价格更新),仅在bar确认后生成信号。 - 信号状态管理:在新的Renko bar开始时重置信号变量,避免信号在后续bar重复显示。
内容的提问来源于stack exchange,提问作者TwiMob
相关产品推荐
相关产品推荐

