This sample demonstrates how to connect to the RDI, EMDI and EOBI feeds.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
25
26#include "RdiListener.h"
27#include "EmdiListener.h"
28#include "MdiListener.h"
29#include "EobiListener.h"
30
31#include "../Common/Signal.h"
32#include "../Common/Options.h"
33#include "../Common/Settings.h"
34#include "../Common/Utils.h"
35
38
39template <typename Configuration> std::unique_ptr<EmdiHandlerManager> makeEmdiHandlerManager(EmdiListener&, const Configuration&);
40template <typename Configuration> std::unique_ptr<MdiHandlerManager> makeMdiHandlerManager(MdiListener&, const Configuration& );
41template <typename Configuration> std::unique_ptr<EobiHandlerManager> makeEobiHandlerManager(EobiListener&, const Configuration&);
42
44int main(int argc, char* argv[])
45{
46
47 const Samples::AppConfiguration<
48 Samples::NetworkInterfaceConfiguration
49 , Samples::EnvironmentConfiguration
50 , Samples::LogDirectoryConfiguration
51 > cfg{"GettingStarted", argc, argv};
52
53 try
54 {
55 Samples::SignalHelper::manageSignals();
56
57 auto rdiSettings = Samples::makeSettings<RdiHandlerSettings>(cfg);
58 fillEnvironment(rdiSettings, cfg);
59
63
64 RdiListener rdiListener{rdiSettings.logDirectory};
65 auto rdiHandler = Samples::makeUnique<RdiHandler>(rdiSettings);
66
67 rdiHandler->bindFeedEngine(feedEngine);
68
69 rdiHandler
70 ->registerErrorListener(&rdiListener)
71 .registerWarningListener(&rdiListener)
72 .registerReferenceDataListener(&rdiListener);
73
74 std::clog << "Will start the RDI Handler ..." << std::endl;
75 rdiHandler->start();
76
77 rdiListener.waitUntilReferenceDataReceived();
78
80
81 EmdiListener emdiListener{rdiSettings.logDirectory};
82 MdiListener mdiListener{rdiSettings.logDirectory};
83 EobiListener eobiListener;
84
85 auto emdiHandlerManager = makeEmdiHandlerManager(emdiListener, cfg);
86 auto mdiHandlerManager = makeMdiHandlerManager(mdiListener, cfg);
87 auto eobiHandlerManager = makeEobiHandlerManager(eobiListener, cfg);
88
89 emdiHandlerManager->start(rdiHandler.get(), productNames, feedEngine);
90 mdiHandlerManager->start(rdiHandler.get(), productNames, feedEngine);
91 eobiHandlerManager->start(rdiHandler.get(), productNames, feedEngine);
92
93 Samples::SignalHelper::waitUntilKey("to stop the handlers");
94
95 std::clog << "Stopping..." << std::endl;
96
97 rdiHandler->stop();
98 emdiHandlerManager->stop();
99 eobiHandlerManager->stop();
100 mdiHandlerManager->stop();
101
102 std::clog << "All the Handlers are stopped." << std::endl;
103 }
104 catch(const std::exception& ex)
105 {
106 std::cerr << "EXCEPTION: " << ex.what() << std::endl;
107 }
108
109 return 0;
110}
111
112template <typename Configuration>
113std::unique_ptr<EmdiHandlerManager> makeEmdiHandlerManager(EmdiListener& listener, const Configuration& cfg)
114{
115 auto manager = Samples::makeUnique<EmdiHandlerManager>(Samples::makeSettings<EmdiHandlerSettings>(cfg));
116
117 manager->
118 registerDepthListener(&listener)
119 .registerErrorListener(&listener)
120 .registerWarningListener(&listener)
121 .registerTopOfBookImpliedListener(&listener)
122 .registerProductStateChangeListener(&listener)
123 .registerMassInstrumentStateChangeListener(&listener)
124 .registerInstrumentStateChangeListener(&listener)
125 .registerQuoteRequestListener(&listener)
126 .registerCrossRequestListener(&listener)
127 .registerComplexInstrumentUpdateListener(&listener)
128 .registerFlexibleInstrumentUpdateListener(&listener)
129 .registerOrderBookListener(&listener)
130 .registerTradeListener(&listener);
131
132 return manager;
133}
134
135template <typename Configuration>
136std::unique_ptr<MdiHandlerManager> makeMdiHandlerManager(MdiListener& listener, const Configuration& cfg)
137{
138 auto manager = Samples::makeUnique<MdiHandlerManager>(Samples::makeSettings<MdiHandlerSettings>(cfg));
139
140 manager->
141 registerDepthListener(&listener)
142 .registerErrorListener(&listener)
143 .registerWarningListener(&listener)
144 .registerTopOfBookImpliedListener(&listener)
145 .registerProductStateChangeListener(&listener)
146 .registerMassInstrumentStateChangeListener(&listener)
147 .registerInstrumentStateChangeListener(&listener)
148 .registerQuoteRequestListener(&listener)
149 .registerCrossRequestListener(&listener)
150 .registerComplexInstrumentUpdateListener(&listener)
151 .registerFlexibleInstrumentUpdateListener(&listener)
152 .registerOrderBookListener(&listener)
153 .registerTradeListener(&listener);
154
155 return manager;
156}
157
158template <typename Configuration>
159std::unique_ptr<EobiHandlerManager> makeEobiHandlerManager(EobiListener& listener, const Configuration& cfg)
160{
161 auto manager = Samples::makeUnique<EobiHandlerManager>(Samples::makeSettings<EobiHandlerSettings>(cfg));
162
163 manager->
164 registerErrorListener(&listener)
165 .registerWarningListener(&listener)
166 .registerHandlerStateListener(&listener)
167 .registerOrderDataListener(&listener)
168 .registerTradeDataListener(&listener)
169 .registerStateChangeListener(&listener)
170 .registerReferenceDataListener(&listener)
171 .registerSnapshotListener(&listener)
172 .registerMessageListener(&listener)
173 .registerOrderBookListener(&listener);
174
175 return manager;
176}
A pool of threads executing feed engine tasks.
The given class implements feed engine concept using pool of working threads and standard socket API.
IInterfaceDescriptorProvider::MarketSegments MarketSegments
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <sstream>
20
21#include "RdiListener.h"
22
25
26
27
28
29
30RdiListener::RdiListener(const std::string& logDir)
31 : referenceDataReady_(0)
32{
33 const std::string referenceDataLogName = logDir + "/ReferenceData.txt";
34 referenceDataLog_.open(referenceDataLogName.c_str());
35 if(!referenceDataLog_)
36 throw std::domain_error("Cannot open " + referenceDataLogName);
37}
38
39RdiListener::~RdiListener() = default;
40
41void RdiListener::onError(
ErrorCode::Enum code,
const std::string& description)
42{
43 std::clog <<
"Error occurred, errorCode = " <<
enumToString(code) <<
". Description: '" << description <<
"'" << std::endl;
44}
45
46void RdiListener::onWarning(const std::string& description)
47{
48 std::stringstream ss;
49 std::clog << "Warning occurred. Description: '" << description << "'" << std::endl;
50}
51
52void RdiListener::onSnapshotCycleStart()
53{
54 referenceDataLog_ << "onSnapshotCycleStart" << std::endl;
55 std::clog << "onSnapshotCycleStart" << std::endl;
56}
57
59{
61
62 if(!lastProductName_.empty())
63 std::clog << lastProductName_ << "(" << lasProductInstrumentNumber_ << "), ";
64
66 lasProductInstrumentNumber_ = 0;
67}
68
70{
72
73 ++lasProductInstrumentNumber_;
74}
75
77{
79}
80
82{
84}
85
87{
89}
90
92{
94}
95
96void RdiListener::onSnapshotCycleEnd()
97{
98 referenceDataLog_ << "onSnapshotCycleEnd" << std::endl;
99 std::clog << std::endl << "onSnapshotCycleEnd" << std::endl;
100 referenceDataReady_.release();
101}
102
103void RdiListener::waitUntilReferenceDataReceived()
104{
105 referenceDataReady_.acquire();
106}
std::string toStringWithFieldNames() const
StringRef marketSegment() const
Product name.
void toString(std::string &str) const
std::string enumToString(HandlerState::Enum)
Returns string representation of HandlerState value.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <sstream>
20
32
33#include "EmdiListener.h"
34
36
37
38
39
40
41EmdiListener::EmdiListener(const std::string& logDir, size_t outputNormalizer)
42 : outputNormalizer_(outputNormalizer)
43{
44 const std::string marketDataLogName = logDir + "/MarketData.txt";
45 marketDataLog_.open(marketDataLogName.c_str());
46 if(!marketDataLog_)
47 throw std::domain_error("Cannot open " + marketDataLogName);
48}
49
50EmdiListener::~EmdiListener() = default;
51
52void EmdiListener::onError(
ErrorCode::Enum code,
const std::string& description)
53{
54 std::clog <<
"Error occurred, errorCode = " <<
enumToString(code) <<
". Description: '" << description <<
"'" << std::endl;
55}
56
57void EmdiListener::onWarning(const std::string& description)
58{
59 std::stringstream ss;
60 std::clog << "Warning occurred. Description: '" << description << "'" << std::endl;
61}
62
64{
65 static size_t counter = 0;
66 if(0 == ++counter % outputNormalizer_)
67 std::clog << "Ds" << std::endl;
68}
69
71{
72 static size_t counter = 0;
73 if(0 == ++counter % outputNormalizer_)
74 std::clog << "Di" << std::endl;
75
77}
78
80{
81}
82
84{
85}
86
88{
89 static size_t counter = 0;
90 if(0 == ++counter % outputNormalizer_)
91 std::clog << "Top" << std::endl;
92
94}
95
97{
98 static size_t counter = 0;
99 if(0 == ++counter % outputNormalizer_)
100 std::clog << "Psc" << std::endl;
101
103}
104
106{
107 static size_t counter = 0;
108 if(0 == ++counter % outputNormalizer_)
109 std::clog << "Misc" << std::endl;
110
112}
113
115{
116 static size_t counter = 0;
117 if(0 == ++counter % outputNormalizer_)
118 std::clog << "Sc" << std::endl;
119
121}
122
124{
125 static size_t counter = 0;
126 if(0 == ++counter % outputNormalizer_)
127 std::clog << "Qr" << std::endl;
128
130}
131
133{
134 static size_t counter = 0;
135 if(0 == ++counter % outputNormalizer_)
136 std::clog << "Cr" << std::endl;
137
139}
140
142{
143 static size_t counter = 0;
144 if(0 == ++counter % outputNormalizer_)
145 std::clog << "Ciu" << std::endl;
146
148}
149
151{
152 static size_t counter = 0;
153 if(0 == ++counter % outputNormalizer_)
154 std::clog << "Fiu" << std::endl;
155
157}
158
159
161{
163}
164
166{
167}
168
169void EmdiListener::onSnapshotTrade(
const SnapshotTrade& trade)
170{
171 std::string tradeStr;
173 marketDataLog_ << tradeStr << std::endl;
174}
175
177{
178 std::string tradeStr;
180 marketDataLog_ << tradeStr << std::endl;
181}
void toString(std::string &) const override
Appends text presentation.
std::string toFormattedString() const
Returns formatted presentation of the book.
void toString(std::string &) const override
Appends text presentation.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <sstream>
20
32
33#include "MdiListener.h"
34
36
37
38
39
40
41MdiListener::MdiListener(const std::string& logDir, size_t outputNormalizer)
42 : outputNormalizer_(outputNormalizer)
43{
44 const std::string marketDataLogName = logDir + "/MarketData.txt";
45 marketDataLog_.open(marketDataLogName.c_str());
46 if(! marketDataLog_)
47 throw std::domain_error("Cannot open " + marketDataLogName);
48}
49
50MdiListener::~MdiListener() = default;
51
52void MdiListener::onError(
ErrorCode::Enum code,
const std::string& description)
53{
54 std::clog <<
"Error occurred, errorCode = " <<
enumToString(code) <<
". Description: '" << description <<
"'" << std::endl;
55}
56
57void MdiListener::onWarning(const std::string& description)
58{
59 std::stringstream ss;
60 std::clog << "Warning occurred. Description: '" << description << "'" << std::endl;
61}
62
64{
65 static size_t counter = 0;
66 if(0 == ++counter % outputNormalizer_)
67 std::clog << "Ds" << std::endl;
68}
69
71{
72 static size_t counter = 0;
73 if(0 == ++counter % outputNormalizer_)
74 std::clog << "Di" << std::endl;
75
77}
78
80{
81}
82
84{
85}
86
88{
89 static size_t counter = 0;
90 if(0 == ++counter % outputNormalizer_)
91 std::clog << "Top" << std::endl;
92
94}
95
97{
98 static size_t counter = 0;
99 if(0 == ++counter % outputNormalizer_)
100 std::clog << "Psc" << std::endl;
101
103}
104
106{
107 static size_t counter = 0;
108 if(0 == ++counter % outputNormalizer_)
109 std::clog << "Misc" << std::endl;
110
112}
113
115{
116 static size_t counter = 0;
117 if(0 == ++counter % outputNormalizer_)
118 std::clog << "Sc" << std::endl;
119
121}
122
124{
125 static size_t counter = 0;
126 if(0 == ++counter % outputNormalizer_)
127 std::clog << "Qr" << std::endl;
128
130}
131
133{
134 static size_t counter = 0;
135 if(0 == ++counter % outputNormalizer_)
136 std::clog << "Cr" << std::endl;
137
139}
140
142{
143 static size_t counter = 0;
144 if(0 == ++counter % outputNormalizer_)
145 std::clog << "Ciu" << std::endl;
146
148}
149
151{
152 static size_t counter = 0;
153 if(0 == ++counter % outputNormalizer_)
154 std::clog << "Fiu" << std::endl;
155
157}
158
159
161{
163}
164
166{
167}
168
170{
171 std::string tradeStr;
173 marketDataLog_ << tradeStr << std::endl;
174}
175
177{
178 std::string tradeStr;
180 marketDataLog_ << tradeStr << std::endl;
181}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <iostream>
21#include <sstream>
22
24
25#include "EobiListener.h"
26
29
30
31
32
33
34void EobiListener::onError(
ErrorCode::Enum code,
const std::string& description)
35{
36 std::clog <<
"Error occurred, errorCode = " <<
enumToString(code) <<
". Description: '" << description <<
"'" << std::endl;
37}
38
39void EobiListener::onWarning(const std::string& description)
40{
41 std::clog << "Warning occurred. Description: '" << description << "'" << std::endl;
42}
43
45{
46 std::clog <<
"Handler state changed: " <<
enumToString(newState) << std::endl;
47}
48
50{
52}
53
54void EobiListener::onOrderAdd(
const OrderAdd& msg)
55{
56 std::clog << "Message received: " << toString(msg) << std::endl;
57}
58
59void EobiListener::onOrderModify(
const OrderModify& msg)
60{
61 std::clog << "Message received: " << toString(msg) << std::endl;
62}
63
65{
66 std::clog << "Message received: " << toString(msg) << std::endl;
67}
68
69void EobiListener::onOrderDelete(
const OrderDelete& msg)
70{
71 std::clog << "Message received: " << toString(msg) << std::endl;
72}
73
75{
76 std::clog << "Message received: " << toString(msg) << std::endl;
77}
78
80{
81 std::clog << "Message received: " << toString(msg) << std::endl;
82}
83
85{
86 std::clog << "Message received: " << toString(msg) << std::endl;
87}
88
90{
91 std::clog << "Message received: " << toString(msg) << std::endl;
92}
93
95{
96 std::clog << "Message received: " << toString(msg) << std::endl;
97}
98
99void EobiListener::onTopOfBook(
const TopOfBook& msg)
100{
101 std::clog << "Message received: " << toString(msg) << std::endl;
102}
103
105{
106 std::clog << "Message received: " << toString(msg) << std::endl;
107}
108
110{
111 std::clog << "Message received: " << toString(msg) << std::endl;
112}
113
115{
116 std::clog << "Message received: " << toString(msg) << std::endl;
117}
118
119void EobiListener::onTradeReport(
const TradeReport& msg)
120{
121 std::clog << "Message received: " << toString(msg) << std::endl;
122}
123
125{
126 std::clog << "Message received: " << toString(msg) << std::endl;
127}
128
130{
131 std::clog << "Message received: " << toString(msg) << std::endl;
132}
133
135{
136 std::clog << "Message received: " << toString(msg) << std::endl;
137}
138
139void EobiListener::onMassInstrumentStateChange(
141{
142 std::clog << "Message received: " << toString(msg) << std::endl;
143}
144
146{
147 std::clog << "Message received: " << toString(msg) << std::endl;
148}
149
151{
152 std::clog << "Message received: " << toString(msg) << std::endl;
153}
154
156{
157 std::clog << "Message received: " << toString(msg) << std::endl;
158}
159
161{
162 std::clog << "Message received: " << toString(msg) << std::endl;
163}
164
166{
167 std::clog << "Message received: " << toString(msg) << std::endl;
168}
169
171{
172 std::clog << "Message received: " << toString(msg) << std::endl;
173}
174
176{
177 std::clog << "Message received: " << toString(msg) << std::endl;
178}
179
181{
182}
183
185{
186}
187
189{
190}
191
193{
194}
195
196void EobiListener::onSnapshotCycleBegin()
197{
198}
199
200void EobiListener::onSnapshotCycleEnd()
201{
202}
std::string toString() const
Returns text presentation.