Program Listing for File OrderBookView.hpp

Return to documentation for file (engine/include/OrderBookView.hpp)

#pragma once

#include "OrderBook.hpp"

class OrderBookView {
private:
    const OrderBook& book_;
    const trading::Level* level_at(bool is_bid, int k) const;
public:
    OrderBookView(const OrderBook& book) : book_{book} {}

    // --- Level Queries ---

    double get_depth_volume(bool is_bid, int k) const;

    double get_vwaa(bool is_bid, int top_n, uint64_t max_age_cap) const;

    double get_price_at_level(bool is_bid, int k) const;

    double get_vwap_depth(bool is_bid, int k) const;

    double get_vol_at_level(bool is_bid, int k) const;

    // --- Bid / Ask ---

    double get_bid_price(int level = 0) const;

    double get_ask_price(int level = 0) const;

    double get_bid_size(int level = 0) const;

    double get_ask_size(int level = 0) const;

    // --- Trade Event State ---

    trading::Action get_last_action() const;

    trading::TimeStamp get_last_ts() const;

    trading::Side get_last_trade_side() const;

    trading::Price get_last_trade_price() const;

    trading::Volume get_last_trade_size() const;

    // --- Depth ---

    int get_bid_depth() const;

    int get_ask_depth() const;

    // --- Derived Metrics ---

    double get_mid_price() const;

    double get_spread() const;

    // --- Order Queries ---
    //
    // Level pointers (trading::Level*) are value-stable for the lifetime of the
    // session: levels are heap-allocated on first use and never moved or freed.
    //
    // Order pointers (trading::Order*) are NOT value-stable across ticks.
    // The order pool is pre-allocated and never reallocated, so the address
    // itself will not become null, but cancel_order uses a swap-and-pop strategy:
    // the cancelled slot is immediately overwritten with the last active order.
    // A pointer to a cancelled order therefore silently becomes a pointer to a
    // completely different order after the next cancellation. Do NOT store Order
    // pointers across ticks; treat them as valid only for the duration of the
    // current compute() call.

    const trading::Level* get_level(bool is_bid, int level) const;

    std::vector<const trading::Order*> get_orders_at_level_snapshot(bool is_bid, int level) const;

    std::vector<const trading::Order*> get_orders_at_level_snapshot(const trading::Level* level) const;

    const trading::Order* get_order_snapshot(trading::OrderId id) const;
};