Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use static dispatch for onMessage() methods in ITCHHandler class. #10

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 24 additions & 24 deletions examples/itch_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,31 +14,31 @@

using namespace CppTrader::ITCH;

class MyITCHHandler : public ITCHHandler
class MyITCHHandler : public ITCHHandler<MyITCHHandler>
{
protected:
bool onMessage(const SystemEventMessage& message) override { return OutputMessage(message); }
bool onMessage(const StockDirectoryMessage& message) override { return OutputMessage(message); }
bool onMessage(const StockTradingActionMessage& message) override { return OutputMessage(message); }
bool onMessage(const RegSHOMessage& message) override { return OutputMessage(message); }
bool onMessage(const MarketParticipantPositionMessage& message) override { return OutputMessage(message); }
bool onMessage(const MWCBDeclineMessage& message) override { return OutputMessage(message); }
bool onMessage(const MWCBStatusMessage& message) override { return OutputMessage(message); }
bool onMessage(const IPOQuotingMessage& message) override { return OutputMessage(message); }
bool onMessage(const AddOrderMessage& message) override { return OutputMessage(message); }
bool onMessage(const AddOrderMPIDMessage& message) override { return OutputMessage(message); }
bool onMessage(const OrderExecutedMessage& message) override { return OutputMessage(message); }
bool onMessage(const OrderExecutedWithPriceMessage& message) override { return OutputMessage(message); }
bool onMessage(const OrderCancelMessage& message) override { return OutputMessage(message); }
bool onMessage(const OrderDeleteMessage& message) override { return OutputMessage(message); }
bool onMessage(const OrderReplaceMessage& message) override { return OutputMessage(message); }
bool onMessage(const TradeMessage& message) override { return OutputMessage(message); }
bool onMessage(const CrossTradeMessage& message) override { return OutputMessage(message); }
bool onMessage(const BrokenTradeMessage& message) override { return OutputMessage(message); }
bool onMessage(const NOIIMessage& message) override { return OutputMessage(message); }
bool onMessage(const RPIIMessage& message) override { return OutputMessage(message); }
bool onMessage(const LULDAuctionCollarMessage& message) override { return OutputMessage(message); }
bool onMessage(const UnknownMessage& message) override { return OutputMessage(message); }
public:
bool onMessage(const SystemEventMessage& message) { return OutputMessage(message); }
bool onMessage(const StockDirectoryMessage& message) { return OutputMessage(message); }
bool onMessage(const StockTradingActionMessage& message) { return OutputMessage(message); }
bool onMessage(const RegSHOMessage& message) { return OutputMessage(message); }
bool onMessage(const MarketParticipantPositionMessage& message) { return OutputMessage(message); }
bool onMessage(const MWCBDeclineMessage& message) { return OutputMessage(message); }
bool onMessage(const MWCBStatusMessage& message) { return OutputMessage(message); }
bool onMessage(const IPOQuotingMessage& message) { return OutputMessage(message); }
bool onMessage(const AddOrderMessage& message) { return OutputMessage(message); }
bool onMessage(const AddOrderMPIDMessage& message) { return OutputMessage(message); }
bool onMessage(const OrderExecutedMessage& message) { return OutputMessage(message); }
bool onMessage(const OrderExecutedWithPriceMessage& message) { return OutputMessage(message); }
bool onMessage(const OrderCancelMessage& message) { return OutputMessage(message); }
bool onMessage(const OrderDeleteMessage& message) { return OutputMessage(message); }
bool onMessage(const OrderReplaceMessage& message) { return OutputMessage(message); }
bool onMessage(const TradeMessage& message) { return OutputMessage(message); }
bool onMessage(const CrossTradeMessage& message) { return OutputMessage(message); }
bool onMessage(const BrokenTradeMessage& message) { return OutputMessage(message); }
bool onMessage(const NOIIMessage& message) { return OutputMessage(message); }
bool onMessage(const RPIIMessage& message) { return OutputMessage(message); }
bool onMessage(const LULDAuctionCollarMessage& message) { return OutputMessage(message); }
bool onMessage(const UnknownMessage& message) { return OutputMessage(message); }

private:
template <class TMessage>
Expand Down
19 changes: 9 additions & 10 deletions examples/market_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,57 +49,56 @@ class MyMarketHandler : public MarketHandler
{ std::cout << "Execute order: " << order << " with price " << price << " and quantity " << quantity << std::endl; }
};

class MyITCHHandler : public ITCHHandler
class MyITCHHandler : public ITCHHandler<MyITCHHandler>
{
public:
MyITCHHandler(MarketManager& market) : _market(market) {}

protected:
bool onMessage(const StockDirectoryMessage& message) override
bool onMessage(const StockDirectoryMessage& message)
{
Symbol symbol(message.StockLocate, message.Stock);
_market.AddSymbol(symbol);
_market.AddOrderBook(symbol);
return true;
}

bool onMessage(const AddOrderMessage& message) override
bool onMessage(const AddOrderMessage& message)
{
_market.AddOrder(Order::Limit(message.OrderReferenceNumber, message.StockLocate, (message.BuySellIndicator == 'B') ? OrderSide::BUY : OrderSide::SELL, message.Price, message.Shares));
return true;
}

bool onMessage(const AddOrderMPIDMessage& message) override
bool onMessage(const AddOrderMPIDMessage& message)
{
_market.AddOrder(Order::Limit(message.OrderReferenceNumber, message.StockLocate, (message.BuySellIndicator == 'B') ? OrderSide::BUY : OrderSide::SELL, message.Price, message.Shares));
return true;
}

bool onMessage(const OrderExecutedMessage& message) override
bool onMessage(const OrderExecutedMessage& message)
{
_market.ExecuteOrder(message.OrderReferenceNumber, message.ExecutedShares);
return true;
}

bool onMessage(const OrderExecutedWithPriceMessage& message) override
bool onMessage(const OrderExecutedWithPriceMessage& message)
{
_market.ExecuteOrder(message.OrderReferenceNumber, message.ExecutionPrice, message.ExecutedShares);
return true;
}

bool onMessage(const OrderCancelMessage& message) override
bool onMessage(const OrderCancelMessage& message)
{
_market.ReduceOrder(message.OrderReferenceNumber, message.CanceledShares);
return true;
}

bool onMessage(const OrderDeleteMessage& message) override
bool onMessage(const OrderDeleteMessage& message)
{
_market.DeleteOrder(message.OrderReferenceNumber);
return true;
}

bool onMessage(const OrderReplaceMessage& message) override
bool onMessage(const OrderReplaceMessage& message)
{
_market.ReplaceOrder(message.OriginalOrderReferenceNumber, message.NewOrderReferenceNumber, message.Price, message.Shares);
return true;
Expand Down
58 changes: 36 additions & 22 deletions include/trader/providers/nasdaq/itch_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "utility/iostream.h"

#include <vector>
#include <experimental/type_traits>

namespace CppTrader {

Expand Down Expand Up @@ -384,6 +385,7 @@ struct UnknownMessage

Not thread-safe.
*/
template<typename SubClass>
class ITCHHandler
{
public:
Expand Down Expand Up @@ -415,33 +417,45 @@ class ITCHHandler

protected:
// Message handlers
virtual bool onMessage(const SystemEventMessage& message) { return true; }
virtual bool onMessage(const StockDirectoryMessage& message) { return true; }
virtual bool onMessage(const StockTradingActionMessage& message) { return true; }
virtual bool onMessage(const RegSHOMessage& message) { return true; }
virtual bool onMessage(const MarketParticipantPositionMessage& message) { return true; }
virtual bool onMessage(const MWCBDeclineMessage& message) { return true; }
virtual bool onMessage(const MWCBStatusMessage& message) { return true; }
virtual bool onMessage(const IPOQuotingMessage& message) { return true; }
virtual bool onMessage(const AddOrderMessage& message) { return true; }
virtual bool onMessage(const AddOrderMPIDMessage& message) { return true; }
virtual bool onMessage(const OrderExecutedMessage& message) { return true; }
virtual bool onMessage(const OrderExecutedWithPriceMessage& message) { return true; }
virtual bool onMessage(const OrderCancelMessage& message) { return true; }
virtual bool onMessage(const OrderDeleteMessage& message) { return true; }
virtual bool onMessage(const OrderReplaceMessage& message) { return true; }
virtual bool onMessage(const TradeMessage& message) { return true; }
virtual bool onMessage(const CrossTradeMessage& message) { return true; }
virtual bool onMessage(const BrokenTradeMessage& message) { return true; }
virtual bool onMessage(const NOIIMessage& message) { return true; }
virtual bool onMessage(const RPIIMessage& message) { return true; }
virtual bool onMessage(const LULDAuctionCollarMessage& message) { return true; }
virtual bool onMessage(const UnknownMessage& message) { return true; }
bool onMessage(const SystemEventMessage& message) { return true; }
bool onMessage(const StockDirectoryMessage& message) { return true; }
bool onMessage(const StockTradingActionMessage& message) { return true; }
bool onMessage(const RegSHOMessage& message) { return true; }
bool onMessage(const MarketParticipantPositionMessage& message) { return true; }
bool onMessage(const MWCBDeclineMessage& message) { return true; }
bool onMessage(const MWCBStatusMessage& message) { return true; }
bool onMessage(const IPOQuotingMessage& message) { return true; }
bool onMessage(const AddOrderMessage& message) { return true; }
bool onMessage(const AddOrderMPIDMessage& message) { return true; }
bool onMessage(const OrderExecutedMessage& message) { return true; }
bool onMessage(const OrderExecutedWithPriceMessage& message) { return true; }
bool onMessage(const OrderCancelMessage& message) { return true; }
bool onMessage(const OrderDeleteMessage& message) { return true; }
bool onMessage(const OrderReplaceMessage& message) { return true; }
bool onMessage(const TradeMessage& message) { return true; }
bool onMessage(const CrossTradeMessage& message) { return true; }
bool onMessage(const BrokenTradeMessage& message) { return true; }
bool onMessage(const NOIIMessage& message) { return true; }
bool onMessage(const RPIIMessage& message) { return true; }
bool onMessage(const LULDAuctionCollarMessage& message) { return true; }
bool onMessage(const UnknownMessage& message) { return true; }

private:
size_t _size;
std::vector<uint8_t> _cache;

template<typename ClassType, typename... ArgType>
using OnMessageType = decltype(std::declval<ClassType&>().onMessage(std::declval<ArgType>()...));

//! Call the corresponding message handler if defined (as a public method) in SubClass, otherwise the default implementation.
template<typename T>
bool onMessageWrapper(T&& message) {
if constexpr (std::experimental::is_detected<OnMessageType, SubClass, decltype(message)>::value)
return static_cast<SubClass*>(this)->onMessage(std::forward<T>(message));
else
return onMessage(std::forward<T>(message));
}

bool ProcessSystemEventMessage(void* buffer, size_t size);
bool ProcessStockDirectoryMessage(void* buffer, size_t size);
bool ProcessStockTradingActionMessage(void* buffer, size_t size);
Expand Down
Loading