求编写自动绘制并重绘MACD红绿柱高低点水平线的脚本
实现MACD红绿柱区间自动重绘水平线的Pine Script脚本
核心功能说明
- 绿柱区间:当MACD柱线为负时,追踪区间内MACD绿柱的新高(最接近0的柱值),同步记录该区间内K线的最高顶部并绘制虚线水平线;若后续绿柱再创新高且K线顶部更高,自动更新重绘水平线位置。
- 红柱区间:当MACD柱线为正时,追踪区间内MACD红柱的新低(最接近0的柱值),同步记录该区间内K线的最低底部并绘制虚线水平线;若后续红柱再创新低且K线底部更低,自动更新重绘水平线位置。
- 附带标签箭头标注水平线更新位置,匹配需求中的指向效果。
完整代码实现
//@version=5 indicator("MACD区间自动水平线", overlay=true) // 获取MACD指标核心数据 [macdLine, signalLine, macdHist] = ta.macd(close, 12, 26, 9) // 定义红绿柱状态 isGreenBar = macdHist < 0 isRedBar = macdHist > 0 // 识别红绿柱区间的起始点 greenZoneStart = ta.barssince(not isGreenBar) == 0 redZoneStart = ta.barssince(not isRedBar) == 0 // 追踪绿柱区间:MACD新高、K线最高顶部 var float greenZoneMacdHigh = na var float greenZoneKlineHigh = na if isGreenBar currentMacdHigh = math.max(macdHist, greenZoneMacdHigh) currentKlineHigh = math.max(high, greenZoneKlineHigh) // 区间初始化或MACD创出新高时,更新记录值 if currentMacdHigh > greenZoneMacdHigh or greenZoneStart greenZoneMacdHigh := currentMacdHigh greenZoneKlineHigh := currentKlineHigh else // 绿柱区间结束,重置变量 greenZoneMacdHigh := na greenZoneKlineHigh := na // 追踪红柱区间:MACD新低、K线最低底部 var float redZoneMacdLow = na var float redZoneKlineLow = na if isRedBar currentMacdLow = math.min(macdHist, redZoneMacdLow) currentKlineLow = math.min(low, redZoneKlineLow) // 区间初始化或MACD创出新低时,更新记录值 if currentMacdLow < redZoneMacdLow or redZoneStart redZoneMacdLow := currentMacdLow redZoneKlineLow := currentKlineLow else // 红柱区间结束,重置变量 redZoneMacdLow := na redZoneKlineLow := na // 绘制水平线(延伸100根K线,可自行调整长度) if not na(greenZoneKlineHigh) line.new(bar_index, greenZoneKlineHigh, bar_index + 100, greenZoneKlineHigh, color=color.green, width=2, style=line.style_dashed) if not na(redZoneKlineLow) line.new(bar_index, redZoneKlineLow, bar_index + 100, redZoneKlineLow, color=color.red, width=2, style=line.style_dashed) // 绘制更新提示箭头标签 if not na(greenZoneKlineHigh) and ta.change(greenZoneKlineHigh) label.new(bar_index, greenZoneKlineHigh + ta.atr(10)*0.1, "绿柱新高线", color=color.green, textcolor=color.white, style=label.style_label_down) if not na(redZoneKlineLow) and ta.change(redZoneKlineLow) label.new(bar_index, redZoneKlineLow - ta.atr(10)*0.1, "红柱新低线", color=color.red, textcolor=color.white, style=label.style_label_up)
关键逻辑解释
- 区间识别:通过
ta.barssince判断红绿柱区间的起始点,确保每个区间独立追踪数据,互不干扰。 - 极值追踪:绿柱区间取MACD柱的最大值(最接近0的柱值)作为新高,红柱区间取MACD柱的最小值(最接近0的柱值)作为新低;同步记录区间内K线的高低点。
- 自动重绘:每当区间内MACD创出对应极值时,立即更新K线高低点记录,新的水平线会自动覆盖旧线的视觉效果(若需删除旧线,可添加
line.delete逻辑优化)。 - 可视化优化:用ATR指标动态调整标签位置,避免与K线重叠,箭头标签清晰提示水平线的更新触发点。
内容的提问来源于stack exchange,提问作者yogerrtt
相关产品推荐
相关产品推荐

