您當前的位置:首頁 > 詩詞

vnpy原始碼閱讀學習(1):準備工作

作者:由 張世玉 發表于 詩詞時間:2020-01-10

vnpy原始碼閱讀學習<第一篇>

目標

透過閱讀vnpy,學習量化交易系統的一些設計思路和理念。

透過閱讀vnpy學習python專案開發的一些技巧和正規化

透過vnpy的設計,可以用python復現一個小型簡單的量化交易系統

看看是否可以用java或者。net做一個類似的量化交易框架

準備工作

在閱讀所有的原始碼之前,我們先查詢一下前人做過的一些工作。比如關於vnpy的原始碼閱讀,評價,工作原理。避免我們走彎路。我找到了一下文件。做一下記錄,留作備用。

VNPy的github地址:

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 ,事件引擎,都集中在了主引擎上面。然後透過窗體和事件引擎發生互動進行資料處理。我們的原始碼閱讀基本可以分成兩條線路去學習:

pyqt建立和生成窗體

vnpy的引擎機制

我對pyqt5不瞭解。所以接下來,我先找個簡單點的教程,大概的瞭解下pyqt5,然後回過頭來看看vnpy的窗體的實現程式碼。暫且吧各種引擎放一放。然後用pyqt5做幾個窗體或者復現一下vnpy的窗體作為當前第一個階段的工作吧。

標簽: vnpy  APP  main  Engine  原始碼