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

TradingView Pine Script警报重复发送问题排查与解决咨询

重复警报问题排查与解决(Pine Script + TradingView)

问题概述

使用给定Pine Script代码从多品种获取数据并触发警报时,90%的情况下同一品种会同时收到两条重复警报,导致Webhook对接交易平台时生成重复订单。需排查问题根源并提供解决方案。

原始代码

//@version=5
indicator('Test', overlay=true)
fastLength = input(9)
slowLength = input(18)
price = close
mafast = ta.sma(price, fastLength)
maslow = ta.sma(price, slowLength)

//conditions
buysignal = (ta.crossover(mafast, maslow))
sellsignal = (ta.crossunder(mafast, maslow))

// check any condition you needed to fire
checkForAlert()=>
    alertMsg = ""

    // check for highest high
    if buysignal
        alertMsg += str.format("buy,{0},risk=1", syminfo.ticker)

    // check for lowest low
    if sellsignal
        alertMsg += str.format("sell,{0},risk=1", syminfo.ticker)

    alertMsg

fireAlert(ticker, freq = alert.freq_once_per_bar)=>
    msg = request.security(ticker, timeframe.period, checkForAlert())
    if str.length(msg) > 0
        alert(msg, freq)

fireAlert("OANDA:GBPJPY")
fireAlert("OANDA:GBPUSD")
fireAlert("OANDA:GBPCAD")
fireAlert("OANDA:EURGBP")
fireAlert("OANDA:EURJPY")
// more symbols here ... max 40

问题根源

核心是代码逻辑缺陷,而非TradingView平台问题,具体原因:

  • alert.freq_once_per_bar 基于当前图表品种的K线,而非被请求品种的K线。主图K线更新时,所有fireAlert调用会重新执行,若被请求品种的信号仍处于触发状态,会重复发送警报。
  • request.security 默认启用前瞻加载,可能在K线未闭合时提前检测到信号,后续K线闭合时再次触发。
  • 未对每个品种的信号做跨K线的触发状态跟踪,同一信号在K线形成过程中会被多次检测到。

解决方案

修改代码,添加信号状态跟踪、调整警报频率、禁用前瞻加载,确保同一品种同一信号仅触发一次:

修改后的完整代码

//@version=5
indicator('Multi-Symbol Alert Fix', overlay=true)
fastLength = input(9)
slowLength = input(18)

// 为每个品种创建独立的信号触发状态变量
var table signalTracker = table.new(position.top_right, 2, 50)

// 定义信号检测函数,添加状态跟踪
checkAndTrackSignal(ticker)=>
    // 禁用前瞻加载,确保数据是已闭合K线的真实值
    [mafast, maslow, currentTicker] = request.security(ticker, timeframe.period, 
         [ta.sma(close, fastLength), ta.sma(close, slowLength), syminfo.ticker],
         barmerge.gaps_on, barmerge.lookahead_off)
    
    buysignal = ta.crossover(mafast, maslow)
    sellsignal = ta.crossunder(mafast, maslow)
    
    alertMsg = ""
    // 检查该品种是否已触发过当前信号
    hasTriggered = table.get_cell(signalTracker, 0, ticker)
    
    if buysignal and not hasTriggered
        alertMsg = str.format("buy,{0},risk=1", currentTicker)
        table.set_cell(signalTracker, 0, ticker, true)
    elif sellsignal and not hasTriggered
        alertMsg = str.format("sell,{0},risk=1", currentTicker)
        table.set_cell(signalTracker, 0, ticker, true)
    // K线闭合后重置触发状态,允许下一次信号触发
    else if ta.barstate.islast
        table.set_cell(signalTracker, 0, ticker, false)
    
    alertMsg

// 触发警报函数,仅在bar闭合时发送
fireAlert(ticker)=>
    msg = checkAndTrackSignal(ticker)
    if str.length(msg) > 0
        alert(msg, alert.freq_once_per_bar_close)

// 调用多品种检测
fireAlert("OANDA:GBPJPY")
fireAlert("OANDA:GBPUSD")
fireAlert("OANDA:GBPCAD")
fireAlert("OANDA:EURGBP")
fireAlert("OANDA:EURJPY")
// 可添加更多品种

关键修改点

  • 添加信号状态跟踪:用table存储每个品种的信号触发状态,避免同一K线内重复触发。
  • 禁用前瞻加载:request.security添加barmerge.lookahead_off,确保使用已确认的K线数据。
  • 调整警报频率:使用alert.freq_once_per_bar_close,仅在K线完全闭合后触发一次警报。
  • K线闭合重置状态:在最后一根K线时重置触发状态,允许下一次信号触发。

额外注意事项

  • 若使用实时图表,确保TradingView的图表更新频率设置与交易平台一致。
  • 测试时可先在模拟环境验证,避免真实账户重复下单。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:31:02