vnpy源码阅读学习(1):准备工作
vnpy源码阅读学习<第一篇>
目标
- 通过阅读vnpy,学习量化交易系统的一些设计思路和理念。
- 通过阅读vnpy学习python项目开发的一些技巧和范式
- 通过vnpy的设计,可以用python复现一个小型简单的量化交易系统
- 看看是否可以用java或者.net做一个类似的量化交易框架
准备工作
在阅读所有的源码之前,我们先查找一下前人做过的一些工作。比如关于vnpy的源码阅读,评价,工作原理。避免我们走弯路。我找到了一下文档。做一下记录,留作备用。
其中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 ,事件引擎,都集中在了主引擎上面。然后通过窗体和事件引擎发生交互进行数据处理。我们的源码阅读基本可以分成两条线路去学习:
- pyqt创建和生成窗体
- vnpy的引擎机制
我对pyqt5不了解。所以接下来,我先找个简单点的教程,大概的了解下pyqt5,然后回过头来看看vnpy的窗体的实现代码。暂且吧各种引擎放一放。然后用pyqt5做几个窗体或者复现一下vnpy的窗体作为当前第一个阶段的工作吧。
vnpy源码阅读学习(1):准备工作的更多相关文章
- vnpy源码阅读学习(5):关于MainEngine的代码阅读
关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...
- vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架
自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...
- vnpy源码阅读学习(8):关于app
关于app 在入口程序中,我们看到了把 gateway,app, 各类的engine都添加到mainEngine中来.不难猜测gateway主要是处理跟外部的行情,接口各方面的代码,通过别人的文章也不 ...
- vnpy源码阅读学习(3):学习vnpy的界面的实现
学习vnpy的界面的实现 通过简单的学习了PyQt5的一些代码以后,我们基本上可以理解PyQt的一些用法,下面让我们来先研究下vnpy的UI部分的代码. 首先回到上一节看到的run.py(/vnpy/ ...
- vnpy源码阅读学习(9)回到OptionMaster
回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...
- vnpy源码阅读学习(2):学习PyQt5
PyQt5的学习 花费了一个下午把PyQt5大概的学习了下.找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的.基本上做到如果有需求要实现,查查手 ...
- vnpy源码阅读学习(7):串在一起
串在一起 我们已经分析了UI.MainEngine.EventEngine.然后他们几个是如何发挥作用的呢?我总结了一张图: 我们来具体的看看UI部分是如何跟EventEngine穿插起来的 \exa ...
- Spring源码阅读学习一
昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...
- requests源码阅读学习笔记
0:此文并不想拆requests的功能,目的仅仅只是让自己以后写的代码更pythonic.可能会涉及到一部分requests的功能模块,但全看心情. 1.另一种类的初始化方式 class Reques ...
随机推荐
- CSS定位方式有哪些?position属性的值有哪些?他们之间的区别是什么?
在CSS中关于定位的内容是:position:relative | absolute | static | fixed • static 自动定位,自动定位就是元素在页 面普通文档流中由HTML自动定 ...
- jquery实用应用之jquery操作radio、checkbox、select
本文收集一些jquery的实用技巧,非常实用的哦,其中对radio.checkbox.select选中与取值的方法. 获取一组radio被选中项的值var item = $('input[@name= ...
- html中让多个li标签横排显示
1.我们可以通过为ul标签下所有li标签设定样式“display:inline-block”的方式,让多个li标签横排显示 2.除了以上方法,我们还可以所有li标签使用float(浮动)的方式,让多个 ...
- Python--day25--面向对象之封装
狭义上的封装的例子:(例1)Python就只有两种类型:公有和私有,没有Java中说的那种保护类型 例2: 例3:正常的方法调用私有方法 封装总结:
- phpStudy中升级MySQL版本到5.7.17的方法步骤
http://www.jb51.net/article/120263.htm 前言 今天在工作发现一个错误,在往本地导数据表的时候老是报错: ? 1 [Err] 1294 - Invalid ON U ...
- CodeForces 1204E"Natasha, Sasha and the Prefix Sums"(动态规划 or 组合数学--卡特兰数的应用)
传送门 •参考资料 [1]:CF1204E Natasha, Sasha and the Prefix Sums(动态规划+组合数) •题意 由 n 个 1 和 m 个 -1 组成的 $C_{n+m} ...
- SVN提示update更新成功,但是本地文件却没有更新
问题描述:将仓库的最新版本代码check out到本地后,然后最某个文件做了修改,保存后想通过svn的update来重新得到最新的版本,发现失效. 原因:经过多方查找原因,主要看了以下两篇文档 htt ...
- H3C 根据子网掩码计算子网数
- asp dotnet core 通过图片统计 csdn 用户访问
在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计. 通过在 asp dotnet core 创建一个图片链 ...
- C# 已知点和向量,求距离的点
已知一个点 P 和向量 v ,求在这个点P按照向量 v 运行距离 d 的点 B . 已经知道了一个点 P 和他运动方向 v ,就可以通过这个求出距离点 P 为 d 的点 B. 首先把 v 规范化,规范 ...