vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 22
声望: 2

根据我的多日测试,发现在正常下单后,vnpy的订单状态有几段的时间处于提交中,然后马上就变为未成交或者已成交,在这之后仍然可以接收到order_event,position_event和account_event,但是一旦发生异常,订单会一直处于'提交中',此时CTP接口不再有order_event,position_event和account_event推送,行情推送正常,并且也无法手动下任何订单,推测可能是CTP接口不明原因挂掉了,而且这种情况容易出现在岗开盘和开药收盘的时候,一旦挂掉,在交易时段都收不到任何时间推送,也无法发送请求,貌似只有在vnpy中添加一个退出和重新加载接口的功能,以便在不用的时候退出接口,在到交易时间的时候重新加载接口,并且可以检测当长时间收不到account_event的时候可以推定为CTP接口已经挂掉了,可以退出重新加载CTP

Member
avatar
加入于:
帖子: 22
声望: 2

还有一点,在重启vnpy后,之前一直处于"提交中"的订单会从委托页面上消失,然后就正常了

Administrator
avatar
加入于:
帖子: 4208
声望: 239

请在cmd中用python -m vnstation启动,卡住后看看cmd是否有任何报错?

【提交中】的委托是本地缓存的委托提交状态,此时还没收到柜台回报,所以重启后自然就消失了。

Member
avatar
加入于:
帖子: 22
声望: 2

我是直接在vnpy文件夹下面建立run.py,然后 python run.py来运行的,卡主后,除了撤单操作和发单操作都不能成功执行外,根本没有异常信息,还有就是卡住后,发送订单函数返回的是空列表:[],而且撤单函数执行多次后,这个订单还是在那里,种种迹象表明就是CTP里面出现了错误,但是这个错误又显示不出来.而且我曾经尝试在卡住后收到了连接了一下CTP,但是连接后问题还是没有解决,,
我在C:\vnstudio\Lib\site-packages目录下面运行python -m vnstation,不能执行,报错信息如下:
C:\vnstudio\Lib\site-packages>python -m vnstation
Traceback (most recent call last):
File "C:\vnstudio\lib\runpy.py", line 193, in _run_module_as_main
"main", mod_spec)
File "C:\vnstudio\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\vnstudio\Lib\site-packages\vnstation__main__.py", line 1, in <module>
from vnstation.cli import cli
File "C:\vnstudio\Lib\site-packages\vnstation\cli.py", line 3, in <module>
from typing import TYPE_CHECKING
File "C:\vnstudio\lib\typing.py", line 28, in <module>
import re as stdlib_re # Avoid confusion with the re we export.
File "C:\vnstudio\lib\re.py", line 143, in <module>
class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'

也不知道是不是我执行的方式有问题,不能运行,

Member
avatar
加入于:
帖子: 936
声望: 47

run.py应该放在.vntrader同一个文件夹里吧

Member
avatar
加入于:
帖子: 22
声望: 2

这个不影响运行的,另外我也遇到过这种没有报错,但是程序卡住的情况,就是在使用酷Q机器人的开源库NoneBot编写机器人,当时这个模块有个问题,里面发送消息调用的函数都是async函数,比如里面的async send_QQmsg(),要调用这种函数的函数也必须是async函数,这就必须要求我把自己的框架的所有函数都改为async类的,感觉太麻烦了,于是我找到一种办法,使用一个好像是asyncio得模块,使用普通函数直接调用send_QQmsg而不必将这个普通函数重构为async函数,但问题也随之而来,每次调用完send_QQmsg后,都会莫名其妙的需要等待60秒才能执行下一次调用,后来我经过多次测试,发现如果使用async函数来执行调用,就不存在需要等待60秒的情况,我的编程经验不是很丰富,但是经过坚持不懈的测试,又到NoneBot的群里问了,send_QQmsg在调用后会在60秒内等待服务器返回发送成功的回报,收到回报或60秒结束后函数才会返回,这时才能进行下一次调用,
所以我推测,CTP接口里面也有类似的这种东西,send_order()会等待服务器的回报才能退出函数,然后里面发送订单,接受事件推送等与之相关的线程才能执行,否则一直处于阻塞状态。问题就出在send_order发送订单后,可能服务器因为网络繁忙,丢包了,发送的没有收到,于是就一直没有给send_order()回应,于是send_order()就一直处于等待状态,导致CTP里面所有的执行线程全部阻塞,无法被调用,CTP接口是编译好的pyd文件,C++的代码我也看不懂,所以暂时无法验证推测是否正确,目前只能暂时尝试重构代码,在发生异常时重启CTP接口

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3