java高并发核心要点|系列7|LMAX-Disruptor实现交易所撮合引擎
開發(fā)一個(gè)交易所是有難度的,有技術(shù)含量的。
一個(gè)完整的證券交易系統(tǒng)是由用戶系統(tǒng)、賬戶系統(tǒng)、訂單系統(tǒng)、撮合系統(tǒng)以及清算系統(tǒng)等子系統(tǒng)構(gòu)成的。各個(gè)子系統(tǒng)相互配合,完成證券報(bào)價(jià)交易。
當(dāng)一個(gè)請(qǐng)求進(jìn)入交易系統(tǒng)后,首先由用戶系統(tǒng)(User)識(shí)別用戶身份,然后由賬戶系統(tǒng)(Account)對(duì)用戶資產(chǎn)進(jìn)行凍結(jié),買入凍結(jié)USD,賣出凍結(jié)BTC,凍結(jié)如果成功,訂單就進(jìn)入定序系統(tǒng)(Sequence)。
為什么需要設(shè)計(jì)一個(gè)定序系統(tǒng)?因?yàn)榻灰紫到y(tǒng)的所有訂單是一個(gè)有序隊(duì)列。不同的用戶在同一時(shí)刻下單,也必須由定序系統(tǒng)確定先后順序。
經(jīng)過定序的訂單被送入撮合引擎(Match)。
而撮合引擎,是交易所中的核心。
撮合引擎本質(zhì)上就是維護(hù)一個(gè)買賣盤列表,然后按價(jià)格優(yōu)先原則對(duì)訂單進(jìn)行撮合,能夠成交的就輸出成交結(jié)果,不能成交的放入買賣盤。
我們今天來討論一下,用disruptor開發(fā)一個(gè)高性能的交易撮合引擎。
首先,我們來簡化一下,一個(gè)撮合引擎的輸入輸出。
例如,可能的輸入包括:
創(chuàng)建新的委托單(NewOrder):一個(gè)新的委托單可以作為交易撮合引擎的輸入,引擎會(huì)嘗試將其與已有的 委托單進(jìn)行撮合。
取消已有的委托單(CancelOrder):用戶也可以取消一個(gè)之前輸入的委托單,如果它還沒有執(zhí)行的話,即開口訂單。
當(dāng)然你可以定義其他的輸入,出于簡化考慮,我們現(xiàn)在只定義上述兩個(gè)輸入。
交易撮合引擎的輸出是一些事件,以便及時(shí)通知其他應(yīng)用處理。例如,當(dāng) 引擎撮合了一筆交易后,就會(huì)觸發(fā)一個(gè)TradesGenerated事件;而當(dāng)取消了 一個(gè)已有的委托單后,引擎就會(huì)觸發(fā)OrderCancelled。同樣,你可以根據(jù)自己 的需求來定義引擎的輸出,這里我們還是簡單點(diǎn),只定義這兩個(gè)輸出事件。
交易委托賬本
交易委托賬本(Order Book)就是一個(gè)買方委托單或買方委托單的列表,通常按照價(jià)格和時(shí)間排序。
當(dāng)一個(gè)新的買方(買方)委托單進(jìn)入引擎后,引擎就會(huì)將嘗試其與現(xiàn)有的賣方(買方)委托賬本 進(jìn)行匹配,看是否存在執(zhí)行交易的可能。如果找到了匹配的對(duì)手單,引擎就可以執(zhí)行這兩個(gè)委托單了,也就是撮合成功了。
委托單
在任何交易引擎中,都可能有多種類型的委托單供用戶選擇。其中常見的類型包括:
限價(jià)委托單
限價(jià)委托單是在當(dāng)前的加密貨幣交易環(huán)境中最常用的委托類型。這種委托單允許用戶指定一個(gè)價(jià)格,只有當(dāng)撮合引擎找到同樣價(jià)格甚至更好價(jià)格的對(duì)手單時(shí)才執(zhí)行交易。
對(duì)于一個(gè)買方委托單而言,這意味著如果你的委托價(jià)格是¥100,那么該委托單將會(huì)在任何不高于¥100的價(jià)格成交 —— 買到指定的價(jià)格或者更便宜的價(jià)格;而對(duì)于一個(gè)賣方委托單而言,同樣的委托價(jià)格意味著該委托單將在任何不低于¥100的價(jià)格成交—— 賣出指定的價(jià)格或者更高的價(jià)格。
市價(jià)委托單
市價(jià)委托單的撮合會(huì)完全忽略價(jià)格因素,而致力于有限完成指定數(shù)量的成交。市價(jià)委托單在交易委托賬本中有較高的優(yōu)先級(jí),在流動(dòng)性充足的市場中市價(jià)單可以保證成交。
例如,當(dāng)用戶委托購買2個(gè)以太幣時(shí),該委托單可以在¥900、¥1000、¥2000或任何其他價(jià)位成交,這依賴于市場中當(dāng)前的敞口委托單的情況。
止損止盈委托單
止損止盈盡在市場價(jià)格到達(dá)指定價(jià)位時(shí)才被激活,因此它的執(zhí)行方式與市價(jià)委托單相反。一旦止損止盈激活,它們可以自動(dòng)轉(zhuǎn)化為市價(jià)委托單或限價(jià)委托單。
我們將按照以下的步驟來開發(fā)交易撮合引擎:
基礎(chǔ)類型定義
Consumer實(shí)現(xiàn)
Order Book實(shí)現(xiàn)
Producer實(shí)現(xiàn)
Monitoring實(shí)現(xiàn)
我們需要首先定義一些基礎(chǔ)類型,這包括Order、OrderBook和Trade,分別表示委托單、交易委托賬本和交易:
對(duì)象Order 屬性:
int Amount //帳戶余額
int Price //價(jià)格
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
總結(jié)
以上是生活随笔為你收集整理的java高并发核心要点|系列7|LMAX-Disruptor实现交易所撮合引擎的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10组高效e人正版注册码
- 下一篇: 微信能从图片获取位置信息,原理其实很简单