Pine Script自定义筛选器求助:多做多信号仅首个生效
问题根源
TradingView的多标的筛选器(Scanner)默认检测标的最新Bar的当前状态。你的long1是持续型条件——只要EMA1>EMA2且EMA2≥EMA3的状态维持,long1就会持续返回true;但long2和long3依赖ta.crossover,这是单次触发的事件型条件,仅在交叉发生的那一根Bar返回true,进入下一根Bar后该条件就会变回false。如果筛选器扫描时交叉事件已经过去,就无法识别这些条件的触发记录。
修正方案
要让筛选器能识别到long2和long3的触发记录,需要用持久化变量保存这些事件的触发状态,直到你指定的重置条件出现。以下是修正后的完整代码:
//@version=5 indicator("Multi-Condition Long Scanner", overlay=true) // 定义EMA周期(可根据需求调整) ema1 = ta.ema(close, 50) ema2 = ta.ema(close, 100) ema3 = ta.ema(close, 200) // 原始多单条件 long1 = ema1 > ema2 and ema2 >= ema3 long2 = ta.crossover(ema1, ema2) and ema2 >= ema3 long3 = ema1 >= ema3 and ta.crossover(ema2, ema3) // 用var定义持久化变量,保存事件型条件的触发状态 var bool long2_activated = false var bool long3_activated = false // 更新触发状态:当crossover发生时标记为true long2_activated := long2 ? true : long2_activated long3_activated := long3 ? true : long3_activated // 可选:添加重置条件(比如EMA排列完全反转时清空触发记录) reset_signal = ema3 > ema2 and ema2 > ema1 long2_activated := reset_signal ? false : long2_activated long3_activated := reset_signal ? false : long3_activated // 最终筛选条件:持续满足long1,或曾触发过long2/long3且未被重置 LongAlert = long1 or long2_activated or long3_activated alertcondition(LongAlert, title = "Long", message = "Make Long Entry")
补充说明
- 如果你只需要筛选最新Bar刚触发long2/long3的标的,无需持久化状态,可在TradingView筛选器的条件设置中,选择「指标值从false变为true」而非「指标值为true」,这样就能捕捉到交叉事件的瞬间触发信号。
- 代码中的重置条件可根据你的交易逻辑调整,比如换成空单信号触发、特定周期后的自动重置等。
内容的提问来源于stack exchange,提问作者Yash Chotrani
相关产品推荐
相关产品推荐

