zoukankan      html  css  js  c++  java
  • vnpy源码阅读学习(1):准备工作

    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的窗体作为当前第一个阶段的工作吧。

  • 相关阅读:
    微信二维码 场景二维码 用于推送事件,关注等 注册用户 ,经过测试
    简单的 Helper 封装 -- CookieHelper
    简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
    Java反射机制
    Windows Azure Web Site (13) Azure Web Site备份
    Windows Azure Virtual Machine (1) IaaS用户手册
    Windows Azure Web Site (1) 用户手册
    Windows Azure Web Site (12) Azure Web Site配置文件
    Windows Azure Web Site (11) 使用源代码管理器管理Azure Web Site
    Windows Azure Web Site (10) Web Site测试环境
  • 原文地址:https://www.cnblogs.com/bbird/p/12186630.html
Copyright © 2011-2022 走看看