
1) 【一句话结论】
证券撮合系统的价格优先(同方向价格越有利越优先)和时间优先(价格相同先提交)规则通过维护买/卖优先队列实现,核心逻辑是比较队列头部价格匹配成交,时间复杂度由优先队列操作决定(插入/取出O(log n),整体循环O(n log n))。
2) 【原理/概念讲解】
价格优先和时间优先是撮合的核心规则。价格优先指同方向订单中,卖单(卖出)价格越低越优先(低价卖单更易成交),买单(买入)价格越高越优先(高价买单更愿意出价);时间优先则是价格相同的情况下,先提交的订单优先(保证公平性)。比如排队买票,价格优先保证价格有效性,时间优先保证先来先得。
3) 【对比与适用场景】
| 规则类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 价格优先 | 同方向订单中,价格越有利(卖单价格越低,买单价格越高)的优先 | 价格是核心排序依据,保证价格有效性 | 传统证券市场(如A股、美股) | 需明确订单方向(卖/买) |
| 时间优先 | 价格相同的情况下,先提交的订单优先 | 时间顺序是次要排序,保证公平性 | 所有金融市场(如期货、外汇) | 需时间戳唯一标识 |
4) 【示例】
伪代码核心逻辑:
// 买方队列:最大堆(键为(-price, time),价格降序+时间升序)
buyQueue = MaxHeap([ (price=110, time=1), (price=105, time=2) ])
// 卖方队列:最小堆(键为(price, time),价格升序+时间升序)
sellQueue = MinHeap([ (price=108, time=3), (price=110, time=4) ])
while buyQueue not empty and sellQueue not empty:
buyTop = buyQueue.peek() // 买单头部(价格最高)
sellTop = sellQueue.peek() // 卖单头部(价格最低)
if buyTop.price >= sellTop.price:
// 成交
buyQueue.pop() // 移除买单头部
sellQueue.pop() // 移除卖单头部
else:
// 不匹配,停止
break
// 示例运行:
// 第一次比较:buyTop=110, sellTop=108 → 成交,移除两者
// 剩余buyQueue: [(105,2)], sellQueue: [(110,4)]
// 第二次比较:105 < 110 → 不匹配,循环结束
5) 【面试口播版答案】
价格优先和时间优先是证券撮合的核心规则。价格优先指同方向订单中,卖单价格越低越优先,买单价格越高越优先;时间优先是价格相同下先提交的优先。伪代码实现上,维护买方(最大堆,价格降序+时间升序)和卖方(最小堆,价格升序+时间升序)队列,循环比较头部价格,匹配则成交并移除,否则继续。时间复杂度取决于优先队列操作,插入和取出都是O(log n),整体循环O(n log n)。
6) 【追问清单】
7) 【常见坑/雷区】