一张图看懂VnTrader的数据流

一张图看懂VnTrader的数据流


今天被一位用户吐槽了:作为vn.py最核心的开箱即用交易平台,VnTrader的数据流和事件驱动机制始终没有一个特别清晰的描述文档。

交流解释一番后很快就收到了上面这张数据流的示意图,不得不再次感叹社区在vn.py项目成长中的巨大作用:换我这个小学美术不及格的作者打死也画不出这么简介明了的图表 *>﹏<*

这里也结合图表,以CTP行情Tick为例, 说明下Python部分的数据流的整体步骤(忽略C++封装部分的)。


主动订阅端

  1. 用户发起调用mainEngine.subscribe函数
  2. mainEngine.subscribe中调用ctpGateway.subscribe函数
  3. ctpGateway.subscribe中调用ctpMdApi.subscrbie函数
  4. ctpMdApi.subscribe中调用C++封装的MdApi.subscribeMarketData函数,将订阅行情的请求最终通过底层C++ CTP API发出


回调推送端

  1. ctaEngine对象向eventEngine中注册EVENT_TICK类型事件的处理函数句柄ctaEngine.processTickEvent
  2. C++ CTP API收到Tick推送,自动回调MdApi.onRtnDepthMarketData函数推送行情数据字典data
  3. MdApi.onRtnDepthMarketData中将data里的数据读取并转化成VtTickData对象,并调用ctpGateway.onTick函数
  4. ctpGateway.onTick函数将VtTickData对象包装成类型为EVENT_TICK的行情事件对象Event,并调用eventEngine.put函数,放入事件引擎的缓冲队列
  5. 事件引擎的工作线程,从缓冲队列中读取出最新的行情事件后,根据EVENT_TICK事件类型去查找缓存在内部字典中的处理函数列表,并将事件对象作为入参,遍历调用到列表中的处理函数ctaEngine.processTickEvent
  6. ctaEngine.processTickEvent中查看Tick的代码vtSymbol,并调用交易该代码合约的策略对象strategy.onTick函数,最终去运行策略中的逻辑


这样一来应该清晰了很多?最后再次感谢vn.py社区所有成员在项目发展中做出的贡献,没有你们就不会有今天的vn.py!!!


如果有问题欢迎在留言里提问。


v1.7.3将会在1月底前发布,另外这几天也已经被多次催更《vn.py项目2018年开发计划》了,预计会在春节前完成哈,加油加油~~~

文章被以下专栏收录
5 条评论