vnpy源码阅读学习<第一篇>

目标

  1. 通过阅读vnpy,学习量化交易系统的一些设计思路和理念。
  2. 通过阅读vnpy学习python项目开发的一些技巧和范式
  3. 通过vnpy的设计,可以用python复现一个小型简单的量化交易系统
  4. 看看是否可以用java或者.net做一个类似的量化交易框架

准备工作

在阅读所有的源码之前,我们先查找一下前人做过的一些工作。比如关于vnpy的源码阅读,评价,工作原理。避免我们走弯路。我找到了一下文档。做一下记录,留作备用。

VNPY 架构设计文档

vn.py源码解读(一、环境配置与回测初试)

vn.py源码解读(二、实盘交易代码分析)

vn.py源码解读(三、事件驱动引擎代码分析)

vn.py源码解读(四、主引擎代码分析----初始化函数)

vn.py源码解读(五、主引擎代码分析----CTP模块)

vn.py源码解读(六、主引擎代码分析---策略模块)

vn.py源码解读(七、回测代码解析)

vn.py源码解读(八、回测结果计算代码解析)

vn.py源码解读(九、策略类代码解析)

vn.py源码解读(十、参数优化)

其中vn.py源代码解读部分有比较详尽的解释,但是缺乏一个系统的概述,另外解读不成体系。等学习到具体的模块的时候,再去结合学习吧。现在先阅读VNPY 架构设计文档 对vnpy的总体结构有一个深入的了解。

目录结构

我们先把源码的目录结构罗列出来整理下源码的目录结构,方便我们宏观上熟悉项目。


+circleci 一个yml的配置文件,搁置



+github 一些github的约定的md文件,搁置



+ci 搁置



+docs 文档文件夹,先阅读下,避免采坑



+examples



+test 放置了单元测试文件,搁置



+vnpy 这里是vnpy的重点,是所有的类库文件


经过对上述目录结构整理以后,我们把重点放在一下几个目录

+docs 文档文件夹,先阅读下,避免采坑

+examples

+vnpy 这里是vnpy的重点,是所有的类库文件

而研究的顺序就是先读读文档,了解和熟悉下vnpy,然后再通过examples中的代码,启动vnpy,跟着程序的运行,我们深入了解vnpy。

跟着入口来

通过对目录结构和文档的阅读,我们大概知道examples里面放置着多种调用vnpy或者调用vnpy某些模块的代码。而我们需要做的就是找到这些代码,跟着这些代码梳理清楚vnpy的脉络。

我们首先找到的是 /examples/vn_trader/run.py 这个文件从名字上,我们就可以从名字上猜测是启动vntrade的入口程序,找到一个线头,才能跟着梳理整条线索。

run.py中粗略一看密密麻麻一大堆代码,我们把注释代码清理以后,达到以下代码:


from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy.gateway.femas import FemasGateway
from vnpy.gateway.deribit import DeribitGateway
from vnpy.app.option_master import OptionMasterApp def main(): #创建pyqt界面
qapp = create_qapp() #事件引擎
event_engine = EventEngine() #主引擎
main_engine = MainEngine(event_engine) #增加网关引擎 从名字上看应该是飞马数据
main_engine.add_gateway(FemasGateway) main_engine.add_gateway(DeribitGateway) #这个看着像给主引擎配置选型
main_engine.add_app(OptionMasterApp) #启动主窗口,并且配置事件引擎和主引擎
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized() qapp.exec() if __name__ == "__main__":
#入口的启动
main()

上面的代码整理:

创建pyqt的界面=》创建事件引擎=》创建主引擎=》配置各种网关引擎=》配置配置项=》创建主窗体=》启动。

再看我们注释掉的代码

# flake8: noqa
from vnpy.event import EventEngine from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp # from vnpy.gateway.binance import BinanceGateway
# from vnpy.gateway.bitmex import BitmexGateway
#…………省略一部分gateway
# from vnpy.gateway.bybit import BybitGateway
# from vnpy.app.cta_strategy import CtaStrategyApp
# from vnpy.app.csv_loader import CsvLoaderApp
# from vnpy.app.algo_trading import AlgoTradingApp
# from vnpy.app.cta_backtester import CtaBacktesterApp
# from vnpy.app.data_recorder import DataRecorderApp
# from vnpy.app.risk_manager import RiskManagerApp
# from vnpy.app.script_trader import ScriptTraderApp
# from vnpy.app.rpc_service import RpcServiceApp
# from vnpy.app.spread_trading import SpreadTradingApp
# from vnpy.app.portfolio_manager import PortfolioManagerApp

main方法中

    # main_engine.add_gateway(BinanceGateway)
#……
#……
# main_engine.add_gateway(GateiosGateway)
# main_engine.add_gateway(BybitGateway)
# main_engine.add_app(CtaStrategyApp)
# main_engine.add_app(CtaBacktesterApp)
# main_engine.add_app(CsvLoaderApp)
# main_engine.add_app(AlgoTradingApp)
# main_engine.add_app(DataRecorderApp)
# main_engine.add_app(RiskManagerApp)
# main_engine.add_app(ScriptTraderApp)
# main_engine.add_app(RpcServiceApp)
# main_engine.add_app(SpreadTradingApp)
# main_engine.add_app(PortfolioManagerApp)

通过注释掉的代码,我们基本上能看出来一些端倪,vnpy的实现思路应该是创建了一个主引擎,然后把gateway, app ,事件引擎,都集中在了主引擎上面。然后通过窗体和事件引擎发生交互进行数据处理。我们的源码阅读基本可以分成两条线路去学习:

  1. pyqt创建和生成窗体
  2. vnpy的引擎机制

我对pyqt5不了解。所以接下来,我先找个简单点的教程,大概的了解下pyqt5,然后回过头来看看vnpy的窗体的实现代码。暂且吧各种引擎放一放。然后用pyqt5做几个窗体或者复现一下vnpy的窗体作为当前第一个阶段的工作吧。

vnpy源码阅读学习(1):准备工作的更多相关文章

  1. vnpy源码阅读学习(5):关于MainEngine的代码阅读

    关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...

  2. vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架

    自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...

  3. vnpy源码阅读学习(8):关于app

    关于app 在入口程序中,我们看到了把 gateway,app, 各类的engine都添加到mainEngine中来.不难猜测gateway主要是处理跟外部的行情,接口各方面的代码,通过别人的文章也不 ...

  4. vnpy源码阅读学习(3):学习vnpy的界面的实现

    学习vnpy的界面的实现 通过简单的学习了PyQt5的一些代码以后,我们基本上可以理解PyQt的一些用法,下面让我们来先研究下vnpy的UI部分的代码. 首先回到上一节看到的run.py(/vnpy/ ...

  5. vnpy源码阅读学习(9)回到OptionMaster

    回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...

  6. vnpy源码阅读学习(2):学习PyQt5

    PyQt5的学习 花费了一个下午把PyQt5大概的学习了下.找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的.基本上做到如果有需求要实现,查查手 ...

  7. vnpy源码阅读学习(7):串在一起

    串在一起 我们已经分析了UI.MainEngine.EventEngine.然后他们几个是如何发挥作用的呢?我总结了一张图: 我们来具体的看看UI部分是如何跟EventEngine穿插起来的 \exa ...

  8. Spring源码阅读学习一

    昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...

  9. requests源码阅读学习笔记

    0:此文并不想拆requests的功能,目的仅仅只是让自己以后写的代码更pythonic.可能会涉及到一部分requests的功能模块,但全看心情. 1.另一种类的初始化方式 class Reques ...

随机推荐

  1. xUtils框架的介绍(四)

    今天介绍xUtils的最后一个模块--HttpUtils,拖了那么久,终于要结束了.另外,码字不易,如果大家有什么疑问和见解,欢迎大家留言讨论.HttpUtils是解决日常工作过程中繁杂的上传下载文件 ...

  2. c++ 基本使用

    1 枚举 enum ShapeType { circle, square, rectangle }; int main() { ShapeType shape = circle; switch(sha ...

  3. Python--day45--pymysql操作数据库详细

    1.一个pymysql往数据库提交数据的简单例子: import pymysql # user = "eric" # pwd = '123123' #增加 conn = pymys ...

  4. Python--day40线程理论

    1,进程:

  5. [php] 如何处理好autoload

    在有了诸如apc之类的cache之后,php的autoloader成为了需要认真考虑的性能点. 参见: http://stackoverflow.com/questions/4788452/does- ...

  6. 应用八:Vue之在nginx下的部署实践

    最近有时间研究了下前端项目如何在nginx服务器下进行部署,折腾了两天总算有所收获,汗~~ 所以就想着写篇文章来总结一下,主要包括以下三个方面: 1.打包好的vue项目如何进行部署. 2.如何反向代理 ...

  7. 2019-4-29-C#-从-short-转-byte-方法

    title author date CreateTime categories C# 从 short 转 byte 方法 lindexi 2019-4-29 12:8:39 +0800 2019-01 ...

  8. tensorflow中models的安装

    tensorflow中models的安装参看网址: 1. Tensorflow Object Detection API Windows Install Guide http://www.insigh ...

  9. eclipse快捷键记录

    转自:http://blog.csdn.net/siphiababy/article/details/74179684 ctrl+2+L这个快捷键可自动补全代码,极大提升编码效率! 注:ctrl和2同 ...

  10. codeforces 1136E 线段树

    codeforces 1136E: 题意:给你一个长度为n的序列a和长度为n-1的序列k,序列a在任何时候都满足如下性质,a[i+1]>=ai+ki,如果更新后a[i+1]<ai+ki了, ...