You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 00:01:24