Pine Script策略编写:实现首个信号触发后忽略后续重复信号

Pine Script v5 多周期EMA策略信号去重实现方案
原策略代码
//@version=5 strategy("My script") uptrend = request.security(syminfo.tickerid, "60", (ta.ema(close, 9) > ta.ema(close, 21))) downtrend = request.security(syminfo.tickerid, "60", (ta.ema(close, 9) < ta.ema(close, 21))) buy = request.security(syminfo.tickerid, "5", ta.crossover(ta.ema(close, 9), ta.ema(close, 21))) sell = request.security(syminfo.tickerid, "5", ta.crossunder(ta.ema(close, 9), ta.ema(close, 21))) if uptrend if buy strategy.entry("buy", strategy.long) if sell strategy.close("buy") if downtrend if sell strategy.entry("sell", strategy.short) if buy strategy.close("sell")
需求说明
上述基于Pine Script v5编写的多周期EMA交叉交易策略,采用60分钟周期EMA9与EMA21的多空排列判断趋势方向,以5分钟周期EMA交叉作为进出场信号。需要实现效果:当首个交易信号触发后,策略自动忽略后续其余重复信号,避免重复开仓。
实现代码
核心逻辑是新增两个持久化状态标记,记录多、空方向的开仓信号是否已经执行过,开仓后锁定标记忽略重复信号,平仓后重置标记等待下一轮信号即可。
//@version=5 strategy("My script", overlay=true) // 信号触发状态标记,var修饰的变量会逐K线保留值,不会自动重置 var longSignalFired = false var shortSignalFired = false uptrend = request.security(syminfo.tickerid, "60", ta.ema(close, 9) > ta.ema(close, 21)) downtrend = request.security(syminfo.tickerid, "60", ta.ema(close, 9) < ta.ema(close, 21)) buy = request.security(syminfo.tickerid, "5", ta.crossover(ta.ema(close, 9), ta.ema(close, 21))) sell = request.security(syminfo.tickerid, "5", ta.crossunder(ta.ema(close, 9), ta.ema(close, 21))) // 多头开仓:上升趋势+买信号+多头信号未触发过 if uptrend and buy and not longSignalFired strategy.entry("buy", strategy.long) longSignalFired := true shortSignalFired := false // 多头平仓:平多后重置多头标记,允许下一轮开多 if sell strategy.close("buy") longSignalFired := false // 空头开仓:下降趋势+卖信号+空头信号未触发过 if downtrend and sell and not shortSignalFired strategy.entry("sell", strategy.short) shortSignalFired := true longSignalFired := false // 空头平仓:平空后重置空头标记,允许下一轮开空 if buy strategy.close("sell") shortSignalFired := false
改动说明
- 用
var定义两个布尔变量作为信号锁,分别对应多、空方向的信号触发状态,初始化值为false - 开仓条件新增信号锁判断,只有锁为
false(信号未触发)时才执行开仓,开仓后立刻把对应方向的锁设为true,后续重复的同方向信号会被直接过滤 - 平仓操作执行时重置对应方向的信号锁,等下一轮趋势符合条件时可以正常响应新信号
- 开仓时同步重置反向信号的锁,避免多空状态冲突
内容的提问来源于stack exchange,提问作者user17585775
相关产品推荐
相关产品推荐

