4.43K 浏览
0

用快期模拟交易,au2102合约,大前天晚上从晚上11点,程序运行比较混乱,出现莫名其妙的1秒开仓1秒平仓的情况,连续开平了差不多1000次,直到收市。

以前没出现这种情况,稳定运行了一个多月,开平仓逻辑一直正常,查不出原因,不过昨天对网络延时进行检查,发现前天晚上也是差不多11点多开始就出现延时的情况(之前可能也有,只是没有关注到),用quote.datetime和datetime.now()比较,差不多1秒多的样子。

看论坛问题:https://www.shinnytech.com/question/7973/,建议用api.wait_update(deadline=deadline),但是看说明:

Args:
deadline (float): [可选]指定截止时间,自unix epoch(1970-01-01 00:00:00 GMT)以来的秒数(time.time())。默认没有超时(无限等待)
Returns:
bool: 如果收到业务数据更新则返回 True, 如果到截止时间依然没有收到业务数据更新则返回 False

对其中的道理不是很明白,就近是wait_update在deadline的时间里,只要有行情更新即终止等待返回True,还是说等待deadline那么长的时间才根据是否有更新返回True或者False,类似堵塞延时那个样子呢?
感觉前面一种没什么用途,后面一种功能则是迫切需要的。

ringo 已回答的问题 2020年12月7日
0

行情和本地时间差的意思是,不仅行情发出来到本地会有对应延时,另外交易所的时钟和你自己电脑的时钟也并不会是对齐的

ringo 已回答的问题 2020年12月7日
0

开仓和平仓是用的insert_order还是targetpostask,然后是否有同一个账户多个程序同时在操作

另外是否有跨交易日重启呢

quote.datetime和datetime.now() 这两个代表的是交易所发出这笔行情时间和本地时间,交易所的本地时间和用户本地时间是有时间差偏移的

如果你在程序内使用了 time.sleep() 也会造成整体延时

首先不填deadline参数那wait_update()是有行情更新就会返回True没有即会无限等待,填入deadline参数后,deadline参数时间范围内,有更新返回为True,无更新则等待,当等待到了deadline规定的时间点后即后会返回False

yg1025 发表新评论 2020年12月9日

@ringo
开平仓用的都是targetpostask。
在阿里云centos8上同一个账户4个程序同时操作4个不同合约。
其实程序也是相同的,同一策略在4个screen上运行。
合约交易停止时,包括中午11点30,策略都停止,api关闭,程序也停止,即python程序停止,但是该screen不关闭。每日9点前,1点30前及晚上21点前,即交易前,在screen中自动运行python程序,启动策略,交易不同合约。
另外,就是每天早上6点重启云服务器。
策略里面没有用到time.sleep,只是在while…wait_update…之外使用到进行延时,避免同时操作记录文件,这是api都已经关闭了,应该没关系的。
我理解行情时间和本地时间有差别,但是云服务器接收也要1,2秒以上延时,这个有点太大了吧。
我修改程序,在其中假如延时判断及过滤,超过1秒的报警,前天3号晚上au和ag两个主力合约还是在晚上接收到多次的报警,不到10次,比之前少了很多。不过昨天4号则一次都没有。不过3号我将云服务器anaconda和库升级到最新,并把tqsdk从2.0.5升级到最新,不知道有没关系。

2个建议:
1. 程序运行稳定就不要轻易升级。
2. 尽量用示例程序当中的语句,不要轻易自己独创(特别是与TAAPI相关的)