1 MainEngine的地位
MainEngine位于vnpy/trader/engine.py文件中,该文件还包含BaseEngine、LogEngine、OmsEngine、EmailEngine。MainEngine类是vntrader的主引擎,它位于整个vn.py架构的中间层,向下对接各种交易接口,往上服务于各种应用模块,它还通过于LogEngine、OmsEngine、EmailEngine的交易提供数据缓存、风险管理、订单路由等一系列的量化交易通用功能。交易接口的通过add_gateway添加,通过connect、send_order、cancel_order、query_history等系列函数提供对交易接口的访问。上层应用由add_app函数添加,add_app会创建app对象,将app的引擎添由add_engine函数创建引擎对象,并添加到engines字典中,返回引擎对象。
2 源码阅读分析
为了方便介绍,将MainEngine类中的方法分为以下五类:__init__函数、add_xxx函数、get_xxx函数、gateway交互函数、工具函数。
2.1 __init__函数
init函数就是进行一些常规的定义工作,需要注意的是事件引擎的启动放在初始化里进行,从而保证程序运行的逻辑没有问题。MainEngine的gateways、apps这种字典形式的设计,使得vn.py可以同时支持多个接口,同时运行加载多个应用,与之对应的就是UI界面打开时交易接口的选择和加载应用的选择了
main_engine = MainEngine()
2.2 add_xxx函数
2.2.1添加引擎
def add_engine(self, engine_class: Any) -> "BaseEngine":
"""
Add function engine.
这种实现机制真神奇
传入的是engine_class,就是一个类
在函数实现里创建这个类,这种设计可以使得不会出现engines字典内有同一个引擎的情况?
BaseEngine的构造函数可以看出,一个引擎在创建的过程中,会传入主引擎、事件引擎、引擎名,这可真绕
这样在BaseEngine所派生的引擎里,就可以调用主引擎提供的接口
class BaseEngine(ABC):
def __init__(
self,
main_engine: MainEngine,
event_engine: EventEngine,
engine_name: str,
):
"""
2.2.2添加网格
返回添加的网管对象
def add_gateway(self, gateway_class: Type[BaseGateway]) -> BaseGateway:
例:
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(BinanceGateway)
2.2.3添加应用
返回添加应用的引擎对象
def add_app(self, app_class: Type[BaseApp]) -> "BaseEngine":
例:
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_app(CtaStrategyApp)
2.3 get_xxx函数
def get_gateway(self, gateway_name: str) -> BaseGateway:
"""
按名称返回网关对象。
"""
def get_engine(self, engine_name: str) -> "BaseEngine":
"""
按名称返回引擎对象。
"""
def get_default_setting(self, gateway_name: str) -> Optional[Dict[str, Any]]:
"""
按名称网关的默认设置dict。
"""
def get_all_gateway_names(self) -> List[str]:
"""
获取所有添加的getewasy的名字
"""
def get_all_apps(self) -> List[BaseApp]:
"""
获取所有应为的名字
"""
def get_all_exchanges(self) -> List[Exchange]:
"""
获取所有交易所
"""
2.4 gateway交互函数
gateway交易函数主要就是一些接口连接、关闭、向交易接口订阅行情、发送订单、取消订单、查询历史等操作,函数名如其义,实现也不难理解。
def connect(self, setting: dict, gateway_name: str) -> None:
"""
连接特定网关的连接。
"""
def subscribe(self, req: SubscribeRequest, gateway_name: str) -> None:
"""
订阅特定网关的数据更新。
"""
def send_order(self, req: OrderRequest, gateway_name: str) -> str:
"""
向特定网关发送新订单请求。
"""
def cancel_order(self, req: CancelRequest, gateway_name: str) -> None:
"""
向特定网关发送取消订单请求。
"""
def send_orders(self, reqs: Sequence[OrderRequest], gateway_name: str) -> List[str]:
"""
批量向特定网关发送新订单请求。
"""
def cancel_orders(self, reqs: Sequence[CancelRequest], gateway_name: str) -> None:
"""
批量向特定网关发送取消订单请求。
"""
def query_history(self, req: HistoryRequest, gateway_name: str) -> Optional[List[BarData]]:
"""
查询条历史数据。
"""
def close(self) -> None:
"""
关闭连接
"""
2.5 工具函数
def init_engines(self) -> None:
"""
初始化引擎
"""
def write_log(self, msg: str, source: str = "") -> None:
"""
写日志
"""
|