Joel Grunbaum
2022-01-11 d14f48a147190989d9b58f7b56429ac8711be077
json.cpp
@@ -2,6 +2,8 @@
#include "book.hpp"
#include "date/include/date/date.h"
#include "protocol.hpp"
#include "rapidjson/include/rapidjson/document.h"
#include "rapidjson/include/rapidjson/rapidjson.h"
#include <chrono>
#include <cstddef>
#include <cstdint>
@@ -26,372 +28,235 @@
void initialise()
{
    mapTypes = {{"FUTURE", FUTURE_TYPE},
                {"SPREAD", SPREAD_TYPE},
                {"CALL", CALL_TYPE},
                {"PUT", PUT_TYPE},
                {"SETTLEMENT", SETTLEMENT},
                {"ADDED", ADDED},
                {"DELETED", DELETED},
                {"TRADE", TRADE},
                {"BROKER_REQUEST", BROKER_REQUEST},
                {"BROKER_ACK", BROKER_ACK},
                {"BROKER_CONFIRM", BROKER_CONFIRM}};
   mapTypes = {{"FUTURE", FUTURE_TYPE},
               {"SPREAD", SPREAD_TYPE},
               {"CALL", CALL_TYPE},
               {"PUT", PUT_TYPE},
               {"SETTLEMENT", SETTLEMENT},
               {"ADDED", ADDED},
               {"DELETED", DELETED},
               {"TRADE", TRADE},
               {"BROKER_REQUEST", BROKER_REQUEST},
               {"BROKER_ACK", BROKER_ACK},
               {"BROKER_CONFIRM", BROKER_CONFIRM}};
    mapAnnounce = {{FUTURE_TYPE, book::FUTURE},
                   {SPREAD_TYPE, book::SPREAD},
                   {CALL_TYPE, book::CALL},
                   {PUT_TYPE, book::PUT}};
   mapAnnounce = {{FUTURE_TYPE, book::FUTURE},
                  {SPREAD_TYPE, book::SPREAD},
                  {CALL_TYPE, book::CALL},
                  {PUT_TYPE, book::PUT}};
    mapOrder = {{"BUY", book::Buy}, {"SELL", book::Sell}};
   mapOrder = {{"BUY", book::Buy}, {"SELL", book::Sell}};
    mapTrade = {{"BUY_AGGRESSOR", BUY_AGGRESSOR},
                {"SELL_AGGRESSOR", SELL_AGGRESSOR}};
   mapTrade = {{"BUY_AGGRESSOR", BUY_AGGRESSOR},
               {"SELL_AGGRESSOR", SELL_AGGRESSOR},
                {"BROKER_TRADE", BROKER_TRADE}};
    mapOrderSide = {{book::Buy, "BUY"}, {book::Sell, "SELL"}};
   mapOrderSide = {{book::Buy, "BUY"}, {book::Sell, "SELL"}};
}
AnnounceMessage* announce(std::string& str);
SettleMessage* settle(std::string& str);
AddedMessage* added(std::string& str);
DeletedMessage* deleted(std::string& str);
TradeMessage* trade(std::string& str);
BrokerRequest* brokerReq(std::string& str);
BrokerAck* brokerAck(std::string& str);
BrokerConfirm* brokerCon(std::string& str);
Message* parseSingle(rapidjson::Value& d);
AnnounceMessage* announce(rapidjson::Value& d);
SettleMessage* settle(rapidjson::Value& d);
AddedMessage* added(rapidjson::Value& d);
DeletedMessage* deleted(rapidjson::Value& d);
RejectMessage* reject(rapidjson::Value& d);
TradeMessage* trade(rapidjson::Value& d);
BrokerRequest* brokerReq(rapidjson::Value& d);
BrokerAck* brokerAck(rapidjson::Value& d);
BrokerConfirm* brokerCon(rapidjson::Value& d);
ErrorMessage* error(rapidjson::Value& d);
std::queue<Message*> parseMany(std::string& str)
std::queue<Message*> parse(std::string& str)
{
    std::queue<Message*> out;
    std::size_t startIndex = 0, endIndex = 0;
    while (true) {
   startIndex = str.find("{", endIndex);
   if (startIndex == std::string::npos) break;
   endIndex = str.find("},", startIndex);
   std::string substr = str.substr(startIndex, endIndex - startIndex + 1);
   // std::cout << substr << std::endl;
   Message* a = parseSingle(substr);
   out.push(a);
    }
    return out;
}
Message* parseSingle(std::string& str)
{
    if (mapTypes.empty()) {
   initialise();
    }
    std::size_t startIndex = str.find("\"type\": \"") + 9;
    std::size_t endIndex = str.find("\"", startIndex + 1);
    Message* out;
    switch (mapTypes[str.substr(startIndex, endIndex - startIndex)]) {
    case FUTURE_TYPE:
    case SPREAD_TYPE:
    case CALL_TYPE:
    case PUT_TYPE:
   out = announce(str);
   break;
    case SETTLEMENT:
   out = settle(str);
   break;
    case ADDED:
   out = added(str);
   break;
    case DELETED:
   out = deleted(str);
   break;
    case TRADE:
   out = trade(str);
   break;
    case BROKER_REQUEST:
   out = brokerReq(str);
   break;
    case BROKER_ACK:
   out = brokerAck(str);
   break;
    case BROKER_CONFIRM:
   out = brokerCon(str);
   break;
    default:
   out = new Message(NONE, "");
   break;
    }
    return out;
}
inline std::pair<std::size_t, std::size_t>
find_arg(std::string str, std::string a, bool quotes, bool end = false)
{
    std::size_t out[2];
    if (quotes) {
   out[0] = str.find("\"" + a + "\": \"") + 5 + a.size();
   if (end) {
       out[1] = str.find("\"}", out[0] + 1);
   std::queue<Message*> out;
   rapidjson::Document d;
   d.Parse(str.c_str());
   if (d.IsArray()) {
      for (rapidjson::SizeType i = 0; i < d.Size(); i++) {
         out.push(parseSingle(d[i]));
      }
   } else {
       out[1] = str.find("\",", out[0] + 1);
      out.push(parseSingle(d));
   }
    } else {
   out[0] = str.find("\"" + a + "\": ") + 4 + a.size();
   if (end) {
       out[1] = str.find("}", out[0] + 1);
   } else {
       out[1] = str.find(",", out[0] + 1);
   }
    }
    return std::make_pair(out[0], out[1]);
   return out;
}
AnnounceMessage* announce(std::string& str)
Message* parseSingle(rapidjson::Value& d)
{
    std::pair<std::size_t, std::size_t> type, product, stationId, stationName,
   unit, expiry, aggFee, pasFee, broFee, sequence, timestamp;
    type = find_arg(str, "type", true, false);
    product = find_arg(str, "product", true, false);
    stationId = find_arg(str, "stationId", false, false);
    stationName = find_arg(str, "stationName", true, false);
    unit = find_arg(str, "unit", true, false);
    expiry = find_arg(str, "expiry", true, false);
    aggFee = find_arg(str, "aggressiveFee", false, false);
    pasFee = find_arg(str, "passiveFee", false, false);
    broFee = find_arg(str, "brokerFee", false, false);
    sequence = find_arg(str, "sequence", false, false);
    timestamp = find_arg(str, "timestamp", false, true);
    std::stringstream expiryStream(
   str.substr(expiry.first, expiry.second - expiry.first));
    std::chrono::nanoseconds exp_time(0);
    // expiryStream >>
   if (mapTypes.empty()) {
      initialise();
   }
   if (d.HasMember("error")) return error(d);
   Message* out;
   switch (mapTypes[d["type"].GetString()]) {
   case FUTURE_TYPE:
   case SPREAD_TYPE:
   case CALL_TYPE:
   case PUT_TYPE:
      out = announce(d);
      break;
   case SETTLEMENT:
      out = settle(d);
      break;
   case ADDED:
      out = added(d);
      break;
   case DELETED:
      out = deleted(d);
      break;
   case REJECT:
      out = reject(d);
      break;
   case TRADE:
      out = trade(d);
      break;
   case BROKER_REQUEST:
      out = brokerReq(d);
      break;
   case BROKER_ACK:
      out = brokerAck(d);
      break;
   case BROKER_CONFIRM:
      out = brokerCon(d);
      break;
   default:
      out = new Message(NONE, "");
      break;
   }
   return out;
}
AnnounceMessage* announce(rapidjson::Value& d)
{
   // std::stringstream expiryStream(d["expiry"].GetString());
   std::chrono::nanoseconds exp_time(0);
   // expiryStream >>
   // date::parse("%Y-%m-%f %H:%M%z", exp_time); // Parsing is broken
    return new AnnounceMessage(
   mapTypes[str.substr(type.first, type.second - type.first)],
   str.substr(product.first, product.second - product.first),
   str.substr(stationId.first, stationId.second - stationId.first),
   str.substr(stationName.first, stationName.second - stationName.first),
   str.substr(unit.first, unit.second - unit.first), exp_time,
   std::stod(str.substr(aggFee.first, aggFee.second - aggFee.first)),
   std::stod(str.substr(pasFee.first, pasFee.second - pasFee.first)),
   std::stod(str.substr(broFee.first, broFee.second - broFee.first)),
   std::stoll(
       str.substr(sequence.first, sequence.second - sequence.first)),
   std::stod(
       str.substr(timestamp.first, timestamp.second - timestamp.first)));
   return new AnnounceMessage(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["stationId"].GetInt(), d["stationName"].GetString(),
      d["unit"].GetString(), exp_time, d["aggressiveFee"].GetDouble(),
      d["passiveFee"].GetDouble(), d["brokerFee"].GetDouble(),
      d["sequence"].GetInt(), d["timestamp"].GetDouble());
}
SettleMessage* settle(std::string& str)
SettleMessage* settle(rapidjson::Value& d)
{
    std::pair<std::size_t, std::size_t> type, product, stationName, expiry,
   price, sequence, timestamp;
    type = find_arg(str, "type", true, false);
    product = find_arg(str, "product", true, false);
    stationName = find_arg(str, "stationName", true, false);
    expiry = find_arg(str, "expiry", true, false);
    price = find_arg(str, "price", false, false);
    sequence = find_arg(str, "sequence", false, false);
    timestamp = find_arg(str, "timestamp", false, true);
    std::stringstream expiryStream(
   str.substr(expiry.first, expiry.second - expiry.first));
    std::chrono::nanoseconds exp_time;
    expiryStream >> date::parse("%Y-%m-%d %H:%M%z", exp_time);
    return new SettleMessage(
   mapTypes[str.substr(type.first, type.second - type.first)],
   str.substr(product.first, product.second - product.first),
   str.substr(stationName.first, stationName.second - stationName.first),
   exp_time,
   std::stod(str.substr(price.first, price.second - price.first)),
   std::stoll(
       str.substr(sequence.first, sequence.second - sequence.first)),
   std::stod(
       str.substr(timestamp.first, timestamp.second - timestamp.first)));
   // std::stringstream expiryStream(d["expiry"].GetString());
   std::chrono::nanoseconds exp_time(0);
   // expiryStream >> date::parse("%Y-%m-%d %H:%M%z", exp_time);
   return new SettleMessage(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["stationName"].GetString(), exp_time, d["price"].GetDouble(),
      d["sequence"].GetInt(), d["timestamp"].GetDouble());
}
AddedMessage* added(std::string& str)
AddedMessage* added(rapidjson::Value& d)
{
    std::pair<std::size_t, std::size_t> type, product, id, side, price, filled,
   resting, sequence, timestamp;
    type = find_arg(str, "type", true, false);
    product = find_arg(str, "product", true, false);
    sequence = find_arg(str, "sequence", false, false);
    timestamp = find_arg(str, "timestamp", false, true);
    id = find_arg(str, "id", true, false);
    side = find_arg(str, "side", true, false);
    price = find_arg(str, "price", false, false);
    filled = find_arg(str, "filled", false, false);
    resting = find_arg(str, "resting", false, false);
    return new AddedMessage(
   mapTypes[str.substr(type.first, type.second - type.first)],
   str.substr(product.first, product.second - product.first),
   str.substr(id.first, id.second - id.first),
   mapOrder[str.substr(side.first, side.second - side.first)],
   std::stod(str.substr(price.first, price.second - price.first)),
   std::stoll(str.substr(filled.first, filled.second - filled.first)),
   std::stoll(str.substr(resting.first, resting.second - resting.first)),
   std::stoll(
       str.substr(sequence.first, sequence.second - sequence.first)),
   std::stod(
       str.substr(timestamp.first, timestamp.second - timestamp.first)));
   return new AddedMessage(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["id"].GetString(), mapOrder[d["side"].GetString()],
      d["price"].GetDouble(), d["filled"].GetInt(), d["resting"].GetInt(),
      d["sequence"].GetInt(), d["timestamp"].GetDouble());
}
DeletedMessage* deleted(std::string& str)
DeletedMessage* deleted(rapidjson::Value& d)
{
    std::pair<std::size_t, std::size_t> type, product, id, side, sequence,
   timestamp;
    type = find_arg(str, "type", true, false);
    product = find_arg(str, "product", true, false);
    sequence = find_arg(str, "sequence", false, false);
    timestamp = find_arg(str, "timestamp", false, true);
    id = find_arg(str, "id", true, false);
    side = find_arg(str, "side", true, false);
    return new DeletedMessage(
   mapTypes[str.substr(type.first, type.second - type.first)],
   str.substr(product.first, product.second - product.first),
   str.substr(id.first, id.second - id.first),
   mapOrder[str.substr(side.first, side.second - side.first)],
   std::stoll(
       str.substr(sequence.first, sequence.second - sequence.first)),
   std::stod(
       str.substr(timestamp.first, timestamp.second - timestamp.first)));
   return new DeletedMessage(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["id"].GetString(), mapOrder[d["side"].GetString()],
      d["sequence"].GetInt(), d["timestamp"].GetDouble());
}
TradeMessage* trade(std::string& str)
RejectMessage* reject(rapidjson::Value& d)
{
    std::pair<std::size_t, std::size_t> type, product, price, volume, buyer,
   seller, tradeType, passiveOrder, passiveOrderRemaining, sequence,
   timestamp;
    type = find_arg(str, "type", true, false);
    product = find_arg(str, "product", true, false);
    sequence = find_arg(str, "sequence", false, false);
    timestamp = find_arg(str, "timestamp", false, true);
    price = find_arg(str, "price", false, false);
    volume = find_arg(str, "volume", false, false);
    buyer = find_arg(str, "buyer", true, false);
    seller = find_arg(str, "seller", true, false);
    tradeType = find_arg(str, "tradeType", true, false);
    passiveOrder = find_arg(str, "passiveOrder", true, false);
    passiveOrderRemaining =
   find_arg(str, "passiveOrderRemaining", false, false);
    return new TradeMessage(
   mapTypes[str.substr(type.first, type.second - type.first)],
   str.substr(product.first, product.second - product.first),
   std::stod(str.substr(price.first, price.second - price.first)),
   std::stoll(str.substr(volume.first, volume.second - volume.first)),
   str.substr(buyer.first, buyer.second - buyer.first),
   str.substr(seller.first, seller.second - seller.first),
   mapTrade[str.substr(tradeType.first,
                            tradeType.second - tradeType.first)],
   str.substr(passiveOrder.first,
                   passiveOrder.second - passiveOrder.first),
   std::stoll(str.substr(passiveOrderRemaining.first,
                              passiveOrderRemaining.second -
                                  passiveOrderRemaining.first)),
   std::stoll(
       str.substr(sequence.first, sequence.second - sequence.first)),
   std::stod(
       str.substr(timestamp.first, timestamp.second - timestamp.first)));
   return new RejectMessage(mapTypes[d["type"].GetString()], "",
                            d["error"].GetString(), uint64_t(0), double(0));
}
BrokerRequest* brokerReq(std::string& str)
TradeMessage* trade(rapidjson::Value& d)
{
    std::pair<std::size_t, std::size_t> type, product, price, side, volume,
   counterparty;
    type = find_arg(str, "type", true, false);
    product = find_arg(str, "product", true, false);
    price = find_arg(str, "price", false, false);
    side = find_arg(str, "side", true, false);
    volume = find_arg(str, "volume", false, false);
    counterparty = find_arg(str, "counterparty", true, false);
    return new BrokerRequest(
   mapTypes[str.substr(type.first, type.second - type.first)],
   str.substr(product.first, product.second - product.first),
   std::stod(str.substr(price.first, price.second - price.first)),
   mapOrder[str.substr(side.first, side.second - side.first)],
   std::stoll(str.substr(volume.first, volume.second - volume.first)),
   str.substr(counterparty.first,
                   counterparty.second - counterparty.first));
   return new TradeMessage(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["price"].GetDouble(), d["volume"].GetInt(), d["buyer"].GetString(),
      d["seller"].GetString(), mapTrade[d["tradeType"].GetString()],
      d["passiveOrder"].GetString(), d["passiveOrderRemaining"].GetInt(),
      d["sequence"].GetInt(), d["timestamp"].GetDouble());
}
BrokerAck* brokerAck(std::string& str)
BrokerRequest* brokerReq(rapidjson::Value& d)
{
    std::pair<std::size_t, std::size_t> type, product, price, side, volume,
   counterparty, id, brokerTradeStatus, owner;
    type = find_arg(str, "type", true, false);
    product = find_arg(str, "product", true, false);
    price = find_arg(str, "price", false, false);
    side = find_arg(str, "side", true, false);
    volume = find_arg(str, "volume", false, false);
    counterparty = find_arg(str, "counterparty", true, false);
    id = find_arg(str, "id", true, false);
    brokerTradeStatus = find_arg(str, "brokerTradeStatus", true, false);
    owner = find_arg(str, "owner", true, false);
    return new BrokerAck(
   mapTypes[str.substr(type.first, type.second - type.first)],
   str.substr(product.first, product.second - product.first),
   std::stod(str.substr(price.first, price.second - price.first)),
   mapOrder[str.substr(side.first, side.second - side.first)],
   std::stoll(str.substr(volume.first, volume.second - volume.first)),
   str.substr(counterparty.first,
                   counterparty.second - counterparty.first),
   str.substr(id.first, id.second - id.first),
   str.substr(brokerTradeStatus.first,
                   brokerTradeStatus.second - brokerTradeStatus.first),
   str.substr(owner.first, owner.second - owner.first));
   return new BrokerRequest(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["price"].GetDouble(), mapOrder[d["side"].GetString()],
      d["volume"].GetInt(), d["counterparty"].GetString());
}
BrokerConfirm* brokerCon(std::string& str)
{
    std::pair<std::size_t, std::size_t> type, product, price, side, volume,
   counterparty, id;
    type = find_arg(str, "type", true, false);
    product = find_arg(str, "product", true, false);
    price = find_arg(str, "price", false, false);
    side = find_arg(str, "side", true, false);
    volume = find_arg(str, "volume", false, false);
    counterparty = find_arg(str, "counterparty", true, false);
    id = find_arg(str, "id", true, false);
    return new BrokerConfirm(
   mapTypes[str.substr(type.first, type.second - type.first)],
   str.substr(product.first, product.second - product.first),
   std::stod(str.substr(price.first, price.second - price.first)),
   mapOrder[str.substr(side.first, side.second - side.first)],
   std::stoll(str.substr(volume.first, volume.second - volume.first)),
   str.substr(counterparty.first,
                   counterparty.second - counterparty.first),
   str.substr(id.first, id.second - id.first));
BrokerAck* brokerAck(rapidjson::Value& d)
{
   return new BrokerAck(mapTypes[d["type"].GetString()],
                        d["product"].GetString(), d["price"].GetDouble(),
                        mapOrder[d["side"].GetString()], d["volume"].GetInt(),
                        d["counterparty"].GetString(), d["id"].GetString(),
                        d["brokerTradeStatus"].GetString(),
                        d["owner"].GetString());
}
BrokerConfirm* brokerCon(rapidjson::Value& d)
{
   return new BrokerConfirm(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["price"].GetDouble(), mapOrder[d["side"].GetString()],
      d["volume"].GetInt(), d["counterparty"].GetString(),
      d["id"].GetString());
}
ErrorMessage* error(rapidjson::Value& d)
{
   return new ErrorMessage(d["error"].GetString());
}
Message::Message() : type(NONE), product("error") {}
Message::Message(MessageTypes types, std::string product)
    : type(types), product(product)
   : type(types), product(product)
{
}
ErrorMessage::ErrorMessage(std::string message)
   : Message(ERROR, ""), message(message)
{
}
std::string ErrorMessage::as_string()
{
   return "{\"error\": \"" + this->message + "\"}";
}
FromExchange::FromExchange(MessageTypes type, std::string product,
                           uint64_t sequence, double timestamp)
    : Message(type, product), sequence(sequence), timestamp(timestamp)
   : Message(type, product), sequence(sequence), timestamp(timestamp)
{
}
ToExchange::ToExchange(MessageTypes type, std::string product)
    : Message(type, product){};
   : Message(type, product){};
Broker::Broker(MessageTypes type, std::string product, double price,
               book::OrderSideEnum side, uint64_t volume,
               std::string counterparty)
    : Message(type, product), price(price), side(side), volume(volume),
      counterparty(counterparty)
   : Message(type, product), price(price), side(side), volume(volume),
     counterparty(counterparty)
{
}
AnnounceMessage::AnnounceMessage(MessageTypes type, std::string product,
                                 std::string stationId, std::string stationName,
                                 int stationId, std::string stationName,
                                 std::string unit,
                                 std::chrono::nanoseconds expiry, double aggFee,
                                 double pasFee, double broFee,
                                 uint64_t sequence, double timestamp)
    : FromExchange(type, product, sequence, timestamp), stationId(stationId),
      stationName(stationName), unit(unit), expiry(expiry), aggFee(aggFee),
      pasFee(pasFee), broFee(broFee)
   : FromExchange(type, product, sequence, timestamp), stationId(stationId),
     stationName(stationName), unit(unit), expiry(expiry), aggFee(aggFee),
     pasFee(pasFee), broFee(broFee)
{
}
@@ -399,60 +264,89 @@
                             std::string stationName,
                             std::chrono::nanoseconds expiry, double price,
                             uint64_t sequence, double timestamp)
    : FromExchange(type, product, sequence, timestamp),
      stationName(stationName), expiry(expiry), price(price)
   : FromExchange(type, product, sequence, timestamp),
     stationName(stationName), expiry(expiry), price(price)
{
}
AddMessage::AddMessage(MessageTypes type, std::string product, double price,
                       book::OrderSideEnum side, uint64_t volume)
    : ToExchange(type, product), price(price), side(side), volume(volume)
   : ToExchange(type, product), price(price), side(side), volume(volume)
{
}
std::string AddMessage::as_string()
{
    if (mapOrderSide.empty()) initialise();
    return "{\"type\": \"ADD\", \"product\": \"" + this->product +
           "\", \"price\": " + std::to_string(this->price) + ", \"side\": \"" +
           mapOrderSide[this->side] +
           "\", \"volume\": " + std::to_string(this->volume) + "}";
   if (mapOrderSide.empty()) initialise();
   return "{\"type\": \"ADD\", \"product\": \"" + this->product +
          "\", \"price\": " + std::to_string(this->price) + ", \"side\": \"" +
          mapOrderSide[this->side] +
          "\", \"volume\": " + std::to_string(this->volume) + "}";
}
AddedMessage::AddedMessage(MessageTypes type, std::string product,
                           std::string id, book::OrderSideEnum side,
                           double price, uint64_t filled, uint64_t resting,
                           uint64_t sequence, double timestamp)
    : FromExchange(type, product, sequence, timestamp), id(id), side(side),
      price(price), filled(filled), resting(resting)
   : FromExchange(type, product, sequence, timestamp), id(id), side(side),
     price(price), filled(filled), resting(resting)
{
}
std::string AddedMessage::as_string()
{
   return "{\"type\": \"ADDED\", \"product\": \"" + this->product +
          "\", \"product\": \"" + this->id + "\" \"side\": \"" +
          mapOrderSide[this->side] +
          "\", \"price\": " + std::to_string(this->price) +
          "\"filled\": " + std::to_string(this->filled) +
          ", \"resting\": " + std::to_string(this->resting) +
          ", \"sequence\": " + std::to_string(this->sequence) +
          ", \"timestamp\":" + std::to_string(this->timestamp) + "}";
}
DeleteMessage::DeleteMessage(MessageTypes type, std::string product,
                             std::string id)
    : ToExchange(type, product), id(id)
   : ToExchange(type, product), id(id)
{
}
std::string DeleteMessage::as_string()
{
    if (mapOrderSide.empty()) initialise();
    return "{\"type\": \"DELETE\", \"product\": \"" + this->product +
           "\", \"id\": \"" + this->id + "\"}";
   if (mapOrderSide.empty()) initialise();
   return "{\"type\": \"DELETE\", \"product\": \"" + this->product +
          "\", \"id\": \"" + this->id + "\"}";
}
DeletedMessage::DeletedMessage(MessageTypes type, std::string product,
                               std::string id, book::OrderSideEnum side,
                               uint64_t sequence, double timestamp)
    : FromExchange(type, product, sequence, timestamp), id(id), side(side)
   : FromExchange(type, product, sequence, timestamp), id(id), side(side)
{
}
std::string DeletedMessage::as_string()
{
   return "{\"type\": \"DELETED\", \"product\": \"" + this->product +
          "\", \"product\": \"" + this->id + "\" \"side\": \"" +
          mapOrderSide[this->side] +
          ", \"sequence\": " + std::to_string(this->sequence) +
          ", \"timestamp\":" + std::to_string(this->timestamp) + "}";
}
RejectMessage::RejectMessage(MessageTypes type, std::string product,
                             std::string error, uint64_t sequence,
                             double timestamp)
    : FromExchange(type, product, sequence, timestamp), error(error)
   : FromExchange(type, product, sequence, timestamp), error(error)
{
}
std::string RejectMessage::as_string()
{
   return "{\"type\": \"REJECT\", \"product\": \"" + this->product =
              "\", \"error\": \"" + this->error +
              "\", \"sequence\": " + std::to_string(this->sequence) +
              ", \"timestamp\": " + std::to_string(this->timestamp) + "}";
}
TradeMessage::TradeMessage(MessageTypes type, std::string product, double price,
@@ -461,16 +355,16 @@
                           std::string passiveOrder,
                           uint64_t passiveOrderRemaining, uint64_t sequence,
                           double timestamp)
    : FromExchange(type, product, sequence, timestamp), price(price),
      volume(volume), buyer(buyer), seller(seller), tradeType(tradeType),
      passiveOrder(passiveOrder), passiveOrderRemaining(passiveOrderRemaining)
   : FromExchange(type, product, sequence, timestamp), price(price),
     volume(volume), buyer(buyer), seller(seller), tradeType(tradeType),
     passiveOrder(passiveOrder), passiveOrderRemaining(passiveOrderRemaining)
{
}
BrokerRequest::BrokerRequest(MessageTypes type, std::string product,
                             double price, book::OrderSideEnum side,
                             uint64_t volume, std::string counterparty)
    : Broker(type, product, price, side, volume, counterparty)
   : Broker(type, product, price, side, volume, counterparty)
{
}
@@ -478,8 +372,8 @@
                     book::OrderSideEnum side, uint64_t volume,
                     std::string counterparty, std::string id,
                     std::string brokerTradeStatus, std::string owner)
    : Broker(type, product, price, side, volume, counterparty), id(id),
      brokerTradeStatus(brokerTradeStatus), owner(owner)
   : Broker(type, product, price, side, volume, counterparty), id(id),
     brokerTradeStatus(brokerTradeStatus), owner(owner)
{
}
@@ -487,7 +381,7 @@
                             double price, book::OrderSideEnum side,
                             uint64_t volume, std::string counterparty,
                             std::string id)
    : Broker(type, product, price, side, volume, counterparty), id(id)
   : Broker(type, product, price, side, volume, counterparty), id(id)
{
}
} // namespace json