现货交易撮合逻辑怎么做?一篇讲透核心流程
原创声明:本文为原创首发内容。 适合人群:后端工程师、交易系统开发者、微服务架构实践者 关键词:现货交易、撮合引擎、订单簿、价格优先、时间优先、成交回报 阅读收益:看完可独立设计一版可落地的现货撮合主流程
前言
“撮合”本质上就是一句话:
把买单和卖单,按照既定规则配对成交。
但工程实现里,真正难的是:
- 高并发下的顺序一致性
- 成交与资产变更的一致性
- 部分成交、撤单、重复请求等边界处理
这篇文章从第一性原理拆解:规则 -> 数据结构 -> 流程 -> 一致性 -> 工程落地。
1. 先定交易规则(不先定规则,代码一定乱)
现货交易最常见规则是:
解释:
- 买单想“买便宜”,优先与最低卖价撮合
- 卖单想“卖贵点”,优先与最高买价撮合
1.1 可成交条件
- 买单价格 >= 最优卖价,可成交
- 卖单价格 <= 最优买价,可成交
1.2 常见订单类型
- 限价单:指定价格上限/下限
- 市价单:按当前盘口最优价格立即成交(需风控保护)
2. 核心数据模型(最小闭环)
建议至少包含这 5 类对象:
2.1 订单关键字段
- orderId
- userId
- symbol(如 BTC/USDT)
- side(BUY/SELL)
- type(LIMIT/MARKET)
- price
- quantity
- filledQuantity
- status(NEW/PARTIAL/FILLED/CANCELED)
- createTime
2.2 订单簿结构建议
- 买盘:按价格从高到低
- 卖盘:按价格从低到高
- 每个价位下是 FIFO 队列(时间优先)
Java 常见实现:
- TreeMap<Price, Deque<Order>>(买盘可用逆序比较器)
3. 撮合主流程(下单到成交)
3.1 限价买单示例
假设用户下限价买单:买 2 BTC @ 100
当前卖盘:
- 卖1:99,数量 0.8
- 卖2:100,数量 0.7
- 卖3:101,数量 1.5
撮合过程:


