NOT-OMEGA commited on
Commit
c997ee9
·
verified ·
1 Parent(s): 8c16bec

Update include/Orderbook.h

Browse files
Files changed (1) hide show
  1. include/Orderbook.h +41 -38
include/Orderbook.h CHANGED
@@ -18,9 +18,9 @@
18
 
19
  class Orderbook {
20
  public:
21
- using OnTradeCallback = std::function<void(const Trade&)>;
22
- using OnOrderCallback = std::function<void(const Order&)>;
23
- using OnSnapshotCallback= std::function<void(const OrderbookSnapshot&)>;
24
 
25
  Orderbook();
26
  ~Orderbook();
@@ -35,26 +35,28 @@ public:
35
  Trades ModifyOrder(OrderModify order);
36
 
37
  // ─── Query API ────────────────────────────────────────────────────────────
38
- std::size_t Size() const;
39
- bool HasOrder(OrderId) const;
40
- OrderbookSnapshot GetSnapshot() const;
41
- Price BestBid() const;
42
- Price BestAsk() const;
43
- Price MidPrice() const;
44
- Price Spread() const;
45
 
46
  // ─── Statistics ───────────────────────────────────────────────────────────
47
- uint64_t GetTotalOrders() const noexcept { return stats_.totalOrders.load(); }
48
- uint64_t GetTotalTrades() const noexcept { return stats_.totalTrades.load(); }
49
- uint64_t GetTotalCancels() const noexcept { return stats_.totalCancels.load(); }
50
- uint64_t GetTotalVolume() const noexcept { return stats_.totalVolume.load(); }
51
- uint64_t GetSequenceNumber() const noexcept { return stats_.seqNum.load(); }
52
 
53
  // ─── Event Hooks ──────────────────────────────────────────────────────────
54
  void SetOnTrade(OnTradeCallback cb) { onTrade_ = std::move(cb); }
55
  void SetOnOrderAdded(OnOrderCallback cb) { onAdded_ = std::move(cb); }
56
  void SetOnOrderCancelled(OnOrderCallback cb) { onCancelled_ = std::move(cb); }
57
 
 
 
58
  void CheckAndTriggerStops(Price lastTrade);
59
 
60
  private:
@@ -76,10 +78,15 @@ private:
76
  std::multimap<Price, OrderPointer> stopBuys_;
77
  std::multimap<Price, OrderPointer, std::greater<Price>> stopSells_;
78
 
79
- mutable std::mutex ordersMutex_;
80
- std::thread pruneThread_;
81
- std::condition_variable shutdownCV_;
82
- std::atomic<bool> shutdown_{false};
 
 
 
 
 
83
 
84
  struct Stats {
85
  std::atomic<uint64_t> totalOrders{0};
@@ -91,27 +98,23 @@ private:
91
  std::atomic<Quantity> lastTradeQty{0};
92
  } stats_;
93
 
94
- OnTradeCallback onTrade_;
95
- OnOrderCallback onAdded_;
96
- OnOrderCallback onCancelled_;
97
-
98
- void PruneGoodForDayOrders();
99
- void CancelOrdersInternal(const OrderIds& ids);
100
- void CancelOrderInternal (OrderId orderId);
101
 
102
- // BUG FIX: Internal add/match that assumes mutex is already held.
103
- // Required to fix the deadlock in CheckAndTriggerStops and the race
104
- // condition in ModifyOrder.
105
- Trades AddOrderInternal(OrderPointer order);
106
 
107
- bool CanMatch (Side side, Price price) const;
108
- bool CanFullyFill (Side side, Price price, Quantity qty) const;
109
 
110
- Trades MatchOrders ();
111
- Trade MakeTrade (OrderPointer bid, OrderPointer ask, Quantity qty);
112
 
113
- void UpdateLevelData(Price price, Quantity qty, LevelData::Action action);
114
- void OnOrderAdded (OrderPointer order);
115
- void OnOrderCancelled (OrderPointer order);
116
- void OnOrderMatched (Price price, Quantity qty, bool fullyFilled);
117
  };
 
18
 
19
  class Orderbook {
20
  public:
21
+ using OnTradeCallback = std::function<void(const Trade&)>;
22
+ using OnOrderCallback = std::function<void(const Order&)>;
23
+ using OnSnapshotCallback = std::function<void(const OrderbookSnapshot&)>;
24
 
25
  Orderbook();
26
  ~Orderbook();
 
35
  Trades ModifyOrder(OrderModify order);
36
 
37
  // ─── Query API ────────────────────────────────────────────────────────────
38
+ std::size_t Size() const;
39
+ bool HasOrder(OrderId) const;
40
+ OrderbookSnapshot GetSnapshot() const;
41
+ Price BestBid() const;
42
+ Price BestAsk() const;
43
+ Price MidPrice() const;
44
+ Price Spread() const;
45
 
46
  // ─── Statistics ───────────────────────────────────────────────────────────
47
+ uint64_t GetTotalOrders() const noexcept { return stats_.totalOrders.load(); }
48
+ uint64_t GetTotalTrades() const noexcept { return stats_.totalTrades.load(); }
49
+ uint64_t GetTotalCancels() const noexcept { return stats_.totalCancels.load(); }
50
+ uint64_t GetTotalVolume() const noexcept { return stats_.totalVolume.load(); }
51
+ uint64_t GetSequenceNumber() const noexcept { return stats_.seqNum.load(); }
52
 
53
  // ─── Event Hooks ──────────────────────────────────────────────────────────
54
  void SetOnTrade(OnTradeCallback cb) { onTrade_ = std::move(cb); }
55
  void SetOnOrderAdded(OnOrderCallback cb) { onAdded_ = std::move(cb); }
56
  void SetOnOrderCancelled(OnOrderCallback cb) { onCancelled_ = std::move(cb); }
57
 
58
+ // BUG FIX #3: No longer public — called internally only, no longer calls
59
+ // AddOrderInternal directly to avoid recursive MatchOrders → stack overflow.
60
  void CheckAndTriggerStops(Price lastTrade);
61
 
62
  private:
 
78
  std::multimap<Price, OrderPointer> stopBuys_;
79
  std::multimap<Price, OrderPointer, std::greater<Price>> stopSells_;
80
 
81
+ // BUG FIX #3: Deferred stop injection buffer — stops collected here during
82
+ // MatchOrders and injected AFTER matching loop exits, preventing recursive
83
+ // MatchOrders calls that could cause stack overflow on stop chains.
84
+ std::vector<OrderPointer> pendingStops_;
85
+
86
+ mutable std::mutex ordersMutex_;
87
+ std::thread pruneThread_;
88
+ std::condition_variable shutdownCV_;
89
+ std::atomic<bool> shutdown_{false};
90
 
91
  struct Stats {
92
  std::atomic<uint64_t> totalOrders{0};
 
98
  std::atomic<Quantity> lastTradeQty{0};
99
  } stats_;
100
 
101
+ OnTradeCallback onTrade_;
102
+ OnOrderCallback onAdded_;
103
+ OnOrderCallback onCancelled_;
 
 
 
 
104
 
105
+ void PruneGoodForDayOrders();
106
+ void CancelOrdersInternal(const OrderIds& ids);
107
+ void CancelOrderInternal (OrderId orderId);
108
+ Trades AddOrderInternal (OrderPointer order);
109
 
110
+ bool CanMatch (Side side, Price price) const;
111
+ bool CanFullyFill (Side side, Price price, Quantity qty) const;
112
 
113
+ Trades MatchOrders ();
114
+ Trade MakeTrade (OrderPointer bid, OrderPointer ask, Quantity qty);
115
 
116
+ void UpdateLevelData (Price price, Quantity qty, LevelData::Action action);
117
+ void OnOrderAdded (OrderPointer order);
118
+ void OnOrderCancelled (OrderPointer order);
119
+ void OnOrderMatched (Price price, Quantity qty, bool fullyFilled);
120
  };