api.close() 不能直接在协程里调用。TqSdk 的协程任务是由外层 api.wait_update() 推进的,协程正在运行时调用 api.close() 会报“不能在协程中调用 close”这一类错误。
处理方式是:协程里只负责 return 结束任务,真正的 api.close() 放在外层 wait_update() 循环退出后的 finally 里。
下面是一个可以直接按结构运行的例子,退出条件这里用“拿到最新价后退出”演示,实际使用时把 if quote.last_price == quote.last_price: 换成你自己的退出条件即可:
<code>from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote = api.get_quote("KQ.m@SHFE.au")
async def main():
async with api.register_update_notify(quote) as update_chan:
async for _ in update_chan:
if quote.last_price == quote.last_price:
print("退出程序")
return
task = api.create_task(main())
try:
while not task.done():
api.wait_update()
task.result()
finally:
api.close()</code>
核心点是:不要在 async def 里面直接 api.close();让协程退出,回到外层主循环后统一关闭 api。
有效,非常感谢!
有其他问题欢迎加入官方Q群748265037一起交流