首页 > 技术文章 > VNPY框架入门解读

LazyTiming 2021-07-26 15:39 原文

目前市面上支持程序化的交易软件很多,例如TB,金字塔,MC等等,各有各的优势,也有各自的不足,比如我自己使用比较熟悉的TB,对于多品种的策略基本无能为力(目前已经上线了更加灵活的TBQ,但是由于不支持融航系统,还没去研究)。另外的,股票,期货,期权,外盘等一系列标的若分别使用不同的交易软件也会提高出错概率和管理难度。考虑到以后实盘策略的多样化,打算将所有项目基于VNPY进行重构,方便将来进行资金以及策略的管理和交易系统的迭代。
接下来,对VNPY框架进行粗略解读。

源码目录

目录结构

VNPY的源码严格来讲由两部分组成,一部分为(A)git上pull获取的项目源码,另外一部分为(B)pip install vnpy的python包。重构自己的项目主要在A上做修改,B提供了一些底层的封装,比如CTP的C++dll封装为python可用的pyd文件,这一部分一般不用修改,知道大概功能即可。
A.

B.

文件夹

接下来对A部分中的各个文件夹进行介绍:

  • doc:每个模块的使用文档
  • vnpy:vnpy框架的主要封装,是需要仔细研读的部分,具体内容将结合下一章节进行介绍。
  • examples:利用vnpy提供的封装,构建各种项目的demo,方便研发人员了解框架的组成,各个模块的功能使用,进行二次开发。

项目架构

为了快速帮助大家了解vnpy的项目架构,我在官方自带的demo上面增加了一行,方便讲解思路。


(图中蓝色框框部分为增加的代码)

vnpy最核心的部分是两个引擎对象:main_engine和event_engine,其中main_engine负责各个功能模块的组装,event_engine负责回调事件的调度。
打个比方,vnpy是一辆车子,main_engine负责对这辆车子进行组装,为他组装发动机,变速箱,底盘等一些列配置,具体说需要哪些配置,是手动波箱还是自动波箱,是主厂品牌还是副厂品牌,都由main_engine说了算。event_engine负责设置汽车工作时各个配置的运行规则,比如一辆自动挡汽车当前档位为舒适模式,则event_engine告诉变速箱在2000转再换挡;当档位切换成运动模式,则event_engine告诉变速箱在3000转再换挡(8000转干他!)。

vnpy的主框架还是比较主流,好理解的。和Vue有点相似,把各个功能模块抽象成app,需要使用哪些功能就在主引擎中进行添加即可。回归代码,运行vnpy首先实例化一个EventEngine

EventEngine是一个事件路由,各个功能模块app将不同类型的处理函数注册到这个引擎中,然后引擎中的任务队列接收到事件时,根据事件的类型将事件数据推送给相应注册的处理函数进行回调。

然后实例化main_engine,在main_engine中通过add_gateway方法将各种交易接口加入(具体的交易接口在vnpy/api中封装),然后通过add_app将需要的功能模块组装到主程序中(vnpy/app目录中为各个功能模块,如例子中的main_engine.add_app(DataRecorderApp)就是调用了其中的数据存储模块)

add_app函数作用是根据具体注册的app类型(继承BaseApp父类),实例化app.engine_class,每个engine_class在构造函数中将各自的事件函数注册到main_engine的event_engine中。
最后将EventEngine和MainEngine实例化对象作为参数构造MainWindow,由MainWindow负责调用各个模块的ui组件进行可视化,实现交互。

模块修改

对模块的一些修改,如增加全市场指数的合成以及订阅... ...
(未完)

推荐阅读