-
Notifications
You must be signed in to change notification settings - Fork 259
/
Copy pathitch_handler.h
480 lines (416 loc) · 13.7 KB
/
itch_handler.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
/*!
\file itch_handler.h
\brief NASDAQ ITCH handler definition
\author Ivan Shynkarenka
\date 21.07.2017
\copyright MIT License
*/
#ifndef CPPTRADER_ITCH_HANDLER_H
#define CPPTRADER_ITCH_HANDLER_H
#include "utility/endian.h"
#include "utility/iostream.h"
#include <vector>
namespace CppTrader {
/*!
\namespace CppTrader::ITCH
\brief ITCH protocol definitions
*/
namespace ITCH {
//! System Event Message
struct SystemEventMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char EventCode;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const SystemEventMessage& message);
};
//! Stock Directory Message
struct StockDirectoryMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char Stock[8];
char MarketCategory;
char FinancialStatusIndicator;
uint32_t RoundLotSize;
char RoundLotsOnly;
char IssueClassification;
char IssueSubType[2];
char Authenticity;
char ShortSaleThresholdIndicator;
char IPOFlag;
char LULDReferencePriceTier;
char ETPFlag;
uint32_t ETPLeverageFactor;
char InverseIndicator;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const StockDirectoryMessage& message);
};
//! Stock Trading Action Message
struct StockTradingActionMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char Stock[8];
char TradingState;
char Reserved;
char Reason;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const StockTradingActionMessage& message);
};
//! Reg SHO Short Sale Price Test Restricted Indicator Message
struct RegSHOMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char Stock[8];
char RegSHOAction;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const RegSHOMessage& message);
};
//! Market Participant Position Message
struct MarketParticipantPositionMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char MPID[4];
char Stock[8];
char PrimaryMarketMaker;
char MarketMakerMode;
char MarketParticipantState;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const MarketParticipantPositionMessage& message);
};
//! MWCB Decline Level Message
struct MWCBDeclineMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t Level1;
uint64_t Level2;
uint64_t Level3;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const MWCBDeclineMessage& message);
};
//! MWCB Status Message
struct MWCBStatusMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char BreachedLevel;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const MWCBStatusMessage& message);
};
//! IPO Quoting Period Update Message
struct IPOQuotingMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char Stock[8];
uint32_t IPOReleaseTime;
char IPOReleaseQualifier;
uint32_t IPOPrice;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const IPOQuotingMessage& message);
};
//! Add Order Message
struct AddOrderMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t OrderReferenceNumber;
char BuySellIndicator;
uint32_t Shares;
char Stock[8];
uint32_t Price;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const AddOrderMessage& message);
};
//! Add Order with MPID Attribution Message
struct AddOrderMPIDMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t OrderReferenceNumber;
char BuySellIndicator;
uint32_t Shares;
char Stock[8];
uint32_t Price;
char Attribution;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const AddOrderMPIDMessage& message);
};
//! Order Executed Message
struct OrderExecutedMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t OrderReferenceNumber;
uint32_t ExecutedShares;
uint64_t MatchNumber;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const OrderExecutedMessage& message);
};
//! Order Executed With Price Message
struct OrderExecutedWithPriceMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t OrderReferenceNumber;
uint32_t ExecutedShares;
uint64_t MatchNumber;
char Printable;
uint32_t ExecutionPrice;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const OrderExecutedWithPriceMessage& message);
};
//! Order Cancel Message
struct OrderCancelMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t OrderReferenceNumber;
uint32_t CanceledShares;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const OrderCancelMessage& message);
};
//! Order Delete Message
struct OrderDeleteMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t OrderReferenceNumber;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const OrderDeleteMessage& message);
};
//! Order Replace Message
struct OrderReplaceMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t OriginalOrderReferenceNumber;
uint64_t NewOrderReferenceNumber;
uint32_t Shares;
uint32_t Price;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const OrderReplaceMessage& message);
};
//! Trade Message
struct TradeMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t OrderReferenceNumber;
char BuySellIndicator;
uint32_t Shares;
char Stock[8];
uint32_t Price;
uint64_t MatchNumber;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const TradeMessage& message);
};
//! Cross Trade Message
struct CrossTradeMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t Shares;
char Stock[8];
uint32_t CrossPrice;
uint64_t MatchNumber;
char CrossType;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const CrossTradeMessage& message);
};
//! Broken Trade Message
struct BrokenTradeMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t MatchNumber;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const BrokenTradeMessage& message);
};
//! Net Order Imbalance Indicator (NOII) Message
struct NOIIMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
uint64_t PairedShares;
uint64_t ImbalanceShares;
char ImbalanceDirection;
char Stock[8];
uint32_t FarPrice;
uint32_t NearPrice;
uint32_t CurrentReferencePrice;
char CrossType;
char PriceVariationIndicator;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const NOIIMessage& message);
};
//! Retail Price Improvement Indicator (RPII) Message
struct RPIIMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char Stock[8];
char InterestFlag;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const RPIIMessage& message);
};
//! Limit Up – Limit Down (LULD) Auction Collar Message
struct LULDAuctionCollarMessage
{
char Type;
uint16_t StockLocate;
uint16_t TrackingNumber;
uint64_t Timestamp;
char Stock[8];
uint32_t AuctionCollarReferencePrice;
uint32_t UpperAuctionCollarPrice;
uint32_t LowerAuctionCollarPrice;
uint32_t AuctionCollarExtension;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const LULDAuctionCollarMessage& message);
};
//! Unknown message
struct UnknownMessage
{
char Type;
template <class TOutputStream>
friend TOutputStream& operator<<(TOutputStream& stream, const UnknownMessage& message);
};
//! NASDAQ ITCH handler class
/*!
NASDAQ ITCH handler is used to parse NASDAQ ITCH protocol and handle its
messages in special handlers.
NASDAQ ITCH protocol specification:
http://www.nasdaqtrader.com/content/technicalsupport/specifications/dataproducts/NQTVITCHSpecification.pdf
NASDAQ ITCH protocol examples:
https://emi.nasdaq.com/ITCH
Not thread-safe.
*/
class ITCHHandler
{
public:
ITCHHandler() { Reset(); }
ITCHHandler(const ITCHHandler&) = delete;
ITCHHandler(ITCHHandler&&) = delete;
virtual ~ITCHHandler() = default;
ITCHHandler& operator=(const ITCHHandler&) = delete;
ITCHHandler& operator=(ITCHHandler&&) = delete;
//! Process all messages from the given buffer in ITCH format and call corresponding handlers
/*!
\param buffer - Buffer to process
\param size - Buffer size
\return 'true' if the given buffer was successfully processed, 'false' if the given buffer process was failed
*/
bool Process(void* buffer, size_t size);
//! Process a single message from the given buffer in ITCH format and call corresponding handlers
/*!
\param buffer - Buffer to process
\param size - Buffer size
\return 'true' if the given buffer was successfully processed, 'false' if the given buffer process was failed
*/
bool ProcessMessage(void* buffer, size_t size);
//! Reset ITCH handler
void Reset();
protected:
// Message handlers
virtual bool onMessage(const SystemEventMessage& message) { return true; }
virtual bool onMessage(const StockDirectoryMessage& message) { return true; }
virtual bool onMessage(const StockTradingActionMessage& message) { return true; }
virtual bool onMessage(const RegSHOMessage& message) { return true; }
virtual bool onMessage(const MarketParticipantPositionMessage& message) { return true; }
virtual bool onMessage(const MWCBDeclineMessage& message) { return true; }
virtual bool onMessage(const MWCBStatusMessage& message) { return true; }
virtual bool onMessage(const IPOQuotingMessage& message) { return true; }
virtual bool onMessage(const AddOrderMessage& message) { return true; }
virtual bool onMessage(const AddOrderMPIDMessage& message) { return true; }
virtual bool onMessage(const OrderExecutedMessage& message) { return true; }
virtual bool onMessage(const OrderExecutedWithPriceMessage& message) { return true; }
virtual bool onMessage(const OrderCancelMessage& message) { return true; }
virtual bool onMessage(const OrderDeleteMessage& message) { return true; }
virtual bool onMessage(const OrderReplaceMessage& message) { return true; }
virtual bool onMessage(const TradeMessage& message) { return true; }
virtual bool onMessage(const CrossTradeMessage& message) { return true; }
virtual bool onMessage(const BrokenTradeMessage& message) { return true; }
virtual bool onMessage(const NOIIMessage& message) { return true; }
virtual bool onMessage(const RPIIMessage& message) { return true; }
virtual bool onMessage(const LULDAuctionCollarMessage& message) { return true; }
virtual bool onMessage(const UnknownMessage& message) { return true; }
private:
size_t _size;
std::vector<uint8_t> _cache;
bool ProcessSystemEventMessage(void* buffer, size_t size);
bool ProcessStockDirectoryMessage(void* buffer, size_t size);
bool ProcessStockTradingActionMessage(void* buffer, size_t size);
bool ProcessRegSHOMessage(void* buffer, size_t size);
bool ProcessMarketParticipantPositionMessage(void* buffer, size_t size);
bool ProcessMWCBDeclineMessage(void* buffer, size_t size);
bool ProcessMWCBStatusMessage(void* buffer, size_t size);
bool ProcessIPOQuotingMessage(void* buffer, size_t size);
bool ProcessAddOrderMessage(void* buffer, size_t size);
bool ProcessAddOrderMPIDMessage(void* buffer, size_t size);
bool ProcessOrderExecutedMessage(void* buffer, size_t size);
bool ProcessOrderExecutedWithPriceMessage(void* buffer, size_t size);
bool ProcessOrderCancelMessage(void* buffer, size_t size);
bool ProcessOrderDeleteMessage(void* buffer, size_t size);
bool ProcessOrderReplaceMessage(void* buffer, size_t size);
bool ProcessTradeMessage(void* buffer, size_t size);
bool ProcessCrossTradeMessage(void* buffer, size_t size);
bool ProcessBrokenTradeMessage(void* buffer, size_t size);
bool ProcessNOIIMessage(void* buffer, size_t size);
bool ProcessRPIIMessage(void* buffer, size_t size);
bool ProcessLULDAuctionCollarMessage(void* buffer, size_t size);
bool ProcessUnknownMessage(void* buffer, size_t size);
template <size_t N>
size_t ReadString(const void* buffer, char (&str)[N]);
size_t ReadTimestamp(const void* buffer, uint64_t& value);
};
/*! \example itch_handler.cpp NASDAQ ITCH handler example */
} // namespace ITCH
} // namespace CppTrader
#include "itch_handler.inl"
#endif // CPPTRADER_ITCH_HANDLER_H