无法在开新仓前平仓?Pine Script策略平仓开仓异常求助
为啥持有多头时触发空头信号只会开新仓不平仓?
你当前的代码逻辑有个漏洞:当你持有多头仓位(strategy.position_size > 0)且触发空头条件(condition == -1)时,代码只会执行平多操作,但平多之后仓位变成0的状态,不会在同一根K线里触发后面的开空条件——因为Pine Script是按代码从上到下逐行运行的,执行平多语句时,仓位的变化不会立刻同步到后续的条件判断里,导致开空逻辑直接被跳过了。
另外你原代码里的strategy.close写法也有小问题:第一个参数是注释,第二个才是要平仓的仓位ID(即开仓时定义的名称),你写的strategy.close("Short_close", "Short")里,"Short_close"是注释没问题,但如果开仓时的ID不是"Short",也会导致平仓失败。
为啥加了strategy.position_size == 0后策略直接失效?
你加这个判断后,开仓逻辑只能在完全无仓位的时候触发,但代码里没有处理「反向信号时平现有仓位+开反向仓位」的联动操作——一旦持有了多头或空头仓位,后续任何信号都满足不了position_size == 0的条件,自然就不会有任何操作,策略直接停摆。
两种修复方案
方案1:用自动反转(推荐,代码更简洁)
直接利用strategy.entry的特性,让系统自动处理反向信号下的平仓+开仓,不用手动写平仓逻辑:
// 多头信号:没空头仓位就开多,有空头仓位就平空开多 if condition == 1 strategy.entry("Long", strategy.long, when = strategy.position_size <= 0) // 空头信号:没多头仓位就开空,有多头仓位就平多开空 if condition == -1 strategy.entry("Short", strategy.short, when = strategy.position_size >= 0)
只要触发反向信号,系统会自动平掉现有仓位,同时开反向仓位,一步到位。
方案2:手动调整逻辑顺序
如果一定要手动控制平仓,就先处理平仓,再处理开仓,同时修改开仓的条件:
// 先处理平仓:反向信号触发时平掉现有仓位 if condition == 1 and strategy.position_size < 0 strategy.close("Short", comment="平空头") if condition == -1 and strategy.position_size > 0 strategy.close("Long", comment="平多头") // 再处理开仓:只要当前仓位和目标方向不冲突就开仓 if condition == 1 and strategy.position_size <= 0 strategy.entry("Long", strategy.long) if condition == -1 and strategy.position_size >= 0 strategy.entry("Short", strategy.short)
这里把开仓条件的==0改成<=0(多头)和>=0(空头),这样平完仓后仓位变0时,能立刻触发开仓;而且先跑平仓再跑开仓,确保同一根K线里能完成两次操作。
内容的提问来源于stack exchange,提问作者0BLaKo

