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

基于时间限制TradingView警报触发次数的PineScript v5问询

解决TradingView PineScript v5警报触发频率限制问题

问题说明

TradingView限制3分钟内最多触发15次警报,在Renko这类价格驱动的非标准K线图中,大行情下几秒内会生成多个砖形K线,导致警报触发过频被限制。原代码依赖未平仓订单的时间判断,无法覆盖已平仓订单的情况,需要改为基于最近15次警报触发时间来控制新警报的触发。

解决方案代码

//@version=5
strategy(title="Close Over Under High Low", overlay = true)

// 用于存储最近15次警报的触发时间
var alertTimes = array.new<datetime>(0)

//Order Entry Parameters
validLong = close > high[1]
validShort = close < low[1]

// 计算是否允许触发新警报的逻辑
canTriggerAlert() =>
    // 如果存储的警报次数不足15,直接允许
    if array.size(alertTimes) < 15
        true
    else
        // 取出最早的那次警报时间
        earliestAlertTime = array.get(alertTimes, 0)
        // 计算当前时间与最早警报的时间差(分钟)
        timeDiffMinutes = (time - earliestAlertTime) / (60 * 1000)
        // 时间差超过3分钟则允许触发
        timeDiffMinutes > 3

// Enter trades whenever a valid setup is detected
if validLong and canTriggerAlert()
    strategy.entry(id='Long', direction=strategy.long)
    alert('buy', alert.freq_once_per_bar)
    // 将当前警报时间加入数组
    array.push(alertTimes, time)
    // 如果数组长度超过15,移除最早的元素
    if array.size(alertTimes) > 15
        array.shift(alertTimes)

if validShort and canTriggerAlert()
    strategy.entry(id='Short', direction=strategy.short)
    alert('sell', alert.freq_once_per_bar)
    // 将当前警报时间加入数组
    array.push(alertTimes, time)
    // 如果数组长度超过15,移除最早的元素
    if array.size(alertTimes) > 15
        array.shift(alertTimes)

关键逻辑解释

  • var alertTimes = array.new<datetime>(0):用var声明数组,确保只会初始化一次,用来存储每次警报的触发时间戳
  • canTriggerAlert()自定义函数:
    • 当存储的警报次数不足15次时,直接允许触发新警报
    • 当达到15次时,取出数组中最早的警报时间,计算与当前时间的差值,超过3分钟则允许触发
  • 每次触发警报后,将当前时间加入数组,若数组长度超过15,用array.shift()移除最早的元素,始终保持数组只存储最近15次的警报时间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:07:08