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

  • 相关阅读:
    设计模式-组合模式
    WWDC2017-advanced_animations_with_uikit
    PS--人物皮肤处理流程(一)
    PS--人物黄金色调
    废墟调色规律
    PS--色彩调试
    PS--磨皮技巧
    PS 部分技巧快捷键
    PS--图片调色
    PS--增加照片暗部的亮度
  • 原文地址:https://www.cnblogs.com/bbird/p/12186630.html
Copyright © 2011-2022 走看看