其他
前言自从有人在微信群里开价5万求购Golang版的撮合引擎之后,我就想自己开发一款,毕竟,以我的经验来说,开发个高性能的撮合引擎并没什么难度。说干就干,于是,利用业余时间慢慢开发出了一款Golang版的高性能撮合引擎,前前后后花了大概一个月的时间。再想想自己好久没更新文章了,我的个人IP都已经生锈了,也应该发大招磨一磨了。因此决定,干脆就以连载的方式,分享下我是如何设计与实现这款价值超5万的撮合引擎的。本来,想发成掘金小册,收点稿费,毕竟这是个具有很大商业价值的软件,但问了掘金的人员,他们目前不接收这类主题。最终决定免费发布,还可以多发几个渠道,说不定还能给我多带来些关注量。好了,下面开始进入撮合引擎系列的正题。撮合引擎简介撮合引擎是所有撮合交易系统的核心组件,不管是股票交易系统——包括现货交易、期货交易、期权交易等,还是数字货币交易系统——包括币币交易、合约交易、杠杆交易等,以及各种不同的贵金属交易系统、大宗商品交易系统等,虽然各种不同交易系统的交易标的不同,但只要都是采用撮合交易模式,都离不开撮合引擎。撮合引擎是可以具有通用性的,一套具有通用性的撮合引擎实现理论上可以应用到任何撮合交易系统中,而无需做任何代码上的调整。即是说,同一套撮合引擎实现,既可以应用在股票交易系统,也可以应用在数字货币交易系统,可以用于现货交易,也可以用于合约交易等。那么,一套具有通用性的撮合引擎应该具备哪些功能呢?确定该问题的答案之前,我们先简单梳理一下一个完整的交易流程是怎样的?一般会包括以下步骤:1.系统开放某个交易标的的交易功能。2.用户提交该交易标的的买卖申报,即委托单。3.系统验证委托单是否有效,包括交易标的是否处于可交易的状态、订单的价格和数量是否符合要求等。4.确定该委托单的挂单(Maker)费率和吃单(Taker)费率。5.检查用户的资产账户情况,包括账户状态是否交易受限,是否有足够资金用于下单等。6.将详细的委托单数据持久化到数据库,并冻结用户账户中相应数量的资金。7.将委托单进行撮合处理,即在交易委托账本(OrderBook)中寻找能与该委托单匹配成交的订单,匹配的结果可能是:全部成交、部分成交或无匹配。全部成交或部分成交时,可能在交易委托账本中存在一个或多个匹配的订单,即会产生一条或多条成交记录。当无匹配或部分成交时,委托单的部分数据包括剩余未成交的数量会暂时保存到交易委托账本中,等待与后续的委托单匹配撮合。8.将撮合产生的成交记录持久化到数据库,并根据历史成交记录生成市场数据,如K线数据、今日涨跌幅等。9.更新数据库中所有成交订单的委托单数据,以及更新订单用户的资产账户余额。10.将更新的订单数据、市场数据等发送给到前台。整个交易流程中涉及到多个服务,包括用户服务、账户服务、订单服务、撮合服务、市场数据服务等。其中,只有第7步是撮合引擎处理的。从单一职责原则来说,撮合引擎就应该只做一件事,那就是负责撮合订单。撮合之前的委托单持久化、冻结资金等,以及撮合之后生成K线数据等,都不应该属于撮合引擎的职责。撮合竞价方式撮合竞价方式一般有两种,一是集合竞价,二是连续竞价。股票交易系统一般会在不同交易时间段采用不同的竞价方式,比如在开盘或收盘时采用集合竞价,从而产生开盘价或收盘价,其余时间采用连续竞价。而大多数字货币交易系统则没有集合竞价,只有连续竞价,开盘价一般是在开始交易之前就设定好的。集合竞价所谓集合竞价,是指对一段时间内接收的买卖委托单一次性集中撮合的竞价方式。以深沪的股票交易系统为例,在每个交易日的