目錄
背景介紹
區塊鏈和比特幣從只有行業極客談論的話題,目前已經變成家喻戶曉。比特幣進入中國,衍生出很多種交易模式,有幣幣交易,場外交易,法幣交易模式。
特別是幣幣交易,每天買賣數幾十億級別以上,所以如何設計高性能電子化撮合引擎來滿足當下的需求成了重要的話題。
所以撮合交易在幣幣交易系統中扮演者非常重要的角色。瞭解撮合交易的本質以及業務對於設計撮合系統至關重要。接下來,我們就詳細介紹下內存撮合引擎技術的設計思想。
什麼是虛擬貨幣撮合交易?
簡單的來講撮合交易就是:
拿身邊的房產交易舉例,張三想買房,李四、趙六想賣房,但是他們兩個不認識也見不着,所以就出現了中介王五,這時候他們各自在王五這邊告知買賣報價,在各自都能接受的報價內,相互成交。市場決定一切,張三想花錢買房,李四報價100萬賣出,而趙六覺得現在房產行情不好,願意95萬就賣給張三,那麼張三勢必會找王趙六交易了。
幣幣交易撮合成交的前提是買入價必須大於或者等於賣出價。當買入價等於賣出價時,成交價就是買入價或者賣出價。當買入價大於賣出價時,計算機在撮合時實際上是根據前一筆成交價而定出最新成交價的。
選取買入價、賣出價和前一成交價三者居中的一個價格作爲最新成交價(如果前一筆成交價低於或等於賣出價,那麼最新成交價就是賣出價;如果前一筆成交價高於或等於買入價,那麼最新成交價就是買入價;如果前一筆成交價在賣出價與買入價之間,那麼最新成交價就是前一筆的成交價)。
撮合引擎原理
撮合交易算法
如圖所示,撮合引擎的核心業務模塊就是撮合交易算法。撮合交易算法的任務一方面是完成對客戶所下訂單進行公平合理的排列和撮合功能,也要保證撮合算法的公平性、高效性以及擴展性等。由於不同金融交易系統的撮合業務各有不同,因此教程對通用的撮合交易算法進行概括性描述。
訂單隊列
撮合交易的重要組成部分就是買賣訂單,通過對買賣訂單進行撮合最後形成交易記錄。所以對無法立刻完成撮合的訂單,需要有買入隊列和賣出隊列保存訂單。隊列按照“價格優先、同價格下時間優先”的原則。買入隊列按照委託價格從低到高的順序,賣出隊列則按照委託價格從低到高的順序排列,如圖
幣幣交易: 以幣買賣幣進行交易。如使用比特幣來定價以太坊:交易對 ETH/BTC,表示購買一個ETH需要多少BTC。 買入:使用BTC購買ETH,把BTC兌換成ETH;賣出ETH,把ETH兌換成BTC。
法幣交易(OTC): 爲了解決在線支付通道關閉的備選方案。客戶A在交易所發佈賣出(買入)價格。另一個客戶B可以選擇這個這個價格買入,然後A的幣質押到交易所(中介),B可以按照A給出的銀行卡,支付寶等直接C2C的轉賬。轉成功後,後臺點擊確認,交易所把幣設置到B方賬戶。
槓桿交易: 跟交易所借錢配資,放大本金。對撮合引擎不影響。
合約交易: 對未來幣種合約到期的趨勢判斷。看漲開多單,看跌開空單。一般未來時間節點合約有當周(週五)、次周(下週五)、季(最後一個週五)等。可以進行槓桿。
限價單: 根據設定的委託單價格和數量進行交易
市價單: 設定固定額度(買入)或者數量(賣出)直接進行按照當前最優價格成交。
開盤價: 根據設定的委託單價格進行交易。
收盤價: 根據設定的委託單價格進行交易。
當前價: 最新的匯率價格或者說最新成交價。如BTC/USDT: 8500
撮合順序
撮合引擎接收到新的買入訂單,則會到賣出隊列的頭部查找是否存在符合價格規則的賣出訂單,如果存在賣出價格小於或等於買入價格的訂單,則從隊列中取出此訂單並撮合成一筆交易;如果賣出隊列爲空或隊列頭部不滿足價格關係,則將買入訂單插入買入隊列中,由於買入隊列是按照價格與時間先後進行排序,所以新插入的訂單會經過一次排序插入到買入隊列的相應位置。
相同的,當撮合引擎接收到新的賣出訂單,則會到買入隊列的頭部査找是否存在符合價格規則的買入訂單,如果存在買入價格大於或等於賣出價格的訂單,則從訂單隊列中取出此訂單並撮合成一筆交易;如果買入隊列爲空或隊列頭部不滿足價格關係,則將賣出訂單插入到賣出隊列中,由於賣出隊列也是按照價格與時間先後進行排序的所以新插入的訂單會經過一次排序插入到賣出隊列的相應位置[23]。結合買賣訂單情況,撮合算法流程如圖所示。從圖所示的撮合順序可知,買賣隊列的有序性是保證撮合順序的確定性的基礎,並且撮合過程中每筆訂單都可以撮合出當前最優交易。
內存撮合引擎設計
撮合引擎的質量
初級版架構設計
中極版撮合引擎架構設計
請留言作者
終極版撮合引擎架構設計
請留言作者
性能跑分
2核8G 20000 -> 4核8G 30000 -> 8核16G 50000 -> 16核32G 80000 -> 32核64G 88000
源碼