vnpy原始碼閱讀學習(1):準備工作
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的窗體作為當前第一個階段的工作吧。