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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM