网关接口的状态感知
1 行情和交易服务器的接口状态
网关分很多种,如CTP,XTP等 。其中CTP中又包含行情(MD)接口和交易(TD)接口。它们在连接和断开的时候,都有推送接口。这些接口是:
MD的onFrontConnected()和onFrontDisconnected(),TD的onFrontConnected()和onFrontDisconnected()。行情和交易服务器的接口状态,vnpy已经做了log输出,用户是可以阅读的,可是不方便软件使用,于是对接口和主引擎做了如下修改,以便于上层应用可以使用这些消息,编写出针对行情服务器通断情况的处理方法,也可以编写针对交易服务器连接的处理方法。
2 实现步骤
下面的代码修改时,需要相互引用的部分,如from... import... 之类的,就不再逐一指出了,太基础了。
2.1 在vnpy\trader\event.py添加如下消息类型:
EVENT_CONNECT = "eConnected" # hxxjava add
EVENT_DISCONNECT = "eDisconnected" # hxxjava add
2.2 在vnpy\trader\object.py添加如下数据类型:
@dataclass
class GatewayData(): # hxxjava add
"""
Gateway data
"""
name:str = "" # 网关名称,如 'CTP'
type:str = "" # 接口类型,如 'TD','MD'
reason:int = 0 # 状态或者原因
2.3 在vnpy\trader\gateway.py 中为BaseGateway添加如下函数:
def on_connect(self,gateway:GatewayData) -> None: # hxxjava add
"""
gateway connect enent
"""
self.on_event(EVENT_CONNECT, gateway)
def on_disconnect(self,gateway:GatewayData) -> None: # hxxjava add
"""
gateway disconnect enent
"""
self.on_event(EVENT_DISCONNECT, gateway)
2.4 在vnpy\app\ctp\ctp_gateway.py 中修改如下4个函数:
1 CtpMdApi类的两个函数:
def onFrontConnected(self):
"""
Callback when front server is connected.
"""
self.gateway.on_connect(GatewayData("CTP",'MD')) # hxxjava add
self.gateway.write_log("行情服务器连接成功")
self.login()
def onFrontDisconnected(self, reason: int):
"""
Callback when front server is disconnected.
"""
self.login_status = False
self.gateway.on_disconnect(GatewayData(name="CTP",type='MD',reason=reason)) # hxxjava add
self.gateway.write_log(f"行情服务器连接断开,原因{reason}")
2 CtpTdApi类的两个函数:
def onFrontConnected(self):
""""""
self.gateway.on_connect(GatewayData("CTP",'TD')) # hxxjava add
self.gateway.write_log("交易服务器连接成功")
if self.auth_code:
self.authenticate()
else:
self.login()
def onFrontDisconnected(self, reason: int):
""""""
self.login_status = False
self.gateway.on_disconnect(GatewayData(name="CTP",type='TD',reason=reason)) # hxxjava add
self.gateway.write_log(f"交易服务器连接断开,原因{reason}")
2.5 修改vnpy\trader\engine.py中的主引擎MainEngine
修改register_event()函数:
def register_event(self):
... ...
# 添加下面两句
self.event_engine.register(EVENT_CONNECT, self.process_connect_event)
self.event_engine.register(EVENT_DISCONNECT, self.process_disconnect_event)
添加下面两个消息处理函数:
def process_connect_event(self, event: Event) -> None:
gateway:GatewayData = event.data
print(f"gateway connect event {gateway}")
def process_disconnect_event(self, event: Event) -> None:
gateway:GatewayData = event.data
print(f"gateway disconnect_event {gateway}")
3 如何测试
在VN Studio Prompt窗口输入python - m vnstation命令,启动vnpy系统后,选择连接CTP接口,输入用户名和密码等信息后,连接CTP网关后可以在VN Studio Prompt窗口见到如下:
gateway connect event GatewayData(name='CTP', type='TD', reason=0)
gateway connect event GatewayData(name='CTP', type='MD', reason=0)
当然你也可以制造一下CTP网关的故障,如故意拔掉你的路由器的电,或者网线,你应该可以看到
gateway disconnect event GatewayData(name='CTP', type='TD', reason=?)
gateway disconnect event GatewayData(name='CTP', type='MD', reason=?)
上面使用问号,是因为我不知道你软件会提示什么错误原因。