match-trade超高效的交易所撮合引擎

简介: match-trade超高效的交易所撮合引擎

介绍

match-trade超高效的交易所撮合引擎,采用伦敦外汇交易所LMAX开源的Disruptor框架,用Hazelcast进行分布式内存存取,以及原子性操作。使用数据流的方式进行计算撮合序列,才用价格水平独立撮合逻辑,实现高效大数据撮合。

优势

  • match-engine水平价格为独立撮合逻辑,相比于订单队列为撮合队列的交易引擎来说,价格区间越小时,性能越优越。
  • match-engine不再对撮合薄进行排序,而是用并行流计算出最优撮合价格,进行撮合。
  • match-engine每个价格下的订单都是异步完成被撮合。独立价格下订单不影响下一个新发生的撮合。
  • match-engine每个价格撮合都是独立的,与下一个价格没的关系,实现快速吃单。
  • match-engine每个新的订单经历撮合处理器后,后续逻辑采用并行计算,能更快速反馈数据撮合结果。
  • match-engine使用数据流反应式MQ消费,降低由MQ带来的数据延迟。
  • match-engine撤单走独立的逻辑,不用和下单在一个处理序列。

技术选择

  • Disruptor: 号称每秒钟承载600万订单级别的无锁并行计算框架,主要选择原因还是并行计算。
  • Hazelcast: 很好进行内存处理,很强原子性保障的操作能力。同时分布式内存实现很简单,能自动内存集群。据说火币也在用。
  • rocketmq: 消息可以做到0丢失,支持10亿级别的消息堆积,不会因堆积导致性能下降,主要是经过双11检验
  • WebFlux: 它能够充分利用多核 CPU 的硬件资源去处理大量的并发请求。

描述

用户输入包括:

  • 创建新的委托单(NewOrder):一个新的委托单可以作为交易撮合引擎的输入,引擎会尝试将其与已有的 委托单进行撮合。
  • 取消已有的委托单(CancelOrder):用户也可以取消一个之前输入的委托单,如果它还没有执行的话,即开口订单。

委托单:

  • 限价委托单
    限价委托单是在当前的加密货币交易环境中最常用的委托类型。这种委托单允许用户指定一个价格,只有当撮合引擎找到同样价格甚至更好价格的对手单时才执行交易。
  • 市价委托单
    市价委托单的撮合会完全忽略价格因素,而致力于有限完成指定数量的成交。市价委托单在交易委托账本中有较高的优先级,在流动性充足的市场中市价单可以保证成交。不充足时,撮合完最后一条撤销。
  • 止损委托单
    止损委托单尽在市场价格到达指定价位时才被激活,因此它的执行方式与市价委托单相反。一旦止损委托单激活,它们可以自动转化为市价委托单或限价委托单。(未实现)

撮合流程

限价撮合:

限价撮合.png

市价撮合:

市价撮合.png

目前就实现这两种订单撮合

代码执行流程图(感谢读者提供的图)

match-trade最高效的交易所撮合引擎

订单簿为撮合簿时代码解析

这个是一个简单流盘口计算demo

//获取匹配的订单薄数据IMap<Long, Order> outMap = hzInstance.getMap(HzltUtil.getMatchKey(coinTeam, isBuy));/** * - * -使用Java 8 Stream API中的并行流来计算最优 * -能快速的拿到撮合对象,不用排序取值,降低性能消耗 */Order outOrder = outMap.values().parallelStream().min(HzltUtil::compareOrder).get();//这种方式最难的,就是整理盘口深度数据了    /**     * -     * -获取行情深度     *      * @param coinTeam 交易队     * @param isBuy    是否是买     * @return List<Depth>     */    public List<Depth> getMarketDepth(String coinTeam, Boolean isBuy) {        List<Depth> depths = new ArrayList<Depth>();        IMap<Long, Order> map = hzInstance.getMap(HzltUtil.getMatchKey(coinTeam, isBuy));        if (map.size() > 0) {            /**             * -这个流:主要是安价格分组和统计,使用并行流快速归集。             */             List<Depth> list = map.entrySet().parallelStream().map(mo -> mo.getValue())                    .collect(Collectors.groupingBy(Order::getPrice)).entrySet().parallelStream()                    .map(ml -> new Depth(ml.getKey().toString(),                            ml.getValue().stream().map(o -> o.getUnFinishNumber()).reduce(BigDecimal.ZERO, BigDecimal::add)                                    .toString(),                            "0", 1, coinTeam, isBuy))                    .sorted((d1, d2) -> HzltUtil.compareTo(d1, d2)).collect(Collectors.toList());            /**             * -这个流:主要是盘口的累计计算,因涉及排序选择串行流             */            list.stream().reduce(new Depth("0", "0", "0", 1, coinTeam, isBuy), (one, two) -> {                one.setTotal((new BigDecimal(one.getTotal()).add(new BigDecimal(two.getNumber()))).toString());                depths.add(new Depth(two.getPrice(), two.getNumber(), one.getTotal(), two.getPlatform(),                        two.getCoinTeam(), two.getIsBuy()));                return one;            });        } else {            Depth depth = new Depth("0", "0", "0", 1, coinTeam, isBuy);            depths.add(depth);        }        return depths;    }

测试结果

在我8cpu,16G内存的开发win10系统上测试结果:

  • Disruptor单生产者初始化10万不能撮合的订单耗时:约700毫秒
  • Disruptor多生产者初始化10万不能撮合的订单耗时:约20秒
  • 实际单吃完1-100价格内随机数量的10万订单耗时:约400毫秒
相关文章
|
存储 安全 区块链
IPP智能合约底池模式开发|IPPswap合约交易质押LP系统开发(详情说明)
区块链通过分布式网络、加密算法和共识机制三大核心技术 function onlyOwnerTransferOwnership
|
11月前
|
安全 搜索推荐 区块链
|
搜索推荐 前端开发 Java
聚合CPS返利平台开发功能部署设计
聚合CPS返利平台开发功能部署设计
|
数据采集 算法 Java
week现货合约跟单系统开发(对接API火币/币安/OK/欧易交易所)详情介绍/开发运营版/案例设计/方案介绍/源码部署
量化交易系统是基于算法和模型的自动化交易系统,可以通过计算机程序快速进行市场分析、预测和交易决策。
淘宝开放平台交易API - 更新交易的销售属性
淘宝开放平台(Taobao Open Platform)是基于淘宝各类电子商务业务的开放平台,提供外部合作伙伴参与服务淘宝用户的各类原材料,如业务API、账号体系、数据推送,奇门网关等。
185 0
|
Java API PHP
淘宝开放平台API - 查询卖家已卖出的交易数据
淘宝开放平台(Taobao Open Platform)是基于淘宝各类电子商务业务的开放平台,提供外部合作伙伴参与服务淘宝用户的各类原材料,如业务API、账号体系、数据推送,奇门网关等。它是大淘宝电子商务基础服务的重要开放途径,将推动各行各业定制、创新、进化,并最终促成新商业文明生态圈的建立。我们的使命是把淘宝网的商品、用户、交易、物流等一系列电子商务基础服务,像水、电、煤一样输送给有需要的商家、开发者、社区媒体和各行各业。
172 0
|
区块链 PHP 数据安全/隐私保护
NFT交易所平台开发逻辑详情 | NFT交易所平台开发源码示例
NFT交易所平台开发逻辑详情 | NFT交易所平台开发源码示例
|
SQL Java 数据处理
Pick!闲鱼亿级商品库中的秒级实时选品
作者:闲鱼技术-剑辛 一、业务背景 在电商运营工作中,营销活动是非常重要的部分,对用户增长和GMV都有很大帮助。对电商运营来说,如何从庞大的商品库中筛选出卖家优质商品并推送给有需要的买家购买是每时每刻都要思索的问题,而且这个过程需要尽可能快和实时。
10619 0
|
算法 区块链 数据安全/隐私保护
什么是swap系统开发?Uniswap丨justswap丨pancakeswap去中心化薄饼交易所系统开发应用详情及分析
  JustSwap是一个自动的流动性协议。不需要出价,撮合交易,没有任何中心化的组织和设施来保证交易。每个交易池都是由智能合约控制的,支持兑换token,增加流动性等操作。每个资金池本质上是使用了公式x*y=k来保证交易的合理性。