双时间框架Heikin Ashi SuperTrend指标优化:趋势同步显示需求
修改双时间框架Heikin Ashi SuperTrend指标的显示条件
需求说明
我正在开发一款双时间框架的Heikin Ashi SuperTrend指标,当前在2分钟周期图表上使用5分钟作为更高时间框架输入,基础功能运行正常。现需添加条件:仅当5分钟周期处于上升趋势时,才显示2分钟周期的上升趋势线;仅当5分钟周期处于下跌趋势时,才显示2分钟周期的下跌趋势线。
解决方案
核心思路是利用更高时间框架的趋势状态TrendHtf过滤当前时间框架的趋势线显示:
- 当
TrendHtf == 1(更高时间框架上升)时,仅显示当前时间框架的上升趋势线 - 当
TrendHtf == -1(更高时间框架下跌)时,仅显示当前时间框架的下跌趋势线
修改后的完整代码
//@version=5 indicator('Supertrend MTF Heikin Ashi', overlay=true) HTF= input.timeframe('5', title='Time Frame') Mult = input.float(defval=1.2, title='ATR Factor', minval=0.5, maxval=100,step=0.1) Period = input.int(defval=5, title='ATR Period', minval=1, maxval=100) // 本地时间框架Heikin Ashi数据 h = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, high) l = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, low) c = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close) Atr = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, ta.atr(Period)) // 本地时间框架SuperTrend计算 Up = (h + l) / 2 - Mult * Atr Dn = (h + l) / 2 + Mult * Atr float TUp = na float TDown = na Trend = 0 TUp := c[1] > TUp[1] ? math.max(Up, TUp[1]) : Up TDown := c[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn Trend := c > TDown[1] ? 1 : c < TUp[1] ? -1 : nz(Trend[1], 1) Trailingsl = Trend == 1 ? TUp : TDown // 更高时间框架Heikin Ashi SuperTrend计算 highhtf = request.security(ticker.heikinashi(syminfo.tickerid), HTF, high[1], lookahead=barmerge.lookahead_on) lowhtf = request.security(ticker.heikinashi(syminfo.tickerid), HTF, low[1], lookahead=barmerge.lookahead_on) closehtf = request.security(ticker.heikinashi(syminfo.tickerid), HTF, close[1], lookahead=barmerge.lookahead_on) HTfatr = request.security(ticker.heikinashi(syminfo.tickerid), HTF, ta.atr(Period)[1], lookahead=barmerge.lookahead_on) Uphtf = (highhtf + lowhtf) / 2 - Mult * HTfatr Dnhtf = (highhtf + lowhtf) / 2 + Mult * HTfatr float TUphtf = na float TDownhtf = na TrendHtf = 0 TUphtf := closehtf[1] > TUphtf[1] ? math.max(Uphtf, TUphtf[1]) : Uphtf TDownhtf := closehtf[1] < TDownhtf[1] ? math.min(Dnhtf, TDownhtf[1]) : Dnhtf TrendHtf := closehtf > TDownhtf[1] ? 1 : closehtf < TUphtf[1] ? -1 : nz(TrendHtf[1], 1) TrailingslHtf = TrendHtf == 1 ? TUphtf : TDownhtf linecolorHtf = TrendHtf == 1 and nz(TrendHtf[1]) == 1 ? color.lime : TrendHtf == -1 and nz(TrendHtf[1]) == -1 ? color.red : na // 关键修改:根据更高时间框架趋势过滤本地时间框架趋势线显示 linecolor = na if TrendHtf == 1 and Trend == 1 and nz(Trend[1]) == 1 linecolor = color.lime if TrendHtf == -1 and Trend == -1 and nz(Trend[1]) == -1 linecolor = color.red // 绘制趋势线 plot(Trailingsl, color=linecolor, linewidth=2, title='SuperTrend') plot(TrailingslHtf, color=linecolorHtf, linewidth=3, title='Supertrend HTF')
关键修改说明
- 移除了原代码中
Uphtf和Dnhtf里多余的math.abs(highhtf + lowhtf本身为正数,绝对值计算无意义) - 重构了
linecolor的赋值逻辑:- 仅当更高时间框架与本地时间框架趋势方向一致时,才设置对应颜色
- 趋势方向不一致时,
linecolor为na,本地时间框架趋势线自动隐藏
内容的提问来源于stack exchange,提问作者NITIN PATEL
相关产品推荐
相关产品推荐

