如何在1H周期仅按4H周期计算并绘制指标?
Pine Script:在1H周期展示4H周期指标,避免重复计算与缺口问题
问题描述
我需要计算4H周期的close - ta.sma(close, 5),并在1H周期的图表上展示。现有代码如下:
//@version=5 indicator("close - SMA(5)") [momentumClose, momentumClose4] = request.security(syminfo.tickerid, "240", [close - ta.sma(close, 5), close[4] - ta.sma(close[4], 5)], barmerge.gaps_on) plot(momentumClose) hline(0, "Zero Line", color=color.black, linestyle=hline.style_solid, linewidth=2) bgcolor(momentumClose - momentumClose4 > 0 ? color.green : color.red)
遇到的问题:
- 使用
barmerge.gaps_on时,momentumClose4每4根1H bar才有数据,导致图表出现缺口 - 改用
barmerge.gaps_off后背景显示正常,但指标会在每根1H bar上重新计算,不符合“仅按4H周期计算”的需求
想知道:能否让指标仅按4H周期计算,而非每根1H bar都计算?应该选择处理barmerge.gaps_off还是改为在高周期绘图?
解决方案
不需要切换到高周期绘图,通过以下方法可以在1H周期实现仅在4H bar完成时计算一次指标值,后续1H bar复用该值,同时解决缺口问题:
修改后的代码
//@version=5 indicator("4H close - SMA(5) [1H Display]", overlay=false) // 定义4H周期的计算逻辑,同时标记是否为该周期的最后一根bar [4h_momentum, 4h_momentum_4, is_4h_bar_end] = request.security(syminfo.tickerid, "240", [close - ta.sma(close, 5), close[4] - ta.sma(close[4], 5), ta.barstate.islast]) // 使用var变量存储最新的4H计算结果,仅在4H bar结束时更新 var float latest_4h_momentum = na var float latest_4h_momentum_4 = na if (is_4h_bar_end) latest_4h_momentum := 4h_momentum latest_4h_momentum_4 := 4h_momentum_4 // 用存储的固定值绘图和计算背景色 plot(latest_4h_momentum, "4H Momentum", color=color.blue) hline(0, "Zero Line", color=color.black, linestyle=hline.style_solid, linewidth=2) bgcolor(latest_4h_momentum - latest_4h_momentum_4 > 0 ? color.new(color.green, 90) : color.new(color.red, 90))
关键逻辑说明
- 标记4H bar结束时刻:在
request.security中加入ta.barstate.islast,判断当前1H bar是否对应4H周期的最后一根bar(即4H bar完成的时刻) - 持久化存储计算结果:用
var关键字声明变量,这些变量会在脚本运行期间保持值,仅当4H bar结束时才更新,确保后续1H bar复用的是同一个4H计算结果 - 避免重复计算:所有绘图和背景色计算都基于存储的
latest_*变量,而非request.security直接返回的实时值,这样每4根1H bar才会触发一次计算,其余时间复用已有数据
方案选择
- 无需切换到高周期绘图:上述方法直接在1H周期实现需求,同时保留了1H周期的图表粒度
- 优于
barmerge.gaps_off:barmerge.gaps_off会让request.security在每根1H bar都重新计算4H指标,而我们的方法仅在4H bar完成时计算一次,效率更高且逻辑更符合需求
内容的提问来源于stack exchange,提问作者Josh Laird
相关产品推荐
相关产品推荐

