5.92K 浏览
0

看到论坛上有说不能用

time.sleep()

而改用

# 暂停5秒时间
deadline = time.time() + 5
while api.wait_update(deadline=deadline):
    pass

但我看了wait_update说明,括号里的参数是用于数据没返回超时用的,以上代码只能说在5秒内没有返回数据不再等待继续执行,如果5秒内有数据返回就立马执行了,而不是延迟5秒执行。

yang89520 已回答的问题 2020年9月22日
1

这三句话的加一起是sleep的功能,并不是在这个while循环里做操作。意思是收到行情直到5秒后都不会处理数据一致pass,不能在这个while循环里去做别的操作,把他们组合起来当做time.sleep()这个函数就好了

期货特特 发表新评论 2020年9月11日

while True:
position = api.get_position()
api.wait_update() # 发送请求,更新数据
print(“开始写出目标持仓信息 “+time.strftime(“%Y-%m-%d %H:%M:%S”))
print(position)

# 暂停60秒时间
deadline = time.time() + 60
while api.wait_update(deadline=deadline):
pass

api.close()

代码实测,收到数据就退出循环了,并没有延迟5秒

0

感谢,解决了我的问题

yang89520 已回答的问题 2020年9月22日
0

如果你是单线程,但又要延迟5s的话,整个程序都会傻在那儿愣5秒,推荐学习一下如何用多线程开发或者协程开发

yang89520 发表新评论 2020年9月22日

我理解他的意思是:
有没有办法能实现一个超时的阻塞,然后在这段时间内更新到了最新的数据,就继续运行,不再sleep

0

最主要还是看你预期所谓的“暂停” 是什么操作,因为在tqsdk里有实盘模式和回测/复盘模式,所以大家说的不推荐使用 time.sleep()的出发点在于这个是着实会停一段时间的,无论是实盘也好,回测也好。在实盘中暂停当然就是预期的行为,但是在回测的时候就会“拖后腿”,我们回测通常时候是为了快速出结果,如果每个循环里都有个暂停的话,回测的速度就会很慢。

因此大家说的推荐使用 wait_update 里的 deadline参数一定程度上规避了这个问题,无论是实盘也好,回测也好,有新数据就推进算法,没数据最多也只停 deadline的时间。如果你真的是想在任何情况下都暂停的话,大胆地使用 time.sleep 就好。

如果仅是因为需要等某个操作完成的话,可以await 那个对应的 task。

lookis 已回答的问题 2020年9月12日