You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pine Script v5:结合Bool与Float条件绘制买卖信号图形

Impulse MACD 动态超买/超卖线结合买卖信号实现方案

需求说明

已为Impulse MACD指标添加动态超买/超卖线,需通过plotshape实现以下买卖信号:

  • 动态超卖线下方出现md与sb的金叉(ta.crossover)时,绘制绿色做多信号
  • 动态超买线上方出现md与sb的死叉(ta.crossunder)时,绘制红色做空信号

此前因无法正确结合布尔交叉变量与浮点动态线变量,导致代码报错或无效信号过多,以下是修正后的实现方案。

原稳定运行代码

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HammerGeek

//@version=5
indicator('Impulse MACD [HammerGeek - LazyBear]', shorttitle='IMACD_HG_LB', overlay=false)
lengthMA = input(34)
lengthSignal = input(9)
//OverBought = input.float(0.1)
//OverSold = input.float(-0.1)


calc_smma(src, len) =>
    smma = 0.0
    sma_1 = ta.sma(src, len)
    smma := na(smma[1]) ? sma_1 : (smma[1] * (len - 1) + src) / len
    smma

calc_zlema(src, length) =>
    ema1 = ta.ema(src, length)
    ema2 = ta.ema(ema1, length)
    d = ema1 - ema2
    ema1 + d

src = hlc3
hi = calc_smma(high, lengthMA)
lo = calc_smma(low, lengthMA)
mi = calc_zlema(src, lengthMA)

md = mi > hi ? mi - hi : mi < lo ? mi - lo : 0
sb = ta.sma(md, lengthSignal)
sh = md - sb
mda = ta.sma(md, lengthSignal)
OverBoughtLine = ta.highest(sb * 0.5, lengthMA*100)
OverSoldLine = ta.lowest(sb * 0.5, lengthSignal*100)
shsbCrossOver = ta.crossover(md, sb)
shsbCrossUnder = ta.crossunder(md, sb)

//mdc = src > mi ? src > hi ? color.lime : color.green : src < lo ? color.red : color.orange
mdc = color.green
plot(0, color=color.new(color.gray, 0), linewidth=1, title='MidLine')
plot(md, color=mdc, linewidth=2, title='ImpulseMACD', style=plot.style_line)
plot(sh, color=color.rgb(122, 5, 168, 40), linewidth=2, title='ImpulseHisto', style=plot.style_area)
plot(sb, color=color.rgb(255, 255, 255, transp = 40), linewidth=2, title='ImpulseMACDCDSignal')
plot(OverBoughtLine, color=color.new(#f3e032, 0), linewidth=1, title = 'Overbought Line')
plot(OverSoldLine, color=color.new(color.yellow, 0), linewidth=1, title = 'Oversold Line')
plotshape(shsbCrossOver, "LONG", shape.triangleup, location.bottom, color.new(color.green, 0))
plotshape(shsbCrossUnder, "SHORT", shape.triangledown, location.top, color.new(#cd0808, 0))

//ebc = input(false, title='Enable bar colors')
//barcolor(ebc ? mdc : na)

修正后的代码

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HammerGeek

//@version=5
indicator('Impulse MACD [HammerGeek - LazyBear]', shorttitle='IMACD_HG_LB', overlay=false)
lengthMA = input(34)
lengthSignal = input(9)
//OverBought = input.float(0.1)
//OverSold = input.float(-0.1)


calc_smma(src, len) =>
    smma = 0.0
    sma_1 = ta.sma(src, len)
    smma := na(smma[1]) ? sma_1 : (smma[1] * (len - 1) + src) / len
    smma

calc_zlema(src, length) =>
    ema1 = ta.ema(src, length)
    ema2 = ta.ema(ema1, length)
    d = ema1 - ema2
    ema1 + d

src = hlc3
hi = calc_smma(high, lengthMA)
lo = calc_smma(low, lengthMA)
mi = calc_zlema(src, lengthMA)

md = mi > hi ? mi - hi : mi < lo ? mi - lo : 0
sb = ta.sma(md, lengthSignal)
sh = md - sb
mda = ta.sma(md, lengthSignal)
OverBoughtLine = ta.highest(sb * 0.5, lengthMA*100)
OverSoldLine = ta.lowest(sb * 0.5, lengthSignal*100)
shsbCrossOver = ta.crossover(md, sb)
shsbCrossUnder = ta.crossunder(md, sb)

// 定义信号触发条件:结合交叉事件与动态线位置
longCondition = shsbCrossOver and md < OverSoldLine
shortCondition = shsbCrossUnder and md > OverBoughtLine

//mdc = src > mi ? src > hi ? color.lime : color.green : src < lo ? color.red : color.orange
mdc = color.green
plot(0, color=color.new(color.gray, 0), linewidth=1, title='MidLine')
plot(md, color=mdc, linewidth=2, title='ImpulseMACD', style=plot.style_line)
plot(sh, color=color.rgb(122, 5, 168, 40), linewidth=2, title='ImpulseHisto', style=plot.style_area)
plot(sb, color=color.rgb(255, 255, 255, transp = 40), linewidth=2, title='ImpulseMACDCDSignal')
plot(OverBoughtLine, color=color.new(#f3e032, 0), linewidth=1, title = 'Overbought Line')
plot(OverSoldLine, color=color.new(color.yellow, 0), linewidth=1, title = 'Oversold Line')

// 绘制买卖信号
plotshape(longCondition, "LONG", shape.triangleup, location.belowbar, color.new(color.green, 0), size=size.small)
plotshape(shortCondition, "SHORT", shape.triangledown, location.abovebar, color.new(#cd0808, 0), size=size.small)

//ebc = input(false, title='Enable bar colors')
//barcolor(ebc ? mdc : na)

关键修改说明

  1. 信号条件组合:通过逻辑与(and)运算符同时满足交叉事件和动态线位置要求,过滤无效信号:
    • 做多信号:金叉发生时,md必须处于动态超卖线下方
    • 做空信号:死叉发生时,md必须处于动态超买线上方
  2. 信号位置优化:将plotshape的位置参数从location.bottom/location.top改为location.belowbar/location.abovebar,让信号更贴合K线显示,避免位置偏移

内容的提问来源于stack exchange,提问作者Hammer Geek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:45:15