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毫秒
相关文章
|
6月前
|
机器学习/深度学习 安全 数据可视化
MT4丨MT5外汇跟单交易所系统开发运营版/策略指南/逻辑方案/需求功能/源码项目
提供社交交易功能,让用户可以互相关注、分享交易策略和交易结果,促进交流和学习。
|
存储 区块链 数据库
DAPP流动性质押LP合约系统开发(成熟案例)|详情规则
简单地说,区块链是一个建立在互联网上的公共的账本,互联网上每个人的计算机中,都可以有这样一个账本
26分布式电商项目 - 电商概念SPU与SKU
26分布式电商项目 - 电商概念SPU与SKU
86 0
|
存储 安全 区块链
PancakeSwap去中心化薄饼交易所项目系统开发(方案模式)|技术原理
FileStorage fs(filename,FileStorage::Mode::FORMAT_XML|FileStorage::Mode::READ);
2023最全电商API接口 高并发请求 实时数据 支持定制 电商数据 买家卖家数据
2023最全电商API接口 高并发请求 实时数据 支持定制 电商数据 买家卖家数据
|
存储 SQL 安全
MT4/MT5数字货币交易所系统开发(详情逻辑)丨MT4/MT5数字货币交易所系统开发(规则方案)/成熟技术/源码版
Accurate data analysis can reconstruct the business model of blockchain projects, and in this process, technologies such as DID and privacy computing will play an important role in privacy protection.
|
SQL Java 数据处理
Pick!闲鱼亿级商品库中的秒级实时选品
作者:闲鱼技术-剑辛 一、业务背景 在电商运营工作中,营销活动是非常重要的部分,对用户增长和GMV都有很大帮助。对电商运营来说,如何从庞大的商品库中筛选出卖家优质商品并推送给有需要的买家购买是每时每刻都要思索的问题,而且这个过程需要尽可能快和实时。
10680 0
|
算法 区块链 数据安全/隐私保护
什么是swap系统开发?Uniswap丨justswap丨pancakeswap去中心化薄饼交易所系统开发应用详情及分析
  JustSwap是一个自动的流动性协议。不需要出价,撮合交易,没有任何中心化的组织和设施来保证交易。每个交易池都是由智能合约控制的,支持兑换token,增加流动性等操作。每个资金池本质上是使用了公式x*y=k来保证交易的合理性。
alipay.trade.refund(统一收单交易退款接口) 集成流程
接口名称:统一收单交易退款接口 英文名称:alipay.trade.refund 主要用于交易资金的退款 一、文档地址 官方文档地址:[url]https://docs.open.alipay.com/api_1/alipay.trade.refund[/url] 二、开发前准备工作 调用步骤:[url]https://openclub.alipay.com/read.php?tid=12194&fid=69[/url] 注意事项:1、支持沙箱测试;2、需签约并添加功能;3、支持第三方调用。
2362 0