Pine Script策略:多头下单正常但空头无法下单求助
PineScript空头止损订单无法触发问题排查与解决
问题说明
我是PineScript新手,编写的策略中,多头止损订单strategy.order("Long", strategy.long, stop = trailingStopLoss)可以正常触发,但空头止损订单strategy.order("Short", strategy.short, stop = trailingStopLossS)完全无法触发。已检查多空条件逻辑,看似正常,但不确定是否存在代码冲突,需排查解决建议。
代码片段
/// Long Condition /// condition1 = close >= sessionHighPrice and isInSession condition2 = (ta.crossunder(high, sessionHighPrice) or ta.crossunder(close, sessionHighPrice) or ta.crossunder(low, sessionHighPrice)) and isInSession condition3 = lowertimevariable >= sessionHighPrice // Track whether condition1 has been met in the session var bool condition1Met = false var bool condition2Met = false var bool condition3Met = false // Check for condition1 and set condition1Met to true when it's met if condition1[Timeequal5m] and not inSession condition1Met := true // Check for condition1 and set condition1Met to true when it's met if condition1Met and condition2[Timeequal5m] and not inSession condition2Met := true if condition2Met and condition3[0] and not inSession condition3Met := true var bool crosscondone = false trailingStopLoss = 0.0 stopvalue_long = 0.0 if (strategy.position_size > 0) if (high < partialExitPriceper) trailingStopLoss := math.max(perstop1, trailingStopLoss[1]) else if crossoverConditionper and not crosscondone //(high >= partialExitPriceper and high < SetTrailingper) trailingStopLoss := math.max(entryprice, trailingStopLoss[1]) crosscondone := true else if (high >= partialExitPriceper) stopvalue_long := math.max(high - ((trailingOffset / 100) * entryprice), entryprice) trailingStopLoss := math.max(stopvalue_long, trailingStopLoss[1]) /// Short Condition /// condition1S = close <= sessionLowPrice and isInSession condition2S = (ta.crossover(low, sessionLowPrice) or ta.crossover(close, sessionLowPrice) or ta.crossover(high, sessionLowPrice)) and isInSession condition3S = lowertimevariableS <= sessionLowPrice // Track whether condition1 has been met in the session var bool condition1SMet = false var bool condition2SMet = false var bool condition3SMet = false var bool flag_condition3SMet = false // Check for condition1 and set condition1Met to true when it's met if condition1S[Timeequal5m] and not inSession condition1SMet := true // Check for condition1 and set condition1Met to true when it's met if condition1SMet and condition2S[Timeequal5m] and not inSession condition2SMet := true if condition2SMet and condition3S[0] and not inSession condition3SMet := true var bool crosscondoneS = false trailingStopLossS = 0.0 stopvalue_short = 0.0 if (strategy.position_size < 0) if (low > partialExitPriceperS) trailingStopLossS := math.min(perstop1S, trailingStopLossS[1]) else if crossoverConditionperS and not crosscondoneS trailingStopLossS := math.min(entryprice, trailingStopLossS[1]) crosscondoneS := true else if (low <= partialExitPriceperS) stopvalue_short := math.min(low + ((trailingOffset / 100) * entryprice), entryprice) trailingStopLossS := math.min(stopvalue_long, trailingStopLossS[1]) /// Execute Strategy /// if condition1Met and condition2Met and condition3Met and strategy.position_size == 0 strategy.order("Long", strategy.long, stop = trailingStopLoss) if condition1SMet and condition2SMet and condition3SMet and strategy.position_size != 0 strategy.order("Short", strategy.short, stop = trailingStopLossS) if strategy.position_size > 0 if low < trailingStopLoss strategy.close("Long", comment = "Stop Loss 100", qty_percent = 100) if strategy.position_size < 0 if high > trailingStopLoss strategy.close("Short", comment = "Stop Loss 100", qty_percent = 100)
排查与解决建议
- 修正订单触发条件:空头订单触发条件中的
strategy.position_size != 0逻辑错误。如果是要开新的空头仓位,应改为strategy.position_size == 0;如果是要平多开空,需明确使用strategy.close先平仓再开空,或使用反向订单逻辑。 - 修复止损值初始化问题:当前
trailingStopLossS仅在已有空头持仓时才会赋值,开仓时trailingStopLossS为初始值0.0,导致止损价无效。需在开仓前根据当前价格计算初始止损值,而非仅持仓时赋值。 - 修正代码笔误:空头止损计算中
trailingStopLossS := math.min(stopvalue_long, trailingStopLossS[1])错误使用了多头的stopvalue_long,应改为stopvalue_short。 - 修正平仓逻辑变量:空头平仓条件中
high > trailingStopLoss错误使用了多头的止损变量,应改为high > trailingStopLossS。 - 重置会话条件变量:
condition1Met、condition1SMet等var定义的变量会永久保留值,若为逐session策略,需在每个新session开始时重置这些变量(比如通过ta.sessionchange()判断),避免条件持续满足导致逻辑混乱。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

