Leka
A low-latency C++20 price-time-priority limit order book and matching engine
▶ Replay viewer
Loading...
Searching...
No Matches
order.cpp
1#include "lob/order/order.hpp"
2
3#include <stdexcept>
4
5namespace lob {
6
7/** Constructs a new order with all submitted quantity initially remaining. */
8Order::Order(OrderId orderId, Price price, Quantity originalQuantity,
9 Timestamp timestamp, OrderSide orderSide, OrderType orderType,
10 SequenceNumber sequenceNumber)
11 : Order(orderId, price, originalQuantity, originalQuantity, timestamp,
12 orderSide, orderType, sequenceNumber) {}
13
14/** Constructs an order with explicit submitted and remaining quantities. */
15Order::Order(OrderId orderId, Price price, Quantity originalQuantity,
16 Quantity remainingQuantity, Timestamp timestamp,
17 OrderSide orderSide, OrderType orderType,
18 SequenceNumber sequenceNumber)
19 : orderId(orderId), price(price), originalQuantity(originalQuantity),
20 remainingQuantity(remainingQuantity), timestamp(timestamp),
21 orderSide(orderSide), orderType(orderType), sequenceNumber(sequenceNumber) {}
22
23OrderId Order::getOrderId() const { return orderId; } // Returns the order ID
24Price Order::getPrice() const { return price; } // Returns the price of the order
25Quantity Order::getOriginalQuantity() const { return originalQuantity; } // Returns the original quantity of the order
26Quantity Order::getRemainingQuantity() const { return remainingQuantity; } // Returns the remaining quantity of the order
27Timestamp Order::getTimestamp() const { return timestamp; } // Returns the timestamp of the order
28OrderSide Order::getOrderSide() const { return orderSide; } // Returns the side of the order
29OrderType Order::getOrderType() const { return orderType; } // Returns the type of the order
30SequenceNumber Order::getSequenceNumber() const { return sequenceNumber; } // Returns the sequence number of the order
31
32Order* Order::getNextOrder() const { return nextOrder; } // Returns the next order in the list
33void Order::setNextOrder(Order* nextOrder) { this->nextOrder = nextOrder; }
34Order* Order::getPreviousOrder() const { return previousOrder; } // Returns the previous order in the list
35void Order::setPreviousOrder(Order* previousOrder) { this->previousOrder = previousOrder; }
36PriceLevel* Order::getPriceLevel() const { return priceLevel; } // Returns the price level to which the order belongs
37void Order::setPriceLevel(PriceLevel* priceLevel) { this->priceLevel = priceLevel; }
38
39/** Reduces remaining quantity and rejects underflow. */
41 if (quantity > remainingQuantity) {
42 throw std::invalid_argument("Cannot reduce order quantity below zero");
43 }
44
45 remainingQuantity = Quantity{remainingQuantity.getQuantity() - quantity.getQuantity()};
46}
47
48/** An order is fully filled when no quantity remains. */
49bool Order::isFullyFilled() const { return remainingQuantity.getQuantity() == 0; }
50
51/** Validates identity, quantities, temporal fields, side, type, and price. */
52bool Order::isValid() const {
53 const bool validSide = isBuy() || isSell();
54 const bool validType = isLimit() || isMarket();
55 const bool validPrice = isMarket() || price.isValid();
56
57 return orderId.isValid() && originalQuantity.isValid() &&
58 remainingQuantity <= originalQuantity && timestamp.isValid() &&
59 sequenceNumber.isValid() && validSide && validType && validPrice;
60}
61
63 if (!quantity.isValid()) {
64 throw std::invalid_argument("Modified quantity must be valid");
65 }
66 if (quantity > originalQuantity) {
67 throw std::invalid_argument("Modified quantity exceeds original quantity");
68 }
69 remainingQuantity = quantity;
70}
71
72bool Order::isBuy() const { return orderSide == OrderSide::BUY; }
73bool Order::isSell() const { return orderSide == OrderSide::SELL; }
74bool Order::isLimit() const { return orderType == OrderType::LIMIT; }
75bool Order::isMarket() const { return orderType == OrderType::MARKET; }
76
77} // namespace lob
Type-safe identifier for an order; zero is reserved as invalid.
Definition order_id.hpp:10
Order(OrderId orderId, Price price, Quantity originalQuantity, Timestamp timestamp, OrderSide orderSide, OrderType orderType, SequenceNumber sequenceNumber)
Constructs an order with remaining quantity equal to the original quantity.
Definition order.cpp:8
Quantity getOriginalQuantity() const
Returns the quantity submitted when the order was created.
Definition order.cpp:25
Order * getPreviousOrder() const
Returns the previous order in this price level's FIFO, or nullptr at the head.
Definition order.cpp:34
void setNextOrder(Order *nextOrder)
Sets the next order in the FIFO.
Definition order.cpp:33
SequenceNumber getSequenceNumber() const
Returns the deterministic processing sequence.
Definition order.cpp:30
Order * getNextOrder() const
Returns the next order in this price level's FIFO, or nullptr at the tail.
Definition order.cpp:32
void setPreviousOrder(Order *previousOrder)
Sets the previous order in the FIFO.
Definition order.cpp:35
OrderId getOrderId() const
Returns the unique order identifier.
Definition order.cpp:23
OrderSide getOrderSide() const
Returns whether this is a buy or sell order.
Definition order.cpp:28
Price getPrice() const
Returns the limit or reference price.
Definition order.cpp:24
OrderType getOrderType() const
Returns the order type.
Definition order.cpp:29
bool isSell() const
Returns true for a sell order.
Definition order.cpp:73
PriceLevel * getPriceLevel() const
Returns the price level this order rests on, or nullptr when unlinked.
Definition order.cpp:36
bool isValid() const
Returns whether the order state satisfies its structural invariants.
Definition order.cpp:52
Timestamp getTimestamp() const
Returns the order timestamp.
Definition order.cpp:27
void reduceRemainingQuantity(Quantity quantity)
Decreases remaining quantity; throws if the reduction would underflow.
Definition order.cpp:40
bool isFullyFilled() const
Returns true when remaining quantity is zero.
Definition order.cpp:49
Quantity getRemainingQuantity() const
Returns the quantity that has not yet executed.
Definition order.cpp:26
void setRemainingQuantity(Quantity quantity)
Updates quantity while the order remains at its current price level.
Definition order.cpp:62
bool isMarket() const
Returns true for a market order.
Definition order.cpp:75
void setPriceLevel(PriceLevel *priceLevel)
Sets the owning price level; nullptr marks the order as unlinked.
Definition order.cpp:37
bool isLimit() const
Returns true for a limit order.
Definition order.cpp:74
bool isBuy() const
Returns true for a buy order.
Definition order.cpp:72
Maintains FIFO resting orders at one price.
Type-safe nonzero price value used for price ordering.
Definition price.hpp:9
Type-safe unsigned order quantity; zero represents a filled state.
Definition quantity.hpp:8
bool isValid() const
Returns whether the quantity is valid for a submitted order.
Definition quantity.hpp:23
std::uint64_t getQuantity() const
Returns the underlying numeric quantity.
Definition quantity.hpp:20
Monotonic engine sequence used for deterministic processing order.
Nanoseconds since the Unix epoch; zero is reserved as invalid.
Definition timestamp.hpp:10