上一篇文章讲了MainEngine中的初始化函数,重点是DataEngine的讲解。有了对行情数据的处理,还需要有行情数据的来源。在MainEngine的初始化函数后面的一个函数就是addGateway函数。vnpy的作者还是有很大格局的,希望自己的作品可以兼容很多数据交易接口,所以就比较通用,这里就把ctp这种接口叫做Gateway,而且后面写的也比较复杂,目的就是为了集大成,还是很佩服的。这里我们就来分析一下数据交易接口这边是怎么挂到MainEngine上,以及怎么工作的。
1.addGateway
def addGateway(self, gatewayModule):
"""添加底层接口"""
gatewayName = gatewayModule.gatewayName
# 创建接口实例
self.gatewayDict[gatewayName] = gatewayModule.gatewayClass(self.eventEngine,
gatewayName)
# 设置接口轮询
if gatewayModule.gatewayQryEnabled:
self.gatewayDict[gatewayName].setQryEnabled(gatewayModule.gatewayQryEnabled)
# 保存接口详细信息
d = {
'gatewayName': gatewayModule.gatewayName,
'gatewayDisplayName': gatewayModule.gatewayDisplayName,
'gatewayType': gatewayModule.gatewayType
}
self.gatewayDetailList.append(d)
这个方法还是很简单的,不难,在一开始获得一个叫做gatewayModule的名称,然后通过这个gatewayModule来获得一个接口的实例,然后设置轮询,然后把接口数据保存到用于存储接口信息的列表上。
好,那么我们一步步来看。首先,什么是gatewayModule,然后是是这个获得的接口实例是什么?轮询是怎么设置的?
2.gatewayModule
我们来回顾一下runCtangTrading的代码。
me.addGateway(ctpGateway)
这里的ctpGateway就是这个所谓的gatewayModule。这里,ctpGateway其实是一个文件夹的名称,我们都知道,其实在python中,一个文件夹下面如果有一个__init__.py文件的话,那么这个文件夹就不是一个简单的文件夹,而是一个package,而__init__.py文件某种意义上就可以认为是这个package的一个初始化(这里说的不是特别准确,为了方便大家理解)。所以,我们找到这个文件夹,并打开__init__.py来看一下。
from __future__ import absolute_import
from vnpy.trader import vtConstant
from .ctpGateway import CtpGateway
gatewayClass = CtpGateway
gatewayName = 'CTP'
gatewayDisplayName = 'CTP'
gatewayType = vtConstant.GATEWAYTYPE_FUTURES
gatewayQryEnabled = True
到这里,我们就知道传递进去的gatewayModule是什么了,说白了就是这个package。
3.接口的实例
# 创建接口实例
self.gatewayDict[gatewayName] = gatewayModule.gatewayClass(self.eventEngine,
gatewayName)
我们发现,加下来,程