如何在Pine Script中编写多时间周期Ichimoku一目均衡表指标
多时间周期无重绘Ichimoku云带实现方案
核心问题说明
你之前的实现逻辑是单独拉取高周期的高低价再在当前周期计算一目均衡表指标,这是导致结果不符合预期的核心原因:一目均衡表的所有指标线都需要在对应高时间周期的K线维度完成计算,再整体拉取到当前图表,同时要处理先行带的特殊偏移规则。
具体实现步骤
- 首先修正
Midpoint函数的参数缺失问题,补全入参逻辑 - 将完整的一目均衡表计算逻辑封装为统一函数,一次返回转换线、基准线、先行带A、先行带B四个需要绘制的核心值
- 复用你已有的无重绘
rp_function封装逻辑,一次拉取高周期的整套计算结果,避免多次调用request.security导致的指标不同步和性能损耗 - 绘制云带时给先行带设置对应周期的偏移量,同时给不同时间周期的云带设置不同的颜色透明度,避免视觉混淆
可运行修正代码
//@version=5 indicator('多时间周期无重绘一目均衡表', overlay=true) // 修正后的高低点中点计算函数 Midpoint(src, len) => math.avg(ta.highest(src, len), ta.lowest(src, len)) // 无重绘security封装 rp_function(_symbol, _res, _src) => request.security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0]) // 输入设置:可自定义多个不同时间周期 res1 = input.timeframe(title='第一时间周期', defval='D') res2 = input.timeframe(title='第二时间周期', defval='W') // 封装完整的一目均衡表计算逻辑,返回需要的所有值 calc_ichimoku() => tk = Midpoint(close, 9) kj = Midpoint(close, 26) ska = math.avg(tk, kj) skb = Midpoint(close, 52) [tk, kj, ska, skb] // 拉取第一周期(默认日线)的无重绘一目指标 [D_TK, D_KJ, D_SKA, D_SKB] = rp_function(syminfo.tickerid, res1, calc_ichimoku()) // 拉取第二周期(默认周线)的无重绘一目指标 [W_TK, W_KJ, W_SKA, W_SKB] = rp_function(syminfo.tickerid, res2, calc_ichimoku()) // 绘制日线云带,透明度30% plot(D_SKA, color=color.green, title='日线先行带A', offset=26) plot(D_SKB, color=color.red, title='日线先行带B', offset=26) fill(D_SKA, D_SKB, color= D_SKA > D_SKB ? color.new(color.green, 70) : color.new(color.red, 70), title='日线云带', offset=26) // 绘制周线云带,透明度50%,和日线区分 plot(W_SKA, color=color.new(color.green, 20), title='周线先行带A', offset=26) plot(W_SKB, color=color.new(color.red, 20), title='周线先行带B', offset=26) fill(W_SKA, W_SKB, color= W_SKA > W_SKB ? color.new(color.teal, 50) : color.new(color.maroon, 50), title='周线云带', offset=26)
额外优化建议
- 如果需要展示更多时间周期的云带,只要参照上述逻辑新增时间周期输入项、对应拉取指标、设置不同透明度的填充色即可
- 不需要展示的转换线、基准线、迟行带可以直接注释掉对应的plot代码,避免图表过于杂乱
- 回测时不要开启barmerge.lookahead_on参数,否则会引入未来函数导致回测结果失真
内容的提问来源于stack exchange,提问作者Martin Moltke Wozniak
相关产品推荐
相关产品推荐

