kraken-assessment/src/engine/engine.hh
Bruno BELANYI fae4a9d5c7 kraken: engine: refactor 'cancel' ordering
Now that we have a way to reverse-lookup for cancel orders, we are not
linear in the number of active orders.
2022-03-12 12:40:23 +01:00

56 lines
1.4 KiB
C++

#pragma once
#include <functional>
#include <map>
#include <memory>
#include <vector>
#include "book/order.hh"
namespace kraken::engine {
struct CallbackOnTopOfBookChange;
struct EngineListener;
/// Matching engine which processes orders and keeps the book up-to-date.
struct Engine {
Engine(std::shared_ptr<EngineListener> listener);
/// Process orders, triggerring the listener on each event.
void process_orders(std::vector<Order> const& orders);
private:
void operator()(TradeOrder const& trade_order);
void operator()(CancelOrder const& cancel_order);
void operator()(FlushOrder const& flush_order);
std::shared_ptr<EngineListener> listener_;
// Symbol, price, side are implicit given the way the book is represented
struct OrderMetaData {
User user;
UserOrderId id;
Quantity quantity;
};
friend struct CallbackOnTopOfBookChange;
// Sorted by price, then by time
template <typename Order>
using instrument_side_data = std::multimap<Price, OrderMetaData, Order>;
std::map<Symbol, instrument_side_data<std::greater<void>>> bids_;
std::map<Symbol, instrument_side_data<std::less<void>>> asks_;
// Map cancel information to allow faster lookups
struct CancelReverseInfo {
Side side;
Symbol symbol;
Price price;
};
std::map<CancelOrder, CancelReverseInfo> cancel_reverse_info_;
};
} // namespace kraken::engine