vnpy源码阅读学习(8):关于app
关于app
在入口程序中,我们看到了把 gateway,app, 各类的engine都添加到mainEngine中来。不难猜测gateway主要是处理跟外部的行情,接口各方面的代码,通过别人的文章也不难看出Engine则是vnpy的核心,可以处理策略,回测等各方面的事情。我们吃柿子找软的捏的方式,先挑选最简单的容易理解的部分开始阅读,然后逐步想最难的部分去理解。所以先从APP部分开始阅读。
开始
main_engine.add_app(OptionMasterApp)
入口部分既然有这个代码。那么我们就从OptionMasterApp开始。
一路跟踪
#\vnpy\app\option_master\__init__.py
class OptionMasterApp(BaseApp):
#省略
#\vnpy\trader\app.py
class BaseApp(ABC):
#省略
#D:\Python\Python36\Lib\abc.py
APC是python内置的模块了,首先让我们学习下abc的用法。我找到以下教程
通过对ABC类的学习,我们大概能明白,ABC类是一个抽象类,相当于其他语言接口的概念。我们可以理解为BaseApp是一个抽象的接口。
BaseApp
class BaseApp(ABC):
"""
Absstract class for app.
"""
app_name = "" # Unique name used for creating engine and widget
app_module = "" # App module string used in import_module
app_path = "" # Absolute path of app folder
display_name = "" # Name for display on the menu.
engine_class = None # App engine class
widget_name = "" # Class name of app widget
icon_name = "" # Icon file name of app widget
从BaseApp的接口类中,我们看到定义了app_name, app_moudel, app_path, display_name, engine_class, widget_name, icon_name等属性,不难猜测,这个是一个可以动态扩展模块或者组件的基类。应该是所有继承BaseApp的子类,都可以被vnpy动态的作为app被加载进来。我们就以 OptionMasterApp 为例子。看看app部分是如何实现的。
OptionMasterApp
#\vnpy\app\option_master\__init__.py
from pathlib import Path
from vnpy.trader.app import BaseApp
from .engine import OptionEngine, APP_NAME
class OptionMasterApp(BaseApp):
app_name = APP_NAME
app_module = __module__
app_path = Path(__file__).parent
display_name = "期权交易"
engine_class = OptionEngine
widget_name = "OptionManager"
icon_name = "option.ico"
从OptionMasterApp所在的路径,我们不难发现,OptionMasterApp是一个独立的包。不难猜测到整个包实现了一个OptionMaster的app. 而 APP_NAME 和 __module__则应该是app的入口和包的名字。engine_class 加载的则是提供给app的引擎。这个包的代码总体如下:

我们先顺着APP_NAME跟踪得到base.py的代码,看到定义的一些常量
APP_NAME = "OptionMaster"
EVENT_OPTION_LOG = "eOptionLog"
EVENT_OPTION_NEW_PORTFOLIO = "eOptionNewPortfolio"
CHAIN_UNDERLYING_MAP = {
"510050_O.SSE": "510050",
"IO.CFFEX": "IF",
"HO.CFFEX": "IH"
}
应该是通过 OptionMasterApp app能够提供的代码,就可以加载进来这个APP了,我们先把跟踪OptionMasterApp的线索放一放,我们去看看,通过这些信息,APP是如何被加载进来的。然后再回头逐个了解这些APP
回到MainEngine
我们知道所有的App都通过MainEngine.add_app()的方法加载进入了MainEngine,然后通过MainEngine.get_all_apps()则可以调用所有加入的APP。然后逐个开始调用。我们只需要查找MainEngine.get_all_apps()的引用即可找到。
def init_menu(self):
# 获得所有的继承了BaseApp的配置信息
all_apps = self.main_engine.get_all_apps()
for app in all_apps:
#引入BaseApp moudle中的.ui的包
ui_module = import_module(app.app_module + ".ui")
#通过ui的包查找widget_name
widget_class = getattr(ui_module, app.widget_name)
func = partial(self.open_widget, widget_class, app.app_name)
icon_path = str(app.app_path.joinpath("ui", app.icon_name))
self.add_menu_action(
app_menu, app.display_name, icon_path, func
)
self.add_toolbar_action(
app.display_name, icon_path, func
)
def add_menu_action(
self,
menu: QtWidgets.QMenu,
action_name: str,
icon_name: str,
func: Callable,
):
""""""
icon = QtGui.QIcon(get_icon_path(__file__, icon_name))
action = QtWidgets.QAction(action_name, self)
action.triggered.connect(func)
action.setIcon(icon)
menu.addAction(action)
def add_toolbar_action(
self,
action_name: str,
icon_name: str,
func: Callable,
):
""""""
icon = QtGui.QIcon(get_icon_path(__file__, icon_name))
action = QtWidgets.QAction(action_name, self)
action.triggered.connect(func)
action.setIcon(icon)
self.toolbar.addAction(action)
def open_widget(self, widget_class: QtWidgets.QWidget, name: str):
"""
Open contract manager.
"""
widget = self.widgets.get(name, None)
if not widget:
widget = widget_class(self.main_engine, self.event_engine)
self.widgets[name] = widget
if isinstance(widget, QtWidgets.QDialog):
widget.exec_()
else:
widget.show()
关于用到python一些内置函数的教程
Python编程:importlib.import_module动态导入模块
通过上述代码,我们大概梳理了下思路。如下

vnpy源码阅读学习(8):关于app的更多相关文章
- vnpy源码阅读学习(1):准备工作
vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ...
- vnpy源码阅读学习(5):关于MainEngine的代码阅读
关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...
- vnpy源码阅读学习(9)回到OptionMaster
回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...
- vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架
自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...
- vnpy源码阅读学习(3):学习vnpy的界面的实现
学习vnpy的界面的实现 通过简单的学习了PyQt5的一些代码以后,我们基本上可以理解PyQt的一些用法,下面让我们来先研究下vnpy的UI部分的代码. 首先回到上一节看到的run.py(/vnpy/ ...
- vnpy源码阅读学习(2):学习PyQt5
PyQt5的学习 花费了一个下午把PyQt5大概的学习了下.找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的.基本上做到如果有需求要实现,查查手 ...
- vnpy源码阅读学习(7):串在一起
串在一起 我们已经分析了UI.MainEngine.EventEngine.然后他们几个是如何发挥作用的呢?我总结了一张图: 我们来具体的看看UI部分是如何跟EventEngine穿插起来的 \exa ...
- Spring源码阅读学习一
昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...
- requests源码阅读学习笔记
0:此文并不想拆requests的功能,目的仅仅只是让自己以后写的代码更pythonic.可能会涉及到一部分requests的功能模块,但全看心情. 1.另一种类的初始化方式 class Reques ...
随机推荐
- Python 零基础入门
Python 零基础入门 1.1 Python介绍 Python 是一门优雅且健壮的面向对象解释型计算机程序编程语言,具有面向对象.可升级.可扩展.可移植 语法简洁清晰易学.易读写.易维护.健壮性.通 ...
- HEXO+Git+Github+域名搭建个人博客
搭建个人博客可以分为以下五个部分 一.搭建本地环境(个人为Win10) 1.安装Git,下载地址:点击 下载后,按提示进行安装即可,作用是:把本地的内容提交到github上去 注意:官网下载速度不是很 ...
- 原创:Python爬虫实战之爬取代理ip
编程的快乐只有在运行成功的那一刻才知道QAQ 目标网站:https://www.kuaidaili.com/free/inha/ #若有侵权请联系我 因为上面的代理都是http的所以没写这个判断 代 ...
- 8——PHP循环结构&&条件结构
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- GoLand2019.03破解与汉化
1.准备工作 (请认真的做好准备工作,否则中途可能会操作失败.) GoLand是JetBrains公司发布的商业版的GO语言编辑器(收费的),本屌目前还没钱购买正版,所以本次教程是以Windows平台 ...
- sql 服务器统计信息简介
sql服务器统计是包含数据分布信息的系统对象.有时,在正则列值中.统计可以在任何支持比较操作的数据类型上创建,例如 > , < , =等. 列表2-15中,从dbo.books表中查看 I ...
- 大厂面试官问你META-INF/spring.factories要怎么实现自动扫描、自动装配?
大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配? 很多程序员想面试进互联网大厂,但是也有很多人不知道进入大厂需要具备哪些条件,以及面试官会问哪些问题, ...
- getUserMedia API及HTML5 调用手机摄像头拍照
getUserMedia API简介 HTML5的getUserMedia API为用户提供访问硬件设备媒体(摄像头.视频.音频.地理位置等)的接口,基于该接口,开发者可以在不依赖任何浏览器插件的条件 ...
- 手机浏览器自动播放视频video(设置autoplay无效)的解决方案
1.问题的提出 某一天接了个需求,需要在手机的H5页面内加入视频,我开开心心做完,准备交付的时候,问题来了,PM想要用户一进入页面,视频就开始播放,不需要用户手动点击. 2.尝试解决 加autopla ...
- 用vue开发一个公众号商城SPA——1.前期准备和写页面
使用vue开发公众号商城 第1篇记录项目准备.搭建,写页面遇到第问题以及总结,持续更新 公司最近接了个商城项目,包括PC端商城.微信公众号网页商城.后台管理系统.这几天在做微信公众号商城,又新接触了很 ...