交易所撮合引擎架构设计

Posted 藏锋咨询

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交易所撮合引擎架构设计相关的知识,希望对你有一定的参考价值。

数字钱包:业务流程一般是充值->提现->归集,不同的主链,实现方式不一样(上链规则与接口)。

撮合服务

1. 使用消息中间件,基于消息的,对生产(maker卖单)和(taker买单)的高效处理。撮合最重要的一个其实是定序,而且基本都是内存做撮合(内存速度快,单线程处理类似于redis的方案)。定序的话,也要根据一些业务因素(比如挂单的时间,价格匹配的程度 等等)来排序。每个taker和maker是需要有加权的,相同的价格,不同时间,成交数量这个都需要根据实际情况进行调整(意思是尽量均衡的 公平的 进行交易。不要出现某一个taker 吃掉太多 筹码。类似于做缓存的时候使用一致性hash算法,尽量平均分布到我们的缓存节点里。)

否则会出现很奇怪的插针(所谓股市里面的上影线或者下影线),要避免这个问题。每家交易所都不一样,都是根据历史数据去调整。这会涉及到很多参数,就跟调整风控策略一样,要分析很多字段。

业务分析:已有溢价的这种情况,比如我挂单3毛,别人愿意出5毛买,这种很容易出针,要处理,盘口过大的或者基差过大的可能性。这种情况,是做策略不让5毛的 成交?还是继续等等,直到单位时间内,没有出现合理价格的买单,那么就还是让他们成交?主要还是看交易所自己的业务需求,比较好的做法是延时,比如btc/usdt这种交易量很大的交易对,出现这种情况,一般让5毛的这个taker在排序中往后,让之前已经有过的taker往前移,哪怕金额是比这个小。

推荐框架:Disruptor 这个框架,用于对消息顺序性有高要求,同时保证高性能的系统比较适用。

--

交易所撮合引擎架构设计

1、基本概念与术语

在开始打造交易撮合引擎之前,让我们首先熟悉相关的基本概念与术语。

撮合/交易引擎

正如前面所述,交易撮合引擎是用来撮合交易的软件,可以先把交易撮合引擎看作一个黑盒子,它有一些输入和输出。

例如,可能的输入包括:

  • 创建新的委托单(NewOrder):一个新的委托单可以作为交易撮合引擎的输入,引擎会尝试将其与已有的 委托单进行撮合。

  • 取消已有的委托单(CancelOrder):用户也可以取消一个之前输入的委托单,如果它还没有执行的话,即开口订单。

当然你可以定义其他的输入,出于简化考虑,我们现在只定义上述两个输入。

交易撮合引擎的输出是一些事件,以便及时通知其他应用处理。例如,当引擎撮合了一笔交易后,就会触发一个TradesGenerated事件;而当取消了一个已有的委托单后,引擎就会触发rderCancelled。同样,你可以根据自己的需求来定义引擎的输出,这里我们还是简单点,只定义这两个输出事件。

交易委托账本

交易委托账本(Order Book)就是一个买方委托单或买方委托单的列表,通常按照价格和时间排序。

当一个新的买方(买方)委托单进入引擎后,引擎就会将尝试其与现有的卖方(买方)委托账本 进行匹配,看是否存在执行交易的可能。如果找到了匹配的对手单,引擎就可以执行这两个委托单了,也就是撮合成功了。

委托单

在任何交易引擎中,都可能有多种类型的委托单供用户选择。其中常见的类型包括:

  • 限价委托单

限价委托单是在当前的加密货币交易环境中最常用的委托类型。这种委托单允许用户指定一个价格,只有当撮合引擎找到同样价格甚至更好价格的对手单时才执行交易。

对于一个买方委托单而言,这意味着如果你的委托价格是¥100,那么该委托单将会在任何不高于¥100的价格成交 —— 买到指定的价格或者更便宜的价格;而对于一个卖方委托单而言,同样的委托价格意味着该委托单将在任何不低于¥100的价格成交—— 卖出指定的价格或者更高的价格。

  • 市价委托单

市价委托单的撮合会完全忽略价格因素,而致力于有限完成指定数量的成交。市价委托单在交易委托账本中有较高的优先级,在流动性充足的市场中市价单可以保证成交。

例如,当用户委托购买2个以太币时,该委托单可以在¥900、¥1000、¥2000或任何其他价位成交,这依赖于市场中当前的敞口委托单的情况。

  • 止损委托单

止损委托单尽在市场价格到达指定价位时才被激活,因此它的执行方式与市价委托单相反。一旦止损委托单激活,它们可以自动转化为市价委托单或限价委托单。

如果你希望打造一个高级的交易所,那么还有其他一些需要了解的概念,例如流动性、多/空交易、FIX/FAST协议等等,但是同样出于简化考虑,我们将这些内容留给你自己去发现。

2、系统架构

现在,对于交易撮合引擎的构成我们已经有了一些了解,那么让我们看一下整个系统的架构,以及我们将要使用的技术:


正如你上面看到的,我们的系统将包含引擎的多个客户端,这些客户端可以是交易所系统中的其他组件,例如接收终端用户委托请求的App等等。

在客户端和引擎之间的通信是使用Apache Kafka作为消息总线来实现的,每个交易对都对应Kafka的一个主题,这样我们可以确保当消息队列接收到用户委托单时,引擎将以同样的先后顺序处理委托单。这保证了即使引擎崩溃重启我们也可以重建交易委托账本。

引擎将监听Kafka主题,执行委托账本命令并将引擎的输出事件发布到消息队列中。当然如果能够监测委托单的处理速度以及交易的执行情况会更酷。我们可以使用Prometheus来采集性能指标,使用grafana来实现一个监视仪表盘。

交易撮合引擎(Matching/Trading Engine),顾名思义是用来撮合交易的软件,广泛地应用在金融、证券、加密货币交易等领域。交易引擎负责管理加密资产市场中所有的开口订单(Open Orders),并在发现匹配的订单对(Trading Pair)时自动执行交易。本文将首先介绍有关加密资产交易撮合引擎的基本概念,例如委托单、交易委托账本等,然后使用Golang实现一个原理性的撮合引擎。

以上是关于交易所撮合引擎架构设计的主要内容,如果未能解决你的问题,请参考以下文章

数字资产高并发撮合币币场外交易所系统开发

java高并发核心要点|系列7|LMAX-Disruptor实现交易所撮合引擎

数字资产交易所所系统开发系统安全架构搭建

设计金融交易系统数据库架构的设计原则?

交易系统开发技能及面试之TechCoding

交易系统开发技能及面试之TechCoding