转载自:https://zhuanlan.zhihu.com/p/32848878 作者(用Python的交易员)
今天被一位用户吐槽了:作为vn.py最核心的开箱即用交易平台,VnTrader的数据流和事件驱动机制始终没有一个特别清晰的描述文档。
交流解释一番后很快就收到了上面这张数据流的示意图,不得不再次感叹社区在vn.py项目成长中的巨大作用:换我这个小学美术不及格的作者打死也画不出这么简介明了的图表 *>﹏<*
这里也结合图表,以CTP行情Tick为例, 说明下Python部分的数据流的整体步骤(忽略C++封装部分的)。
主动订阅端
- 用户发起调用mainEngine.subscribe函数
- mainEngine.subscribe中调用ctpGateway.subscribe函数
- ctpGateway.subscribe中调用ctpMdApi.subscrbie函数
- ctpMdApi.subscribe中调用C++封装的MdApi.subscribeMarketData函数,将订阅行情的请求最终通过底层C++ CTP API发出
回调推送端
- ctaEngine对象向eventEngine中注册EVENT_TICK类型事件的处理函数句柄ctaEngine.processTickEvent
- C++ CTP API收到Tick推送,自动回调MdApi.onRtnDepthMarketData函数推送行情数据字典data
- MdApi.onRtnDepthMarketData中将data里的数据读取并转化成VtTickData对象,并调用ctpGateway.onTick函数
- ctpGateway.onTick函数将VtTickData对象包装成类型为EVENT_TICK的行情事件对象Event,并调用eventEngine.put函数,放入事件引擎的缓冲队列
- 事件引擎的工作线程,从缓冲队列中读取出最新的行情事件后,根据EVENT_TICK事件类型去查找缓存在内部字典中的处理函数列表,并将事件对象作为入参,遍历调用到列表中的处理函数ctaEngine.processTickEvent
- ctaEngine.processTickEvent中查看Tick的代码vtSymbol,并调用交易该代码合约的策略对象strategy.onTick函数,最终去运行策略中的逻辑
这样一来应该清晰了很多?最后再次感谢vn.py社区所有成员在项目发展中做出的贡献,没有你们就不会有今天的vn.py!!!
如果有问题欢迎在留言里提问。
v1.7.3将会在1月底前发布,另外这几天也已经被多次催更《vn.py项目2018年开发计划》了,预计会在春节前完成哈,加油加油~~~