PyAlgoTrade exit order事件onExitOk未触发 提交限价单后余额无变化求助
问题解决方案
核心问题原因
onExitOk是持仓绑定的专属回调,只有通过持仓实例的退出方法提交的平仓单,成交后才会触发该回调。你直接调用全局limitOrder提交的是独立订单,没有和当前持仓关联,框架不会将其识别为对应持仓的退出操作,自然不会触发onExitOk。- 提交订单后立刻读取资金无变化是框架的正常设计:所有订单提交后只会先进入撮合队列,要等下一次行情更新完成撮合、推送成交事件后,才会更新账户资金、持仓数据,提交订单的瞬间不会同步修改账户状态。
- 你的代码存在变量覆盖问题:你将原本用来存储持仓实例的
self.position直接赋值为limitOrder返回的订单对象,原有持仓实例被覆盖丢失,框架也无法找到对应持仓触发回调。
修复方案
1. 改用持仓实例的退出方法提交平仓单
将_closePosition方法中提交平仓单的逻辑替换为持仓实例的exitLimit方法,确保订单和持仓绑定:
def _closePosition(self, price, qty, reason, date): print("Closing position with price", price, "and closing qty", qty) brk = self.getBroker() total_shares = brk.getShares(self.instrument) sell_shares = int(total_shares * qty) # 注意数量要符合交易标的最小单位要求 print("Cash now before sell: ", brk.getCash(self.instrument)) self.info("Sell BTC %s at %s because %s on %s " % (sell_shares, price, reason, date)) # 改为用当前持仓实例提交限价平仓单,不要覆盖self.position if self.position is not None and self.position.getShares() > 0: self.position.exitLimit(price, sell_shares) print("Cash now after sell: ", brk.getCash(self.instrument))
2. 调整业务逻辑的执行时机
所有依赖成交后资金、持仓数据的计算逻辑,不要放在提交订单的同一个函数里执行,移到onExitOk回调中处理,确保使用的是更新后的正确数据。
3. 特殊场景下的兼容方案
如果你确实需要提交独立平仓单,不要依赖onExitOk回调,改为监听框架通用的订单成交事件(如onOrderUpdated/onTrade)自行处理平仓后的业务逻辑即可。
内容的提问来源于stack exchange,提问作者shakalakka
相关产品推荐
相关产品推荐

