使用strategy.exit添加止损遇异常:无止损或超3000无效订单求助
问题分析与修复方案
你的代码核心问题是未利用持仓状态变量控制重复入场,导致每次条件满足时都会重复执行开仓和止损指令,进而生成大量无效订单;同时止损指令的重复调用也可能出现无法正确绑定持仓的情况。
核心问题点
long_active和short_active变量定义后未用于控制开仓条件,只要current>prev或current<prev的K线出现,就会反复触发开仓操作,同一方向多次开仓+重复挂止损,引发无效订单strategy.exit在每次开仓时都调用,无持仓状态判断的情况下会重复生成止损单,甚至和旧持仓产生冲突
修复后的代码
var int long_active = 0 var int short_active = 0 // 示例:基于ATR设置止损,你可根据策略逻辑替换stop_loss的定义 stop_loss = strategy.position_avg_price - ta.atr(14) * 1.5 if(hour == 23) short_active := 0 long_active := 0 strategy.cancel_all() strategy.close_all() // 做多条件:仅无多头持仓时开仓 if (current > prev and 2 < hour and hour < 23 and long_active == 0) // 平空仓(若存在) if (short_active == 1) strategy.cancel("short_exit") strategy.close("short") short_active := 0 // 开多仓并绑定止损 strategy.entry("long", strategy.long, comment="long") strategy.exit("long_exit", "long", stop = stop_loss) long_active := 1 // 做空条件:仅无空头持仓时开仓 if (current < prev and 2 < hour and hour < 23 and short_active == 0) // 平多仓(若存在) if (long_active == 1) strategy.cancel("long_exit") strategy.close("long") long_active := 0 // 开空仓并绑定止损 strategy.entry("short", strategy.short, comment="short") strategy.exit("short_exit", "short", stop = stop_loss) short_active := 1
关键修改说明
- 用
long_active == 0和short_active == 0限制同一方向仅开一次仓,避免重复触发开仓指令 - 平反向仓位时增加状态判断,仅当反向持仓存在时才执行平仓和取消止损操作,减少无效指令
- 开仓后立即更新对应持仓状态变量,确保不会重复开仓
- 注意:
stop_loss需根据你的策略逻辑正确定义,比如基于入场价的固定点数、ATR倍数等,避免因止损价格无效导致无法触发止损
内容的提问来源于stack exchange,提问作者emu
相关产品推荐
相关产品推荐

