zoukankan      html  css  js  c++  java
  • java高并发核心要点|系列7|LMAX-Disruptor实现交易所撮合引擎

    开发一个交易所是有难度的,有技术含量的。
    一个完整的证券交易系统是由用户系统、账户系统、订单系统、撮合系统以及清算系统等子系统构成的。各个子系统相互配合,完成证券报价交易。

    当一个请求进入交易系统后,首先由用户系统(User)识别用户身份,然后由账户系统(Account)对用户资产进行冻结,买入冻结USD,卖出冻结BTC,冻结如果成功,订单就进入定序系统(Sequence)。

    为什么需要设计一个定序系统?因为交易系统的所有订单是一个有序队列。不同的用户在同一时刻下单,也必须由定序系统确定先后顺序。

    经过定序的订单被送入撮合引擎(Match)。

    而撮合引擎,是交易所中的核心。

    撮合引擎本质上就是维护一个买卖盘列表,然后按价格优先原则对订单进行撮合,能够成交的就输出成交结果,不能成交的放入买卖盘。
    我们今天来讨论一下,用disruptor开发一个高性能的交易撮合引擎。
    首先,我们来简化一下,一个撮合引擎的输入输出。
    例如,可能的输入包括:

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

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

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

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

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

    限价委托单
    

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

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

    市价委托单
    

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

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

    止损止盈委托单
    

    止损止盈尽在市场价格到达指定价位时才被激活,因此它的执行方式与市价委托单相反。一旦止损止盈激活,它们可以自动转化为市价委托单或限价委托单。
    我们将按照以下的步骤来开发交易撮合引擎:

    基础类型定义
    Consumer实现
    Order Book实现
    Producer实现
    Monitoring实现
    

    我们需要首先定义一些基础类型,这包括Order、OrderBook和Trade,分别表示委托单、交易委托账本和交易:
    对象Order 属性:
    int Amount //帐户余额
    int Price //价格
    String ID
    int Side

    参考文章:

    https://cloud.tencent.com/developer/article/1470996

    https://www.liaoxuefeng.com/article/1185272483766752
    https://juejin.im/post/5dd3479a518825786e79035b
    https://keeganlee.me/post/matching/20191118/
    https://gitee.com/flying-cattle/match-trade
    https://github.com/mzheravin/exchange-core

  • 相关阅读:
    html-----vedio标签(HTML5新标签VIDEO在IOS上默认全屏播放)
    JS---控制键盘事件
    js事件监听-addEventListener (w3c标准) 和 attachEvent(ie)
    html5 -----audio标签
    花点时间搞清top、clientTop、scrollTop、offsetTop
    vue手机端横屏竖屏切换
    spring事务
    跨域
    java8 lambda 与 stream
    vueAdmin使用动态路由时踩坑
  • 原文地址:https://www.cnblogs.com/gyc567/p/12272645.html
Copyright © 2011-2022 走看看