← source index

src/OrderBook.h

72 lines  ·  1.7 K  ·  cpp
#include "../Include.h"

#include "OrderEntryItem.h"
#include <boost/algorithm/string.hpp>


class OrderBook
{
public:
#ifdef MAP_BASED_ORDERBOOK
    typedef std::map<double, double, std::greater<double>>  BidMap;
    typedef std::map<double, double, std::less<double>>     AskMap;
#else
    typedef std::vector<std::pair<double, double>>  BidMap;
    typedef std::vector<std::pair<double, double>>  AskMap;
#endif

#ifdef ITERATOR_BASED_ORDERBOOK
    struct Entry
    {
        EntrySide side;
        BidMap::iterator bidIt;
        AskMap::iterator askIt;
    };
#endif

public:
    OrderBook(const std::string&);

    void addOrder(EntrySide, double, double);
    void removeOrder(EntrySide, double);

    const BidMap& getBids() { return mBidLevels; }
    const AskMap& getAsks() { return mAskLevels; }

    int getBookWidth() { return mInitBookWidth; }
    int getBidBookSize() { return mBidLevels.size(); }
    int getAskBookSize() { return mAskLevels.size(); }
    std::string toStr(int depth = 0, int spacing = 0);
    void clear();

private:
#ifdef ITERATOR_BASED_ORDERBOOK
    template<class T>
    typename T::iterator add(T&, double, double);
    template<class T>
    void remove(typename T::iterator, T&);
#else
#ifdef MAP_BASED_ORDERBOOK
    template<class T>
    void add(T&, double, double);
    template<class T>
    void remove(T&, double price);
#else
    template<class T, class C>
    void add(T&, double, double, C);
    template<class T, class C>
    void remove(T&, double price, C);
#endif
    
#endif

private:
    BidMap mBidLevels;
    AskMap mAskLevels;
    std::string mSymbol;
    int mInitBookWidth;

#ifdef ITERATOR_BASED_ORDERBOOK
    std::unordered_map<double, Entry> mLookup;
#endif
};