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

Pine Script v5:如何更新入场限价单价格?

在Pine Script v5中更新限价单至最新MA价格的实现方法

我的策略会在满足特定条件时,在移动平均线(MA)位置设置多头入场限价单。但有时该限价会大幅偏离当前价格,我希望在每根K线结束时将限价更新为最新的MA价格。请问这个需求在Pine Script v5中是否可以实现?

原策略代码

//@version=5
strategy("My strategy", overlay=true, margin_long=100, margin_short=100)
//-------------------------------------------------------------------------------------------------------------------------------------
//SQUEEZE CODE WITHOUT PLOTS
length = input.int(20, "TTM Squeeze Length")
//-------------------------------------------------------------------------------------------------------------------------------------
//BOLLINGER BANDS
BB_mult = input.float(2.0, "Bollinger Band STD Multiplier")
BB_basis = ta.sma(close, length)
dev = BB_mult * ta.stdev(close, length)
BB_upper = BB_basis + dev
BB_lower = BB_basis - dev
//-------------------------------------------------------------------------------------------------------------------------------------
//DEFINE EMA's
ema1 = ta.ema(close, 8)
ema2 = ta.ema(close, 21)
ema3 = ta.ema(close, 34)
ema4 = ta.ema(close, 55)
ema5 = ta.ema(close, 89)
ema6 = ta.ema(close, 250)
//-------------------------------------------------------------------------------------------------------------------------------------
//KELTNER CHANNELS
KC_mult_high = input.float(1.0, "Keltner Channel #1")
KC_mult_mid = input.float(1.5, "Keltner Channel #2")
KC_mult_low = input.float(2.0, "Keltner Channel #3")
KC_basis = ta.sma(close, length)
devKC = ta.sma(ta.tr, length)
KC_upper_high = KC_basis + devKC * KC_mult_high
KC_lower_high = KC_basis - devKC * KC_mult_high
KC_upper_mid = KC_basis + devKC * KC_mult_mid
KC_lower_mid = KC_basis - devKC * KC_mult_mid
KC_upper_low = KC_basis + devKC * KC_mult_low
KC_lower_low = KC_basis - devKC * KC_mult_low
//-------------------------------------------------------------------------------------------------------------------------------------
//SQUEEZE CONDITIONS
NoSqz = BB_lower < KC_lower_low or BB_upper > KC_upper_low //NO SQUEEZE: GREEN
LowSqz = BB_lower >= KC_lower_low or BB_upper <= KC_upper_low //LOW COMPRESSION: BLACK
MidSqz = BB_lower >= KC_lower_mid or BB_upper <= KC_upper_mid //MID COMPRESSION: RED
HighSqz = BB_lower >= KC_lower_high or BB_upper <= KC_upper_high //HIGH COMPRESSION: ORANGE
//-------------------------------------------------------------------------------------------------------------------------------------
//SETUP
setup = BB_lower >= KC_lower_mid or BB_upper <= KC_upper_mid ? 1 : 0
setupSum = math.sum(setup, 8)
//-------------------------------------------------------------------------------------------------------------------------------------
//BREAKOUT
breakOut = BB_lower < KC_lower_low or BB_upper > KC_upper_low ? 1 : 0
breakOutSum = math.sum(breakOut, 2)
//-------------------------------------------------------------------------------------------------------------------------------------
//TRADING CONDITIONS
condition1 = setupSum >= 2 and breakOutSum >= 2
//-------------------------------------------------------------------------------------------------------------------------------------
if (condition1 == true and close > ema4 and strategy.position_size == 0)
    strategy.entry("Long", strategy.long, limit = ema3)

实现方法

可以实现。核心思路是每根K线结束时取消未成交的旧限价单,再提交以最新MA价格为限价的新订单。具体修改如下:

修改后的策略代码

//@version=5
strategy("My strategy", overlay=true, margin_long=100, margin_short=100)
//-------------------------------------------------------------------------------------------------------------------------------------
//SQUEEZE CODE WITHOUT PLOTS
length = input.int(20, "TTM Squeeze Length")
//-------------------------------------------------------------------------------------------------------------------------------------
//BOLLINGER BANDS
BB_mult = input.float(2.0, "Bollinger Band STD Multiplier")
BB_basis = ta.sma(close, length)
dev = BB_mult * ta.stdev(close, length)
BB_upper = BB_basis + dev
BB_lower = BB_basis - dev
//-------------------------------------------------------------------------------------------------------------------------------------
//DEFINE EMA's
ema1 = ta.ema(close, 8)
ema2 = ta.ema(close, 21)
ema3 = ta.ema(close, 34)
ema4 = ta.ema(close, 55)
ema5 = ta.ema(close, 89)
ema6 = ta.ema(close, 250)
//-------------------------------------------------------------------------------------------------------------------------------------
//KELTNER CHANNELS
KC_mult_high = input.float(1.0, "Keltner Channel #1")
KC_mult_mid = input.float(1.5, "Keltner Channel #2")
KC_mult_low = input.float(2.0, "Keltner Channel #3")
KC_basis = ta.sma(close, length)
devKC = ta.sma(ta.tr, length)
KC_upper_high = KC_basis + devKC * KC_mult_high
KC_lower_high = KC_basis - devKC * KC_mult_high
KC_upper_mid = KC_basis + devKC * KC_mult_mid
KC_lower_mid = KC_basis - devKC * KC_mult_mid
KC_upper_low = KC_basis + devKC * KC_mult_low
KC_lower_low = KC_basis - devKC * KC_mult_low
//-------------------------------------------------------------------------------------------------------------------------------------
//SQUEEZE CONDITIONS
NoSqz = BB_lower < KC_lower_low or BB_upper > KC_upper_low //NO SQUEEZE: GREEN
LowSqz = BB_lower >= KC_lower_low or BB_upper <= KC_upper_low //LOW COMPRESSION: BLACK
MidSqz = BB_lower >= KC_lower_mid or BB_upper <= KC_upper_mid //MID COMPRESSION: RED
HighSqz = BB_lower >= KC_lower_high or BB_upper <= KC_upper_high //HIGH COMPRESSION: ORANGE
//-------------------------------------------------------------------------------------------------------------------------------------
//SETUP
setup = BB_lower >= KC_lower_mid or BB_upper <= KC_upper_mid ? 1 : 0
setupSum = math.sum(setup, 8)
//-------------------------------------------------------------------------------------------------------------------------------------
//BREAKOUT
breakOut = BB_lower < KC_lower_low or BB_upper > KC_upper_low ? 1 : 0
breakOutSum = math.sum(breakOut, 2)
//-------------------------------------------------------------------------------------------------------------------------------------
//TRADING CONDITIONS
condition1 = setupSum >= 2 and breakOutSum >= 2
//-------------------------------------------------------------------------------------------------------------------------------------
// 检查是否存在未成交的多头入场单
hasPendingLong = strategy.opentrades.size > 0 and strategy.opentrades.entry_id(0) == "Long"

// 每根K线结束时,若条件满足且无持仓:取消旧单,提交新的限价单
if (condition1 and close > ema4 and strategy.position_size == 0)
    // 取消未成交的同名订单
    if (hasPendingLong)
        strategy.cancel("Long")
    // 提交以最新EMA3为限价的新订单
    strategy.entry("Long", strategy.long, limit = ema3)

关键修改说明

  1. 跟踪未成交订单:通过strategy.opentrades检查是否存在ID为"Long"的未成交订单。
  2. 取消旧订单:每次提交新限价单前,先取消未成交的旧单,避免重复挂单。
  3. 动态更新限价:在每根K线周期内,只要条件持续满足,就会用最新的ema3价格重新提交限价单,保证限价始终跟随MA的最新值。

内容的提问来源于stack exchange,提问作者Blake Macy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:57:23