145 浏览
0

实盘异步程序,
需求:开完仓后就结束程序,请问 api.close() 应该写在哪里?
能不能给一个简单的模板?

chaos 已回答的问题 4天 前
0

不要在协程内部直接调用 `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` 再处理。

chaos 发表新评论 4天 前

有其他问题欢迎加入官方Q群748265037一起交流

您正在查看1个答案中的1个,单击此处查看所有答案。