vnpy中提供了DataRecorder模块,但需要手工添加,不能自动订阅全品种行情,所以需要改造一番。

DataRecorder 模块解析
DataRecorder是方便用户在UI界面中手动订阅合约信息设置的。
用户添加订阅后,调用 add_bar_recording 或者 add_tick_recording,然后保存订阅记录到本地文件,并且subscribe合约信息,通过ctp的行情信息订阅后,接受tick信息,并且保存数据。数据的保存是定时保存的,默认每10s保存一次。
在登录的时候
1. load_setting 加载配置,配置中包含了订阅的信息内容,
2. 然后把订阅的历史重新订阅。
DataRecorder 重构

每次在开盘前(上午8:50,晚上8:50)登录tdapi获取合约信息,然后全部订阅并且保存下来。
改造的方式很简单,不需要loading setting,只需要在查询所有合约信息后,调用下订阅就可以了。
while True:
sleep(10)
main_engine.write_log("等待合约加载完成")
# 等待合约全部加载完成
if ctp_gateway.td_api.contract_inited:
# 订阅所有合约
main_engine.write_log("合约加载完成")
for k, v in oms_engine.contracts.items():
data_record_engine.add_bar_recording(v.vt_symbol)
data_record_engine.add_tick_recording(v.vt_symbol)
main_engine.write_log("开始订阅合约")
break
多行情接收器
单个行情接收器有丢包的现象发生,所以需要采用多行情接收器,多个行情接收后通过对比覆盖可以保证行情接收的全面性。
而由于我们使用的tdengine,只要时间戳一致的行情,都会被自动覆盖住,这样的改动也最小。

环境搭建
在实际的生产环境中,就不能使用docker的服务器了,需要一台linux服务器来安装数据库,然后多个recorder连接这个数据库。
项目落地
一个生产级的项目,需要在预算,性能和质量作出权衡。而期货行情接收的项目需要考虑到这样的使用场景:
1. 主要是本地研发使用
2. 行情录制的实时性要求不高,不耽误研发就可以。
3. 实际策略运行过程中,历史数据从数据库中获取,交易数据从ctp中实时接收。
如果考虑到存储全部的行情数据(分钟和tick)大概至少需要500G容量,我们需要准备1T的容量。
方案1:云服务器
阿里云2核4G服务器*2 + 1T云盘 一年大约1w,如果一次性购买5年,加上折扣应该在3万以内
方案2:本地存储
1T硬盘 300元,低性能电脑2台(需要的资源不多,一个10年前的笔记本性能就完全够用)2000元,电费3年1000元够用。总共3300元。
方案3 :本地存储+ 云服务冗余
方案2虽然便宜,但是本地网络和电源不稳定性是一大问题,这种不稳定性是偶发的,所以我们需要在云服务器做一个备份,一个最便宜的服务器+40G硬盘就够了,这样每日收盘把数据拉到本地做个合并。这样的服务器每年500元就够了。
改进
vnpy的gateway默认的是把tdapi和mdapi绑定到一起,但是在行情接受过程中,tdapi仅仅是用来接受当日合约的详情的,所以每天仅需要调用一次就可以了。
并且mdapi实际上不需要鉴权,也就是说没有账号也可以接受行情,所以一个更好的架构是:

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/73759
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!