开源分布式量化交易系统——架构设计

编程知识 更新时间:2023-04-24 02:27:32

准备工作

搭建一套量化系统并非一件容易的事,如果你是一位初出茅庐的程序猿,在下文中如遇到不懂的知识点请自行查阅相关资料,本文也会推荐一些文章和书籍,个人认为作为一名合格的程序猿,最基本的自学能力和探究精神还是需要有的,不要等待别人将答案送到你面前。
本系统采用分布式架构,涉及到的编程语言有:C++、C#、NodeJS,数据库采用MySql,通讯中间件采用ZeroMQ。选择C++的原因有二点,首先考虑到与交易所接口兼容最优化,其次考虑到算法的性能最优化,故所有的后端交易相关应用都采用C++进行编程;选用C#主要原因是为了降低策略开发者的编写难度,毕竟策略开发人员的编程水平没有那么高,并且可快速开发一些可视化回测分析程序;而NodeJS是为了方便开发Web端界面,并且提供一些REST API接口供前端应用调用。最后选用MySql也是为了方便部署,方便使用,并且它的内存数据库还是性能相当不错的,如替换其他数据也可以,如:SqlServer、Oracle、Mongodb等。由于系统采用分布式,为了降低开发难度,应用间数据通讯并非采用原生的tcp/ip协议进行编码,而采用ZeroMQ进行编程,通过几种常用模式,如:REQ/REP、PULL/PUSH、PUB/SUB等,就能轻松进行数据通讯。最后本项目开发工具采用VS2015和VSCode,读者可自行下载。以下所有的项目工程都将基于这两款IDE进行建立。
以上仅仅是编程方面的准备工作,但如果想做好一套量化系统,你必须对业务知识有深刻的了解,不然后面的一些细节你可能无法把控,甚至会引发一些意想不到的灾难。不积跬步,无以至千里;不积小流,无以成江海。让我们一步一个脚印,先把基础打扎实,再正式开始我们的量化系统搭建之行。在此推荐《c++ primer plus》、《C#高级编程》、《代码之美》,交易相关的大家可以参加协会组织的从业人员资格考试,这样能系统的学习基础知识、法律知识等。相信充分做好这些准备后,下文的量化系统搭建会非常轻松、非常有趣。

架构设计

系统架构

本量化系统分为前端和后端,前端主要面向用户,用于策略编写、手工下单、监控、报告分析等;后端将交易和行情进行封装,以及指令路由工作,并提供最简单的接口供前端使用。

以下是行情中心内部架构,考虑到后期接入多家交易所行情,所以将行情接收器独立出来,这样能更好的做到负载均衡,并各自将行情写入内存数据库,供其他应用调用;而行情中心将收集各接收器推送来的行情,封装成统一格式再发布给订阅者。

以下是交易中心与算法工人内部架构,交易中心主要负责接收客户端发送过来的指令,通过风控层后将指令路由至算法工人,由算法工人处理订单逻辑,如:条件单、追单、止损止盈单等,并最终将订单报入交易所场内,同时将回报返回给交易中心,再由交易中心将回报返回给订阅用户。
交易中心还负责路由用户发送的策略指令,并根据指令分发给策略回测工人或者策略仿真工人,对应的去执行回测指令或者启动策略等。

整个量化系统的总架构由以上三个流程图作为核心,后面我们会针对每一个模块进行剖析,最终一步步的去实现出整套量化系统。

数据库结构

  1. 用户表Users
字段名类型描述
UserIdString用户编号
UserNameString用户名
UserPwdString密码
  1. 日志表Logs
字段名类型描述
IdString编号
CategoryString类别
MessageString消息
CreateTimeDateTime创建时间
  1. 合约表Contracts
字段名类型描述
CodeString编码
ExCodeString交易所编码
NameString合约名
CategoryString类别
ExchangeString交易所
StatusBool状态
  1. 账户表Accounts
字段名类型描述
UserIdString用户编号
StaticRightDouble静态权益
FeeDouble手续费
UsedMarginDouble占用保证金
FrozenMarginDouble冻结保证金
FrozenFeeDouble冻结手续费
  1. 持仓表Positions
字段名类型描述
IdString编号
UserIdString用户编号
StrategyIdString策略编号
ContractString合约
LongVolumeInt多头数量
LongPriceDouble多头均价
ShortVolumeInt空头数量
ShortPriceDouble空头均价
  1. 订单表Orders
字段名类型描述
OrderIdString订单编号
UserIdString用户编号
StrategyIdString策略编号
OrderTypeString订单类型
ContractString合约
SideString买卖
InsertPriceDouble报单价格
InsertVolumeInt报单数量
InsertTimeDateTime报单时间
TradedPriceDouble成交价格
TradedVolumeInt成交数量
TradedTimeDateTime成交时间
RealAccountString真实账号
  1. 成交表Trades
字段名类型描述
TradeIdString成交编号
OrderIdString订单编号
UserIdString用户编号
StrategyIdString策略编号
ContractString合约
SideString买卖
TradedPriceDouble成交价格
TradedVolumeInt成交数量
TradedTimeDateTime成交时间
FeeDouble手续费
RealAccountString真实账号
  1. 结算表Settles
字段名类型描述
IdString编号
UserIdString用户编号
StrategyIdString策略编号
ContractString合约
SettlePriceDouble结算价格
LeftVolumeInt剩余数量
ProfitDouble盈亏
FeeDouble手续费
CreateTimeDateTime创建时间
  1. 报告表Reports
字段名类型描述
IdString编号
UserIdString用户编号
StrategyIdString策略编号
InitRightDouble初始权益
TotalProfitDouble总盈亏
TotalFeeDouble总手续费
MaxRightDouble最大权益
MaxUsedMarginDouble最大占保
MaxBackDouble最大回撤
TradedDaysInt交易天数
LongWinMoneyDouble多头盈利
LongWinCountInt多头盈利次数
ShortWinMoneyDouble空头盈利
ShortWinCountInt空头盈利次数
LongLossMoneyDouble多头亏损
LongLossCountInt多头亏损次数
ShortLossMoneyDouble空头亏损
ShortLossCountInt空头亏损次数
  1. 策略表Strategies
字段名类型描述
StrategyIdString策略编号
UserIdString用户编号
NameString策略名称
CategoryString类别
CodeString策略代码
StrategyParamsString策略参数
StrategySettingsString策略配置
StrategyWrokerString策略工人
RealAccountString真实账号
IsAutoBool自动运行
CreateTimeDateTime创建时间
  1. 每日资金表DailyMoneys
字段名类型描述
IdString编号
UserIdString用户编号
StrategyIdString策略编号
RightDouble当日权益
ProfitDouble当日盈亏
FeeDouble当日手续费
CreateTimeDateTime创建时间

本量化系统的历史行情数据采用调用第三方接口的方式,因为数据整理也是一项很庞大的工作,一时半会完善不好整个行情数据库。在此毛遂自荐一下我们自己的 EPI金融数据接口,该行情库的数据已经过多次清洗和检验了,准确率能达到95%以上。
以上是整个量化系统的架构设计,后面将详细介绍每个模块的内部设计并进行编码,所有的源码将会发布至Github上,并将本项目命名为Quant。

更多推荐

开源分布式量化交易系统——架构设计

本文发布于:2023-04-18 06:43:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/28eabd2ac033f9556481e1961d078ac0.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:分布式   开源   架构   交易系统

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 85331文章数
  • 14895阅读数
  • 0评论数