基于时间限制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
相关产品推荐
相关产品推荐

