From 353657fa069326a4036f2c9872e420c85f44b4e9 Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joel.grunbaum@imc.com>
Date: Wed, 12 Jan 2022 02:25:20 +0000
Subject: [PATCH] Added optimisation and test exchange selection in Makefile

---
 json.cpp |   58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 57 insertions(+), 1 deletions(-)

diff --git a/json.cpp b/json.cpp
index 5d8e340..f64f677 100644
--- a/json.cpp
+++ b/json.cpp
@@ -48,7 +48,8 @@
 	mapOrder = {{"BUY", book::Buy}, {"SELL", book::Sell}};
 
 	mapTrade = {{"BUY_AGGRESSOR", BUY_AGGRESSOR},
-	            {"SELL_AGGRESSOR", SELL_AGGRESSOR}};
+	            {"SELL_AGGRESSOR", SELL_AGGRESSOR},
+                {"BROKER_TRADE", BROKER_TRADE}};
 
 	mapOrderSide = {{book::Buy, "BUY"}, {book::Sell, "SELL"}};
 }
@@ -58,10 +59,12 @@
 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*> parse(std::string& str)
 {
@@ -83,6 +86,7 @@
 	if (mapTypes.empty()) {
 		initialise();
 	}
+	if (d.HasMember("error")) return error(d);
 	Message* out;
 	switch (mapTypes[d["type"].GetString()]) {
 	case FUTURE_TYPE:
@@ -99,6 +103,9 @@
 		break;
 	case DELETED:
 		out = deleted(d);
+		break;
+	case REJECT:
+		out = reject(d);
 		break;
 	case TRADE:
 		out = trade(d);
@@ -161,6 +168,12 @@
 		d["sequence"].GetInt(), d["timestamp"].GetDouble());
 }
 
+RejectMessage* reject(rapidjson::Value& d)
+{
+	return new RejectMessage(mapTypes[d["type"].GetString()], "",
+	                         d["error"].GetString(), uint64_t(0), double(0));
+}
+
 TradeMessage* trade(rapidjson::Value& d)
 {
 	return new TradeMessage(
@@ -197,11 +210,25 @@
 		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)
 {
+}
+
+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,
@@ -266,6 +293,18 @@
 {
 }
 
+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)
@@ -286,6 +325,15 @@
 {
 }
 
+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)
@@ -293,6 +341,14 @@
 {
 }
 
+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,

--
Gitblit v1.9.3