From 4fdb65896bb30efb30fb22342e5b44dd481250dd Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Tue, 11 Jan 2022 07:04:05 +0000
Subject: [PATCH] Websocket added
---
json.cpp | 552 ++++++++++++++++++++++--------------------------------
1 files changed, 223 insertions(+), 329 deletions(-)
diff --git a/json.cpp b/json.cpp
index a650550..f64f677 100644
--- a/json.cpp
+++ b/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 out;
+}
+
+Message* parseSingle(rapidjson::Value& d)
+{
+ if (mapTypes.empty()) {
+ initialise();
}
- }
- return std::make_pair(out[0], out[1]);
+ 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(std::string& str)
+AnnounceMessage* announce(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;
- 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)));
+ // 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[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,78 +264,107 @@
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,
uint64_t volume, std::string buyer,
std::string seller, TradeTypeEnum tradeType,
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
--
Gitblit v1.10.0