如何避免Pine Script脚本连续输出重复的BUY/SELL交易信号
交易脚本信号过滤实现方案
修改后完整代码
//Long emalong = out1 > out2 macdlong = macd > signal and ((macd[1] < signal[1]) or (macd[2] < signal[2])) psarlong = psar < close and ((psar[1] > close[1]) or (psar[2] > close[2])) //Short emashort = out1 < out2 macdshort = macd < signal and ((macd[1] > signal[1]) or (macd[2] > signal[2])) psarshort = psar > close and ((psar[1] < close[1]) or (psar[2] < close[2])) //Collect 原信号条件 longentry = emalong and macdlong and psarlong shortentry = emashort and macdshort and psarshort // 新增信号过滤逻辑 var int last_signal_type = 0 // 0=初始无信号 1=上一次为买入信号 -1=上一次为卖出信号 var float last_buy_price = na var float last_sell_price = na valid_long = longentry and last_signal_type != 1 and (na(last_sell_price) or close < last_sell_price) valid_short = shortentry and last_signal_type != -1 and (na(last_buy_price) or close > last_buy_price) // 触发有效信号后更新状态 if valid_long last_signal_type := 1 last_buy_price := close if valid_short last_signal_type := -1 last_sell_price := close //Plot 改用过滤后的有效信号绘制 plotshape(valid_long, style=shape.circle, color=#26a69a, text="⬆", textcolor=#ffffff, location=location.belowbar, size=size.tiny) plotshape(valid_short, style=shape.circle, color=#ef5350, text="⬇", textcolor=#ffffff, location=location.abovebar, size=size.tiny)
逻辑说明
- 用
var关键字定义的变量会在脚本运行全程保留历史值,不会每根K线重新初始化,不需要额外调用valuewhen或barssince函数即可实现状态记录 - 买入信号过滤规则:原有买入条件触发的前提下,上一次生效信号不能是买入;如果历史上有过生效的卖出信号,当前K线收盘价需要低于上一次卖出信号的对应价格
- 卖出信号过滤规则:原有卖出条件触发的前提下,上一次生效信号不能是卖出;如果历史上有过生效的买入信号,当前K线收盘价需要高于上一次买入信号的对应价格
- 初始无信号阶段第一次符合条件的信号会直接放行,匹配初始空仓的使用场景
内容的提问来源于stack exchange,提问作者Zac Vaughn
相关产品推荐
相关产品推荐

