如何为结合自定义带宽指标的MACD Pine Script添加警报功能
Pine Script自定义MACD+高斯滤波警报修复方案
失效原因
- 语法错误:
Short = crossunder (macd, signal), and Bearmode一行多了多余逗号,直接触发编译失败 - 缩进错误:原有代码中
barstate.isfirst、barstate.islast下的循环逻辑缩进混乱,导致核心计算逻辑无法正常运行 - 变量作用域问题:
d、y1_d是barstate.islast代码块内的临时循环变量,仅在最后一根K线运算时生效,无法作为全局序列变量被警报条件调用 - 变量重复定义:代码前后两次定义了
src输入变量,逻辑冲突 - 未存储历史信号:高斯滤波计算出的各K线拐点信号没有持久化存储,警报条件无法匹配对应K线的MACD交叉状态
修复后完整代码
//@version=4 study(title="MACD+高斯滤波警报", shorttitle="MACD_Gauss_Alert", overlay=false) // MACD输入参数 fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) macd_src = input(title="MACD Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 15) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false) // MACD计算 fast_ma = sma_source ? sma(macd_src, fast_length) : ema(macd_src, fast_length) slow_ma = sma_source ? sma(macd_src, slow_length) : ema(macd_src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal // 高斯滤波输入参数 h = input(8.,'Bandwidth') gauss_src = input(close,'Gauss Filter Source') // 初始化存储变量 n = bar_index var ln = array.new_line(0) var bull_signals = array.new_bool(500, false) var bear_signals = array.new_bool(500, false) if barstate.isfirst for i = 0 to 499 array.push(ln,line.new(na,na,na,na)) // 高斯滤波计算 float y2 = na float y1 = na float y1_d = na line l = na if barstate.islast // 重置信号数组 array.fill(bull_signals, false) array.fill(bear_signals, false) for i = 0 to min(499,n-1) sum = 0. sumw = 0. for j = 0 to min(499,n-1) w = exp(-(pow(i-j,2)/(h*h*2))) sum += gauss_src[j]*w sumw += w y2 := sum/sumw d = y2 - y1 // 画线逻辑 l := array.get(ln,i) line.set_xy1(l,n-i+1,y1) line.set_xy2(l,n-i,y2) line.set_color(l,y2 > y1 ? #ff1100 : #39ff14) line.set_width(l,2) // 标记拐点并存储信号 if d > 0 and y1_d < 0 label.new(n-i+1,gauss_src[i],'▲',color=#00000000,style=label.style_label_up,textcolor=#39ff14,textalign=text.align_center) array.set(bull_signals, i, true) if d < 0 and y1_d > 0 label.new(n-i+1,gauss_src[i],'▼',color=#00000000,style=label.style_label_down,textcolor=#ff1100,textalign=text.align_center) array.set(bear_signals, i, true) y1 := y2 y1_d := d // 警报条件 current_bull = array.get(bull_signals, 0) current_bear = array.get(bear_signals, 0) Long = crossover(macd, signal) and current_bull Short = crossunder(macd, signal) and current_bear alertcondition(Long, title = "做多信号", message = "做多信号触发:{{ticker}} 时间 {{timenow}}") alertcondition(Short, title = "做空信号", message = "做空信号触发:{{ticker}} 时间 {{timenow}}") // 绘制MACD plot(macd, color=color.blue, title="MACD") plot(signal, color=color.red, title="Signal Line") plot(hist, color=hist>0 ? color.green : color.red, title="Histogram", style=plot.style_columns)
改动说明
- 修正了所有语法、缩进错误,解决了变量重复定义问题
- 新增了布尔数组存储每根K线的高斯滤波拐点信号,全局可调用
- 保留了你原本的触发逻辑:MACD金叉+上行拐点触发做多警报,MACD死叉+下行拐点触发做空警报
- 新增了MACD指标线绘制,方便和信号对照
内容的提问来源于stack exchange,提问作者Euphoria
相关产品推荐
相关产品推荐

