Pine Script实现多标的条件筛选及邮件/Telegram告警咨询
多标的批量扫描筛选+新标的告警实现方案
原有代码核心缺陷
- 仅对比相邻Bar符合条件标的的数组大小,无法识别「数组长度不变但标的发生替换」的场景,会漏判新入选标的
- 未持久化存储上一Bar的完整标的列表,无法做精准的差集比对
- 每根Bar重复新建展示标签,会造成图表元素堆叠冗余
security()函数未指定无未来函数参数,回测和实盘信号会出现偏差- 未对接告警触发逻辑,无法实现消息推送
- 未做K线收盘状态判断,盘中实时价格跳动会导致信号反复、误触发提醒
实现逻辑
- 用
var修饰的持久化数组,存储上一根已收盘K线的全部符合条件标的 - 遍历待扫描标的列表,通过无未来函数的
security()调用获取各标的在指定周期的条件匹配结果,生成本Bar的符合条件标的数组 - 仅在K线收盘确认后,对比两个数组的差集,提取本Bar新入选的标的
- 存在新入选标的时,调用
alert()函数推送消息,消息内携带新标的名称、触发周期、时间信息,可直接绑定TradingView支持的邮件、Telegram、Webhook等推送渠道 - 复用单个标签更新展示内容,避免图表元素冗余
修正后可直接运行的代码
//@version=4 study("Multi-Ticker Scanner Alert", overlay=false, shorttitle="Scanner") // ———— 基础配置 ———— rsiLength = 14 rsiThreshold = 40 scanTimeframe = '15' // 待扫描标的列表,可自行增减,标的名称需与TradingView代码完全一致 tickerList = array.new_string(4) array.set(tickerList, 0, "CIMSA") array.set(tickerList, 1, "SASA") array.set(tickerList, 2, "THYAO") array.set(tickerList, 3, "SISE") // ———— 跨Bar持久化变量 ———— var string[] prevMatchedTickers = array.new_string(0) // 存储上一收盘Bar符合条件的标的 var label displayLabel = label.new(na, na, "", color=color.green, textcolor=color.white, style=label.style_label_left) string[] currentMatchedTickers = array.new_string(0) // 当前Bar符合条件的标的 string[] newAddedTickers = array.new_string(0) // 本Bar新入选的标的 // ———— 自定义筛选条件,可按需修改内部逻辑 ———— filterCondition() => rsiVal = rsi(close, rsiLength) rsiVal > rsiThreshold // ———— 遍历扫描所有标的 ———— for i = 0 to array.size(tickerList) - 1 ticker = array.get(tickerList, i) // 无未来函数调用多标的多周期数据 isMatch = security(ticker, scanTimeframe, filterCondition(), gaps=barmerge.gaps_on, lookahead=barmerge.lookahead_off) if isMatch array.push(currentMatchedTickers, ticker) // ———— 收盘后比对信号、触发告警 ———— if barstate.isconfirmed // 差集计算:提取当前有、上一期没有的新标的 for i = 0 to array.size(currentMatchedTickers) - 1 curTicker = array.get(currentMatchedTickers, i) if not array.includes(prevMatchedTickers, curTicker) array.push(newAddedTickers, curTicker) // 存在新标的时触发告警 if array.size(newAddedTickers) > 0 alertContent = "新符合筛选条件标的:" + array.join(newAddedTickers, ", ") + "\n扫描周期:" + scanTimeframe + "\n触发时间:" + tostring(time) alert(alertContent, alert.freq_once_per_bar_close) // 更新历史匹配列表,供下一根Bar比对 prevMatchedTickers := array.copy(currentMatchedTickers) // ———— 更新图表展示内容 ———— labelContent = "当前符合条件标的:\n" + array.join(currentMatchedTickers, "\n") label.set_xy(displayLabel, bar_index, low) label.set_text(displayLabel, labelContent) // 绘制当前匹配标的数量曲线 plot(array.size(currentMatchedTickers), title="匹配标的数量", color=color.blue, linewidth=2)
使用说明
- 可在
tickerList数组中自行增删需要扫描的股票、加密货币标的 - 可修改
filterCondition()函数内部逻辑,替换为自定义的交易筛选规则 - 脚本加载到图表后,点击TradingView右上角告警按钮,告警条件选择「脚本触发
alert()函数」,推送渠道勾选邮件、Telegram即可完成推送配置,新标的满足条件时会自动发送提醒 - 所有信号判断均在K线收盘后执行,不会出现盘中信号反复、重复推送的问题
内容的提问来源于stack exchange,提问作者Askeroglu
相关产品推荐
相关产品推荐

