Pine Script策略退出问题:trailing stop未全额平仓的解决咨询
Pine Script 策略退出条件修正方案
预设退出条件
- StopLoss:平仓全部仓位
- TP1:平仓初始仓位的1/3
- TP2:平仓初始仓位的1/3
- Trailing Stop:平仓全部仓位
问题现象
实际运行中Trailing Stop仅平仓200合约(预期400),原代码如下:
strategy.exit("TP1", "Buy", limit=tp1, qty=strategy.position_size/3) strategy.exit("TP2", "Buy", limit=tp2, qty=strategy.position_size/2) strategy.exit("TrailingStop", "Buy", stop=tl, qty=strategy.position_size) strategy.exit("StopLoss", "Buy", stop=stopLoss, qty=strategy.position_size)
原因分析
- TP1触发后,600合约平仓200,剩余400
- TP2触发时使用
strategy.position_size/2,实际平仓剩余仓位的1/2(200),剩余200 - Trailing Stop触发时,
strategy.position_size已更新为200,因此仅平仓剩余200,不符合预期 - StopLoss因仓位清空不会触发
修正方案
核心是基于初始开仓仓位设定各退出指令的平仓量,而非依赖动态变化的strategy.position_size。修改后的代码如下:
// 记录初始开仓仓位(仅在开仓时赋值) var float initial_position_size = na // 开仓逻辑示例(替换为你的实际开仓条件) if (entry_condition) strategy.entry("Buy", strategy.long) initial_position_size := strategy.position_size // 保存初始仓位 // 修正后的退出指令 strategy.exit("TP1", "Buy", limit=tp1, qty=initial_position_size / 3) strategy.exit("TP2", "Buy", limit=tp2, qty=initial_position_size / 3) strategy.exit("TrailingStop", "Buy", stop=tl, qty=initial_position_size) strategy.exit("StopLoss", "Buy", stop=stopLoss, qty=initial_position_size)
关键说明
- 原TP2的
strategy.position_size/2是逻辑错误,需改为initial_position_size/3以匹配预设的“平仓初始仓位1/3”需求 - 使用
var关键字确保initial_position_size仅在开仓时赋值一次,避免后续bar更新覆盖 - 当Trailing Stop或StopLoss触发时,Pine Script会自动平掉剩余的全部仓位,无需额外处理
内容的提问来源于stack exchange,提问作者Nayot Tientong
相关产品推荐
相关产品推荐

