vnpy源碼閱讀學習(1)準備工作

目標

  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的窗體作爲當前第一個階段的工作吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章