Joel Grunbaum
2022-01-20 441abf1e6a15a39f1ef7bf5e4ee2a4a43bff327b
commit | author | age
16b655 1 #pragma once
JG 2
3 #include "book.hpp"
4
5 #include <chrono>
6 #include <cstdint>
7 #include <ostream>
8 #include <queue>
9 #include <unordered_map>
10
11 namespace json
12 {
13 enum MessageTypes {
2c515f 14     FUTURE_TYPE,
JG 15     SPREAD_TYPE,
16     CALL_TYPE,
17     PUT_TYPE,
18     SETTLEMENT,
19     ADD,
20     ADDED,
21     DELETE,
22     DELETED,
23     REJECT,
24     TRADE,
25     BROKER_REQUEST,
26     BROKER_ACK,
27     BROKER_CONFIRM,
6bdd28 28     ERROR,
2c515f 29     NONE
16b655 30 };
JG 31
4fdb65 32 enum TradeTypeEnum { BUY_AGGRESSOR, SELL_AGGRESSOR, BROKER_TRADE };
16b655 33
JG 34 struct Message {
2c515f 35     MessageTypes type;
JG 36     std::string product;
37     Message(MessageTypes type, std::string product);
38     Message();
39     virtual ~Message() = default;
6bdd28 40 };
JG 41
42 struct ErrorMessage : public Message {
43     std::string message;
44     ErrorMessage(std::string message);
45     std::string as_string();
16b655 46 };
JG 47
48 struct FromExchange : public Message {
2c515f 49     uint64_t sequence;
JG 50     double timestamp;
51     FromExchange(MessageTypes type, std::string product, uint64_t sequence,
52                  double timestamp);
53     virtual ~FromExchange() = default;
16b655 54 };
JG 55
56 struct ToExchange : public Message {
2c515f 57     ToExchange(MessageTypes type, std::string product);
JG 58     virtual ~ToExchange() = default;
16b655 59 };
JG 60
61 struct Broker : public Message {
2c515f 62     double price;
JG 63     book::OrderSideEnum side;
64     uint64_t volume;
65     std::string counterparty;
66     Broker(MessageTypes type, std::string product, double price,
67            book::OrderSideEnum side, uint64_t volume, std::string counterparty);
68     virtual ~Broker() = default;
16b655 69 };
JG 70
71 struct AnnounceMessage : public FromExchange {
2c515f 72     int stationId;
JG 73     std::string stationName;
74     std::string unit;
75     std::chrono::nanoseconds expiry;
76     double aggFee;
77     double pasFee;
78     double broFee;
16b655 79
2c515f 80     AnnounceMessage(MessageTypes type, std::string product, int stationId,
JG 81                     std::string stationName, std::string unit,
82                     std::chrono::nanoseconds expiry, double aggFee,
83                     double pasFee, double broFee, uint64_t sequence,
84                     double timestamp);
0bef19 85     std::string as_string();
16b655 86 };
JG 87
88 struct SettleMessage : public FromExchange {
2c515f 89     std::string stationName;
JG 90     std::chrono::nanoseconds expiry;
91     double price;
92     SettleMessage(MessageTypes type, std::string product,
93                   std::string stationName, std::chrono::nanoseconds expiry,
94                   double price, uint64_t sequence, double timestamp);
0bef19 95     std::string as_string();
16b655 96 };
JG 97
98 struct AddMessage : public ToExchange {
2c515f 99     double price;
JG 100     book::OrderSideEnum side;
101     uint64_t volume;
102     AddMessage(MessageTypes type, std::string product, double price,
103                book::OrderSideEnum side, uint64_t volume);
104     std::string as_string();
16b655 105 };
JG 106
107 struct AddedMessage : public FromExchange {
2c515f 108     std::string id;
JG 109     book::OrderSideEnum side;
110     double price;
111     uint64_t filled;
112     uint64_t resting;
0bef19 113     std::string owner;
2c515f 114     AddedMessage(MessageTypes type, std::string product, std::string id,
JG 115                  book::OrderSideEnum side, double price, uint64_t filled,
0bef19 116                  uint64_t resting, std::string owner, uint64_t sequence,
JG 117                  double timestamp);
6bdd28 118     std::string as_string();
16b655 119 };
JG 120
121 struct DeleteMessage : public ToExchange {
2c515f 122     std::string id;
JG 123     DeleteMessage(MessageTypes type, std::string product, std::string id);
124     std::string as_string();
16b655 125 };
JG 126
127 struct DeletedMessage : public FromExchange {
2c515f 128     std::string id;
JG 129     book::OrderSideEnum side;
130     DeletedMessage(MessageTypes type, std::string product, std::string id,
131                    book::OrderSideEnum side, uint64_t sequence,
132                    double timestamp);
6bdd28 133     std::string as_string();
16b655 134 };
JG 135
136 struct RejectMessage : public FromExchange {
2c515f 137     std::string error;
JG 138     RejectMessage(MessageTypes type, std::string product, std::string error,
139                   uint64_t sequence, double timestamp);
6bdd28 140     std::string as_string();
16b655 141 };
JG 142
143 struct TradeMessage : public FromExchange {
2c515f 144     double price;
JG 145     uint64_t volume;
146     std::string buyer;
147     std::string seller;
148     TradeTypeEnum tradeType;
149     std::string passiveOrder;
150     uint64_t passiveOrderRemaining;
151     TradeMessage(MessageTypes type, std::string product, double price,
152                  uint64_t volume, std::string buyer, std::string seller,
153                  TradeTypeEnum tradeType, std::string passiveOrder,
154                  uint64_t passiveOrderRemaining, uint64_t sequence,
155                  double timestamp);
0b7aa0 156     std::string as_string();
16b655 157 };
JG 158
159 struct BrokerRequest : public Broker {
2c515f 160     BrokerRequest(MessageTypes type, std::string product, double price,
JG 161                   book::OrderSideEnum side, uint64_t volume,
162                   std::string counterparty);
0b7aa0 163     std::string as_string();
16b655 164 };
JG 165
166 struct BrokerAck : public Broker {
2c515f 167     std::string id;
JG 168     std::string brokerTradeStatus;
169     std::string owner;
170     BrokerAck(MessageTypes type, std::string product, double price,
171               book::OrderSideEnum side, uint64_t volume,
172               std::string counterparty, std::string id,
173               std::string brokerTradeStatus, std::string owner);
0b7aa0 174     std::string as_string();
16b655 175 };
JG 176
177 struct BrokerConfirm : public Broker {
2c515f 178     std::string id;
JG 179     BrokerConfirm(MessageTypes type, std::string product, double price,
180                   book::OrderSideEnum side, uint64_t volume,
181                   std::string counterparty, std::string id);
0b7aa0 182     std::string as_string();
16b655 183 };
JG 184
b4cf0a 185 std::queue<Message*> parse(std::string& str);
16b655 186 } // namespace json