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

如何为结合自定义带宽指标的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:15:01