4. 最优买卖价查询
任务目标
在订单簿中维护买卖两侧的价格档位,实现 best_bid() 返回最高买价、best_ask() 返回最低卖价。价格档位为空时返回 None,并保证同一价格多次挂单只占一个档位。
实现思路
用两个字典保存价格到数量的映射:bids 存买单,asks 存卖单。查询最优价时对字典的键取 max / min。挂单时若价格已存在则累加数量,否则新建档位;数量减到 0 时删除该档位,避免空档影响最优价判断。
完整代码
class OrderBook:
def __init__(self):
self.bids = {} # 买价 -> 数量
self.asks = {} # 卖价 -> 数量
def add_order(self, side, price, qty):
book = self.bids if side == "buy" else self.asks
book[price] = book.get(price, 0) + qty
def remove_order(self, side, price, qty):
book = self.bids if side == "buy" else self.asks
if price not in book:
return
book[price] -= qty
if book[price] <= 0:
del book[price]
def best_bid(self):
return max(self.bids) if self.bids else None
def best_ask(self):
return min(self.asks) if self.asks else None
if __name__ == "__main__":
ob = OrderBook()
assert ob.best_bid() is None and ob.best_ask() is None
ob.add_order("buy", 100.0, 5)
ob.add_order("buy", 101.5, 3)
ob.add_order("buy", 100.0, 2) # 同价合并
ob.add_order("sell", 103.0, 4)
ob.add_order("sell", 102.5, 1)
assert ob.best_bid() == 101.5
assert ob.best_ask() == 102.5
ob.remove_order("buy", 101.5, 3) # 清空该档
assert ob.best_bid() == 100.0
ob.remove_order("sell", 102.5, 1)
assert ob.best_ask() == 103.0
print("best_bid =", ob.best_bid())
print("best_ask =", ob.best_ask())
运行与验证
直接执行:python order_book.py。脚本内的 assert 覆盖了空簿、同价合并、最优价更新和档位清空四种情况,全部通过后打印:
best_bid = 100.0
best_ask = 103.0
判定标准:无 AssertionError 抛出,且输出与上述一致,即说明最优买卖价查询逻辑正确。