TradingView Pine Script如何实现每30秒发告警避免重复触发
Pine Script 固定30秒单次告警实现方案
原有代码的核心问题
- 时间单位错误:
timenow返回的是毫秒级Unix时间戳,直接对30取模是按30毫秒做时间切分,和预期的30秒间隔差了1000倍 - 无触发锁机制:实时行情下脚本会随每一笔成交tick重复执行,只要时间落在判断区间内,每一个tick都会触发一次告警,自然会出现同一时间发2-3条重复消息的问题
- 逻辑判断矛盾:修改后的判断条件
timenow % 30 <= 5 and timenow % 30 >= 25本身不存在成立的数值区间(模30的返回值范围是0-29,没有数能同时小于等于5且大于等于25),实际触发完全是跨时间边界时的随机命中,稳定性极差
可直接使用的正确代码
核心逻辑是通过持久化变量记录上一次告警的周期标记,每个30秒周期内仅允许触发一次告警:
//@version=5 indicator(title='30秒固定间隔告警', overlay=false) // 持久化存储上一次触发告警的周期起始时间,脚本重载前不会重置 var last_trigger_period = 0 // 计算当前时间所属30秒周期的起始时间戳(毫秒) current_period = timenow - (timenow % 30000) // 进入新的30秒周期时才触发告警 if current_period != last_trigger_period alert('raise some alert', freq=alert.freq_all) // 更新标记为当前周期,本周期内后续所有tick都不会重复触发 last_trigger_period := current_period
代码说明
var关键字修饰的变量只会在脚本首次加载时初始化一次,后续每次tick执行都会保留上一次的赋值结果,适合做跨执行周期的状态标记- 用周期起始时间作为判断依据,不需要卡精确的时间点,只要进入新周期的第一个tick触发告警后,后续同周期的所有tick都会被拦截,从根源上避免重复发送
- 如果需要调整告警间隔,直接修改模运算的毫秒值即可:1分钟间隔用60000,5分钟间隔用300000,1小时间隔用3600000
内容的提问来源于stack exchange,提问作者Mohammad Safakhou
相关产品推荐
相关产品推荐

