2.12K 浏览
0

因为wait_update是阻塞的,所以该用到deadline,但是用的过程发现问题。

while True:
deadline = time.time() + 1
api.wait_update(deadline=deadline)
if is_changing(kline.iloc[-1], ‘datetime’)
do_sth()

这段程序在夜盘早盘开市前启动,还未进入交易时间就不断地执行do_sth,无论此合约有没夜盘,在早上开盘前不断执行,一直到09:00:00后再执行一次。
按照if里面的判断。这个时候的datetime应该是没有变化的。
这样如果在do_sth中做一些原本希望每个新k产生才做的动作,特别是有迭代计算的时候,如i=i+1,就可能产生不可预知的结果了。比如做日k,有夜盘的,在昨晚夜盘时应该产生新的k线,执行了do_sth,早上开盘时,昨晚夜盘和今天是同一交易日,应该不会产生新的k线,所以这时do_sth不应该执行的。

没有夜盘的,早盘前启动程序,也一样的情况,不知道服务器什么时候启动改变了这个kline.iloc[-1].datetime。

如果加上交易时间控制,因为行情时间和本地时间是有差异的,因此不知道设置在什么时间合适。

李思恒 已回答的问题 2021年10月27日
0

datetime这个应该是在交易时间内才会有变化,可以看一下我们的最新版本有一个函数是判断开盘与否

uyesino 发表新评论 2021年10月27日

@李思恒
我是在do_sth中print(kline.iloc[-1].datetime,可以看到时间是没有变化的,但是正好在设置的deadline每秒就执行一次,因此开盘前这个if条件确实是成立的,才会一直执行do_sth。
您说的是get_trading_status这个函数吧,我看了status:
交易状态, AUCTIONORDERING: 集合竞价报单; CONTINOUS: 连续交易; NOTRADING: 非交易时段
我现在的程序中也自己编了一个判断交易时间状态的函数,我有一个问题,就是is_changing和这个status的状态变化逻辑是怎样的,这两个逻辑应该如何结合起来用呢?
如果我用了这个交易状态去限制新k产生的逻辑,那么会不会漏掉呢?比如说在前一个wait_update(带有deadline)后,新k产生了,但是还没有在交易时间内,因此没有执行逻辑,等下一个wait_update后,开始交易了,但是在这个wait_update内,新k的is_changing又不成立,所以就一直没法执行新k逻辑了?
我只是发现了做一个is_changing的问题,不知道quote、position等等其他接口的is_changing逻辑会不会也有问题,测试太浪费精力了。

另外,我感觉wait_update和is_changing的逻辑不大好,建议wait_update进行状态刷新,is_changing进行状态判断,在工控上的PLC等都是这么个设计。这样wait_update也不用是阻塞的,交易数据的获取也是最新最及时的,毕竟中间漏掉的数据在天勤服务器端都有,可以去用,漏掉的问题并不大,最新的重要性更大些。wait_update在交易时间内有意义,但是在交易前后还有一些事情是需要处理的,阻塞的话,就什么也干不了了。

wait_update其实不是用来阻塞的, 是来检测状态是否刷新以及是否有任务的,阻塞是因为没有任何任务和信息刷新

@李思恒
但是阻塞也不应该在盘前出现is_changing触发啊,毕竟盘前没有行情。
晚上盘前我又观察到不但是主k有is_changing(kline.iloc[-1],’datetime’)触发,而且is_changing(quote,[‘last_price’, ‘datetime’])也被触发了。
好晕啊