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

网关接口的状态感知

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=?)

上面使用问号,是因为我不知道你软件会提示什么错误原因。

Member
avatar
加入于:
帖子: 42
声望: 3

看了楼主几个帖子,感觉为vnpy做了很多非常有价值的缺憾补全,同时也难以想象,一个发展多年的框架居然连这些最基础的东西都还需要用户来做补充。想当年写个简单的通信库,这些都是首要考虑的功能。

Member
avatar
加入于:
帖子: 6
声望: 0

很好的想法,更简单的方法是在EVENT_LOG的处理函数里面同时把信息也打印出来,这样同时在log file和 窗口都有输出。

Member
avatar
加入于:
帖子: 57
声望: 6

远山 wrote:

看了楼主几个帖子,感觉为vnpy做了很多非常有价值的缺憾补全,同时也难以想象,一个发展多年的框架居然连这些最基础的东西都还需要用户来做补充。想当年写个简单的通信库,这些都是首要考虑的功能。

很多时候跟你有相同的感触。

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

沪公网安备 31011502017034号