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)
关键修改说明
- 跟踪未成交订单:通过
strategy.opentrades检查是否存在ID为"Long"的未成交订单。 - 取消旧订单:每次提交新限价单前,先取消未成交的旧单,避免重复挂单。
- 动态更新限价:在每根K线周期内,只要条件持续满足,就会用最新的
ema3价格重新提交限价单,保证限价始终跟随MA的最新值。
内容的提问来源于stack exchange,提问作者Blake Macy
相关产品推荐
相关产品推荐

