不要在协程内部直接调用 `api.close()`。`api.close()` 需要在外层 `wait_update()` 返回后调用;如果在协程运行时调用,会报类似“不能在协程中调用 close”的错误。
模板思路是:协程负责下单并等订单结束,外层负责持续 `wait_update()`,任务完成后再关闭 api。
示例结构可以按下面的顺序写:
1. 在异步函数 `open_once()` 中调用 `api.insert_order` 下单。
2. 在异步函数里用 `api.register_update_notify(order)` 等待订单状态更新。
3. 当 `order.status` 变成 `FINISHED` 后,从异步函数 `return`。
4. 外层用 `task = api.create_task(open_once())` 创建任务。
5. 外层循环 `while not task.done(): api.wait_update()` 驱动 TqSdk 收发数据。
6. 循环结束后先调用 `task.result()` 取出协程异常,再在 `finally` 里调用 `api.close()`。
注意订单状态变成 `FINISHED` 只代表订单生命周期结束;如果 `volume_left` 为 0 才是全部成交。如果还有剩余手数,说明可能是撤单、拒单或部分成交,需要根据 `last_msg` 再处理。
有其他问题欢迎加入官方Q群748265037一起交流