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)
关键修改说明
- 信号条件组合:通过逻辑与(
and)运算符同时满足交叉事件和动态线位置要求,过滤无效信号:- 做多信号:金叉发生时,
md必须处于动态超卖线下方 - 做空信号:死叉发生时,
md必须处于动态超买线上方
- 做多信号:金叉发生时,
- 信号位置优化:将
plotshape的位置参数从location.bottom/location.top改为location.belowbar/location.abovebar,让信号更贴合K线显示,避免位置偏移
内容的提问来源于stack exchange,提问作者Hammer Geek
相关产品推荐
相关产品推荐

