Skip to main content

OrderBook 本地维护方案设计

·2 mins

OrderBook 本地维护方案设计 #

一、业务背景 #

OrderBook(订单簿)是反映市场深度和流动性的核心数据结构,其维护质量直接影响:

  • 策略交易决策的准确性
  • 风险控制的有效性
  • 市场定价的及时性

1.1 业务价值 #

  1. 价格发现

    • 实时反映市场供需状态
    • 提供多层次价格信息
    • 展示市场深度分布
  2. 交易决策支持

    • 最优价格确定(NBBO)
    • 流动性评估
    • 交易成本估算
  3. 风险管理

    • 市场异常监控
    • 流动性风险评估
    • 价格波动追踪

二、技术方案 #

2.1 核心数据结构 #

class LockFreeOrderBook {
private:
    // 基础信息
    std::string symbol_;
    
    // 状态管理
    std::atomic<uint64_t> last_update_time_{0};
    std::atomic<uint64_t> last_sequence_{0};
    std::atomic<bool> initialized_{false};
    
    // 价格档位存储
    using BidMap = tbb::concurrent_ordered_map<double, PriceLevel, std::greater<>>;
    using AskMap = tbb::concurrent_ordered_map<double, PriceLevel, std::less<>>;
    BidMap bids_;  // 买盘 - 降序(最高价优先)
    AskMap asks_;  // 卖盘 - 升序(最低价优先)
};

// 价格档位结构
struct PriceLevel {
    double price;
    double quantity;
    uint64_t update_time;
};

// 深度数据结构
struct DepthData {
    std::vector<PriceLevel> bids;
    std::vector<PriceLevel> asks;
    uint64_t sequence_num;
    uint64_t timestamp;
};

2.2 核心功能实现 #

  1. 快照数据处理
void LockFreeOrderBook::onSnapshot(const QuoteData::L2MarketData& data) {
    // 序列号检查
    if (initialized_ && data.sequence_num <= last_sequence_) return;

    // 重建订单簿
    bids_.clear();
    asks_.clear();

    // 批量构建价格档位
    for (const auto& event : data.events) {
        for (const auto& update : event.updates) {
            if (update.new_quantity <= 0) continue;
            
            PriceLevel level(update.price_level, 
                           update.new_quantity, 
                           data.timestamp);
            
            if (update.side == "bid") {
                bids_.emplace(update.price_level, level);
            } else {
                asks_.emplace(update.price_level, level);
            }
        }
    }

    // 更新状态
    updateState(data);
}
  1. 增量更新处理
void LockFreeOrderBook::onUpdate(const QuoteData::L2MarketData& data) {
    // 状态检查
    if (!initialized_ || data.sequence_num <= last_sequence_) return;

    // 处理价格档位更新
    for (const auto& event : data.events) {
        for (const auto& update : event.updates) {
            PriceLevel level(update.price_level, 
                           update.new_quantity, 
                           data.timestamp);
            
            auto& book = (update.side == "bid") ? bids_ : asks_;
            auto [it, inserted] = book.emplace(update.price_level, level);
            
            if (!inserted) {
                it->second = level;  // 更新现有档位
            }
        }
    }

    // 更新状态
    updateState(data);
}
  1. 深度数据查询
DepthData LockFreeOrderBook::getDepth(size_t levels) const {
    DepthData result;
    result.sequence_num = last_sequence_;
    result.timestamp = last_update_time_;
    
    // 收集有效价格档位
    for (const auto& [price, level] : bids_) {
        if (level.quantity > 0 && result.bids.size() < levels) {
            result.bids.push_back(level);
        }
    }
    
    for (const auto& [price, level] : asks_) {
        if (level.quantity > 0 && result.asks.size() < levels) {
            result.asks.push_back(level);
        }
    }
    
    return result;
}

2.3 技术特点 #

  1. 并发安全

    • 使用 TBB concurrent_map 保证数据一致性
    • 原子操作保证状态更新的安全性
    • 无锁设计减少竞争
  2. 性能优化

    • 最小化锁竞争
    • 高效的数据结构选择
    • 批量处理能力
  3. 可靠性保证

    • 序列号机制确保数据完整性
    • 异常处理机制
    • 状态一致性维护

三、应用场景 #

3.1 策略应用 #

  1. 做市策略
void MarketMakingStrategy::onOrderBookUpdate() {
    auto depth = orderbook_->getDepth(5);
    
    // 计算买卖价差
    double spread = depth.asks[0].price - depth.bids[0].price;
    
    // 评估市场状态
    if (isValidSpread(spread)) {
        updateQuotes(depth);
    }
}
  1. 套利策略
void ArbitrageStrategy::checkOpportunity() {
    auto depth1 = orderbook1_->getDepth(1);
    auto depth2 = orderbook2_->getDepth(1);
    
    double spread = calculateSpread(depth1, depth2);
    if (spread > threshold_) {
        executeArbitrage();
    }
}

3.2 风险控制 #

void RiskManager::monitorMarket() {
    auto depth = orderbook_->getDepth(10);
    
    // 检查市场质量
    checkMarketQuality(depth);
    
    // 监控价格波动
    monitorPriceMovement(depth);
    
    // 评估流动性
    assessLiquidity(depth);
}

四、性能指标 #

  1. 延迟要求

    • 更新处理延迟 < 100微秒
    • 查询响应延迟 < 50微秒
    • 批量处理能力 > 10000次/秒
  2. 资源消耗

    • 内存占用 < 1GB/交易对
    • CPU使用率 < 30%
    • 网络带宽 < 100Mbps

五、后续优化方向 #

  1. 性能优化

    • 引入内存池管理
    • 实现定期清理机制
    • 优化数据结构布局
  2. 功能扩展

    • 添加统计分析功能
    • 实现历史数据回放
    • 支持多市场整合
  3. 监控完善

    • 延迟监控
    • 内存使用监控
    • 异常事件告警

通过这套方案,我们可以高效地维护本地订单簿,为上层策略提供准确、及时的市场数据支持,同时保证系统的可靠性和可扩展性。