
1) 【一句话结论】
期货撮合引擎的时间优先、价格优先算法通过分层双向链表与优先队列实现订单排序,结合读写锁/无锁优化并发,极端价格断层时通过阈值检测与批量匹配策略保障系统稳定与性能。
2) 【原理/概念讲解】
老师口吻解释:时间优先即“先到先得”,订单按到达时间排序(头节点为时间最早订单);价格优先指卖单价格低(卖方出价越低越优先)、买单价格高(买方出价越高越优先)。两者结合时,新订单先匹配价格层级,若匹配则插入对应链表尾部(时间最新),并更新优先队列;若不匹配,检查相邻价格层级,合并或重新排序。类比:排队买奶茶,先到的人先买(时间),价格低的优先(价格),比如价格5元先买,价格3元后买,但先到的人如果价格低就优先,否则按时间顺序。核心是时间优先保证公平性,价格优先保证价格有效性。
3) 【对比与适用场景】
| 策略类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 时间优先 | 仅按订单到达时间排序,价格无优先级 | 简单,但可能导致价格波动 | 小额交易、简单系统 | 可能引发价格剧烈波动,缺乏价格有效性 |
| 价格优先 | 仅按价格排序(卖单价格低优先,买单价格高优先) | 价格维度优先,时间次之 | 传统股票、外汇等 | 可能导致死循环(如价格优先导致无限匹配),需结合时间 |
| 时间+价格优先(组合) | 先时间排序,再价格排序 | 两者结合,兼顾公平与价格有效性 | 期货、大宗商品核心撮合 | 需高效数据结构(如双向链表+优先队列),保证低延迟 |
4) 【示例】
伪代码(展示订单添加与匹配逻辑):
class OrderBook:
def __init__(self):
self.price_levels = {} # price: 双向链表(头为时间最早,尾为时间最新)
self.time_queue = [] # 优先队列(按 (时间, 订单ID, 价格, 订单) 排序)
def add_order(self, order):
price = order.price
if price not in self.price_levels:
self.price_levels[price] = []
self.price_levels[price].append(order) # 插入链表尾部(时间最新)
heapq.heappush(self.time_queue, (order.time, order.order_id, price, order))
def match(self):
while self.time_queue:
_, _, price, order = heapq.heappop(self.time_queue)
if self.price_levels[price]:
matched = self.price_levels[price].pop(0) # 时间最早订单(头节点)
self.execute(order, matched) # 执行匹配逻辑
5) 【面试口播版答案】
面试官您好,期货撮合引擎的核心规则是时间优先、价格优先。时间优先就是先到订单先匹配,订单按到达时间排序;价格优先指卖单价格低、买单价格高优先匹配。实现上用双向链表(每个价格层级一个链表,头节点是时间最早订单)和优先队列(按时间排序)。优化方面,减少锁竞争可以用读写锁(读操作共享锁,写操作独占锁),提高并发可用无锁数据结构(如CAS操作维护链表节点,解决ABA问题)。极端情况比如价格断层(突然出现大量高价买单),需要设置价格缓冲区,识别断头单,当价格变化超过阈值时,批量匹配断层前后的订单,避免订单积压。总结来说,算法通过时间+价格排序保证公平与效率,优化需平衡并发与一致性,极端情况需特殊策略保障系统稳定。
6) 【追问清单】
7) 【常见坑/雷区】