NOT-OMEGA commited on
Commit
ee1dfbc
·
verified ·
1 Parent(s): e4830ea

Update include/Orderbook.h

Browse files
Files changed (1) hide show
  1. include/Orderbook.h +20 -30
include/Orderbook.h CHANGED
@@ -15,22 +15,21 @@
15
  #include "Types.h"
16
  #include "Order.h"
17
  #include "Trade.h"
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
- /**
20
- * @brief Citadel/HFT-grade Order Book Matching Engine
21
- *
22
- * Design principles:
23
- * - Price-Time priority (FIFO within price level)
24
- * - O(1) order lookup via hash map
25
- * - O(log N) price level access via std::map (red-black tree)
26
- * - Support for: GTC, FAK, FOK, GFD, Market, IOC, PostOnly, Iceberg, StopLimit
27
- * - Thread-safe: single mutex per book (standard), or lock-free path for benchmarking
28
- * - Event callbacks for order lifecycle hooks (trading system integration)
29
- * - Level-2 market data feed generation
30
- */
31
  class Orderbook {
32
  public:
33
- // ─── Callbacks / Event Hooks ───────────────────────────────────────────────
34
  using OnTradeCallback = std::function<void(const Trade&)>;
35
  using OnOrderCallback = std::function<void(const Order&)>;
36
  using OnSnapshotCallback= std::function<void(const OrderbookSnapshot&)>;
@@ -42,12 +41,10 @@ public:
42
  Orderbook(Orderbook&&) = delete;
43
  Orderbook& operator=(Orderbook&&) = delete;
44
 
45
- // ─── Core API ─────────────────────────────────────────────────────────────
46
  Trades AddOrder (OrderPointer order);
47
  void CancelOrder(OrderId orderId);
48
  Trades ModifyOrder(OrderModify order);
49
 
50
- // ─── Query API ────────────────────────────────────────────────────────────
51
  std::size_t Size() const;
52
  bool HasOrder(OrderId) const;
53
  OrderbookSnapshot GetSnapshot() const;
@@ -56,23 +53,19 @@ public:
56
  Price MidPrice() const;
57
  Price Spread() const;
58
 
59
- // ─── Statistics ───────────────────────────────────────────────────────────
60
  uint64_t GetTotalOrders() const noexcept { return stats_.totalOrders.load(); }
61
  uint64_t GetTotalTrades() const noexcept { return stats_.totalTrades.load(); }
62
  uint64_t GetTotalCancels() const noexcept { return stats_.totalCancels.load(); }
63
  uint64_t GetTotalVolume() const noexcept { return stats_.totalVolume.load(); }
64
  uint64_t GetSequenceNumber() const noexcept { return stats_.seqNum.load(); }
65
 
66
- // ─── Event Hooks ──────────────────────────────────────────────────────────
67
  void SetOnTrade(OnTradeCallback cb) { onTrade_ = std::move(cb); }
68
  void SetOnOrderAdded(OnOrderCallback cb) { onAdded_ = std::move(cb); }
69
  void SetOnOrderCancelled(OnOrderCallback cb) { onCancelled_ = std::move(cb); }
70
 
71
- // ─── Stop-Limit Support ──────────────────────────────────────────────────
72
  void CheckAndTriggerStops(Price lastTrade);
73
 
74
  private:
75
- // ─── Internal Data Structures ────────────────────────────────────────────
76
  struct OrderEntry {
77
  OrderPointer order;
78
  OrderPointers::iterator location;
@@ -84,24 +77,21 @@ private:
84
  enum class Action { Add, Remove, Match };
85
  };
86
 
87
- // Bid side: highest price first
88
  std::map<Price, OrderPointers, std::greater<Price>> bids_;
89
- // Ask side: lowest price first
90
  std::map<Price, OrderPointers, std::less<Price>> asks_;
91
- // O(1) lookup by OrderId
92
  std::unordered_map<OrderId, OrderEntry> orders_;
93
- // Aggregated level data for fast L2 snapshot
94
  std::unordered_map<Price, LevelData> levelData_;
95
- // Stop orders pending trigger
96
- std::multimap<Price, OrderPointer> stopBuys_; // trigger >= price
97
- std::multimap<Price, OrderPointer, std::greater<Price>> stopSells_; // trigger <= price
98
 
99
- mutable std::mutex ordersMutex_;
 
 
 
100
  std::thread pruneThread_;
101
  std::condition_variable shutdownCV_;
102
  std::atomic<bool> shutdown_{false};
103
 
104
- // ─── Statistics ───────────────────────────────────────────────────────────
105
  struct Stats {
106
  std::atomic<uint64_t> totalOrders{0};
107
  std::atomic<uint64_t> totalTrades{0};
@@ -112,12 +102,10 @@ private:
112
  std::atomic<Quantity> lastTradeQty{0};
113
  } stats_;
114
 
115
- // ─── Event Callbacks ─────────────────────────────────────────────────────
116
  OnTradeCallback onTrade_;
117
  OnOrderCallback onAdded_;
118
  OnOrderCallback onCancelled_;
119
 
120
- // ─── Internal Methods ─────────────────────────────────────────────────────
121
  void PruneGoodForDayOrders();
122
  void CancelOrdersInternal(const OrderIds& ids);
123
  void CancelOrderInternal (OrderId orderId);
@@ -133,3 +121,5 @@ private:
133
  void OnOrderCancelled (OrderPointer order);
134
  void OnOrderMatched (Price price, Quantity qty, bool fullyFilled);
135
  };
 
 
 
15
  #include "Types.h"
16
  #include "Order.h"
17
  #include "Trade.h"
18
+ #include "MemoryPool.h"
19
+
20
+ // GLOBAL MEMORY POOL (25M capacity)
21
+ extern ObjectPool<Order, 25000000> g_OrderPool;
22
+
23
+ // CUSTOM SPINLOCK (To avoid OS context switch)
24
+ class SpinLock {
25
+ std::atomic_flag flag = ATOMIC_FLAG_INIT;
26
+ public:
27
+ void lock() { while(flag.test_and_set(std::memory_order_acquire)) { /* spin */ } }
28
+ void unlock() { flag.clear(std::memory_order_release); }
29
+ };
30
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  class Orderbook {
32
  public:
 
33
  using OnTradeCallback = std::function<void(const Trade&)>;
34
  using OnOrderCallback = std::function<void(const Order&)>;
35
  using OnSnapshotCallback= std::function<void(const OrderbookSnapshot&)>;
 
41
  Orderbook(Orderbook&&) = delete;
42
  Orderbook& operator=(Orderbook&&) = delete;
43
 
 
44
  Trades AddOrder (OrderPointer order);
45
  void CancelOrder(OrderId orderId);
46
  Trades ModifyOrder(OrderModify order);
47
 
 
48
  std::size_t Size() const;
49
  bool HasOrder(OrderId) const;
50
  OrderbookSnapshot GetSnapshot() const;
 
53
  Price MidPrice() const;
54
  Price Spread() const;
55
 
 
56
  uint64_t GetTotalOrders() const noexcept { return stats_.totalOrders.load(); }
57
  uint64_t GetTotalTrades() const noexcept { return stats_.totalTrades.load(); }
58
  uint64_t GetTotalCancels() const noexcept { return stats_.totalCancels.load(); }
59
  uint64_t GetTotalVolume() const noexcept { return stats_.totalVolume.load(); }
60
  uint64_t GetSequenceNumber() const noexcept { return stats_.seqNum.load(); }
61
 
 
62
  void SetOnTrade(OnTradeCallback cb) { onTrade_ = std::move(cb); }
63
  void SetOnOrderAdded(OnOrderCallback cb) { onAdded_ = std::move(cb); }
64
  void SetOnOrderCancelled(OnOrderCallback cb) { onCancelled_ = std::move(cb); }
65
 
 
66
  void CheckAndTriggerStops(Price lastTrade);
67
 
68
  private:
 
69
  struct OrderEntry {
70
  OrderPointer order;
71
  OrderPointers::iterator location;
 
77
  enum class Action { Add, Remove, Match };
78
  };
79
 
 
80
  std::map<Price, OrderPointers, std::greater<Price>> bids_;
 
81
  std::map<Price, OrderPointers, std::less<Price>> asks_;
 
82
  std::unordered_map<OrderId, OrderEntry> orders_;
 
83
  std::unordered_map<Price, LevelData> levelData_;
84
+ std::multimap<Price, OrderPointer> stopBuys_;
85
+ std::multimap<Price, OrderPointer, std::greater<Price>> stopSells_;
 
86
 
87
+ // USING SPINLOCK INSTEAD OF MUTEX
88
+ mutable SpinLock ordersMutex_;
89
+ std::mutex cvMutex_; // Only for sleep/CV
90
+
91
  std::thread pruneThread_;
92
  std::condition_variable shutdownCV_;
93
  std::atomic<bool> shutdown_{false};
94
 
 
95
  struct Stats {
96
  std::atomic<uint64_t> totalOrders{0};
97
  std::atomic<uint64_t> totalTrades{0};
 
102
  std::atomic<Quantity> lastTradeQty{0};
103
  } stats_;
104
 
 
105
  OnTradeCallback onTrade_;
106
  OnOrderCallback onAdded_;
107
  OnOrderCallback onCancelled_;
108
 
 
109
  void PruneGoodForDayOrders();
110
  void CancelOrdersInternal(const OrderIds& ids);
111
  void CancelOrderInternal (OrderId orderId);
 
121
  void OnOrderCancelled (OrderPointer order);
122
  void OnOrderMatched (Price price, Quantity qty, bool fullyFilled);
123
  };
124
+
125
+ }