This sample demonstrates how to connect to the EMDS feeds.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <iostream>
20#include <sstream>
21
25
26#include "MyListener.h"
27
28#include "../Common/Signal.h"
29#include "../Common/Options.h"
30#include "../Common/Settings.h"
31
33
35int main(int argc, char* argv[])
36{
37
38 const Samples::AppConfiguration<
39 Samples::NetworkInterfaceConfiguration
40 , Samples::LogDirectoryConfiguration
41 > cfg{"EMDS", argc, argv};
42
43 try
44 {
45 Samples::SignalHelper::manageSignals();
46
47 MyListener myListener;
48
52
53 auto settings = Samples::makeSettings<EmdsHandlerSettings>(cfg);
54
55 std::clog << "Starting EMDS handler for realtime service" << std::endl;
56 settings.logFileNamePrefix = "emdsRealtime";
57 {
59 settings.settlementFeedDescriptor.serviceA.address = "224.0.50.93";
60 settings.settlementFeedDescriptor.serviceA.port = 59500;
61 settings.settlementFeedDescriptor.serviceB.address = "224.0.50.221";
62 settings.settlementFeedDescriptor.serviceB.port = 59500;
63
64 settings.openInterestFeedDescriptor.serviceA.address = "224.0.50.94";
65 settings.openInterestFeedDescriptor.serviceA.port = 59500;
66 settings.openInterestFeedDescriptor.serviceB.address = "224.0.50.222";
67 settings.openInterestFeedDescriptor.serviceB.port = 59500;
68
69
70 settings.exchangeTradeFeedDescriptor.serviceA.address = "224.0.164.120";
71 settings.exchangeTradeFeedDescriptor.serviceA.port = 59500;
72 settings.exchangeTradeFeedDescriptor.serviceB.address = "224.0.165.120";
73 settings.exchangeTradeFeedDescriptor.serviceB.port = 59500;
74 }
75
77 handlerForRealtime.bindFeedEngine(feedEngine);
78
79 handlerForRealtime.registerErrorListener(&myListener);
80 handlerForRealtime.registerWarningListener(&myListener);
81 handlerForRealtime.registerOpenInterestListener(&myListener);
82 handlerForRealtime.registerSettlementListener(&myListener);
83 handlerForRealtime.start();
84
85 std::clog << "Starting EMDS handler for replay service" << std::endl;
86 settings.logFileNamePrefix = "emdsReplay";
87 {
88
89 settings.settlementFeedDescriptor.serviceA.address = "224.0.50.93";
90 settings.settlementFeedDescriptor.serviceA.port = 59501;
91 settings.settlementFeedDescriptor.serviceB.address = "224.0.50.221";
92 settings.settlementFeedDescriptor.serviceB.port = 59501;
93
94 settings.openInterestFeedDescriptor.serviceA.address = "224.0.50.94";
95 settings.openInterestFeedDescriptor.serviceA.port = 59501;
96 settings.openInterestFeedDescriptor.serviceB.address = "224.0.50.222";
97 settings.openInterestFeedDescriptor.serviceB.port = 59501;
98
99 settings.exchangeTradeFeedDescriptor.serviceA.address = "224.0.50.95";
100 settings.exchangeTradeFeedDescriptor.serviceA.port = 59501;
101 settings.exchangeTradeFeedDescriptor.serviceB.address = "224.0.50.223";
102 settings.exchangeTradeFeedDescriptor.serviceB.port = 59501;
103 }
104
106 handlerForReplay.bindFeedEngine(feedEngine);
107
108 handlerForReplay.registerErrorListener(&myListener);
109 handlerForReplay.registerWarningListener(&myListener);
110 handlerForReplay.registerOpenInterestListener(&myListener);
111 handlerForReplay.registerSettlementListener(&myListener);
112 handlerForReplay.registerExchangeTradeListener(&myListener);
113 handlerForReplay.start();
114
115 std::clog << "Starting EMDS handler for replay service for Xetra trades" << std::endl;
116 settings.logFileNamePrefix = "emdsReplayForXetra";
117 {
118 settings.settlementFeedDescriptor.clear();
119 settings.openInterestFeedDescriptor.clear();
120
122 settings.exchangeTradeFeedDescriptor.serviceA.address = "224.0.164.120";
123 settings.exchangeTradeFeedDescriptor.serviceA.port = 59501;
124 settings.exchangeTradeFeedDescriptor.serviceB.address = "224.0.165.120";
125 settings.exchangeTradeFeedDescriptor.serviceB.port = 59501;
126 }
127
129 handlerForReplayXetra.bindFeedEngine(feedEngine);
130
131 handlerForReplayXetra.registerErrorListener(&myListener);
132 handlerForReplayXetra.registerWarningListener(&myListener);
133 handlerForReplayXetra.registerExchangeTradeListener(&myListener);
134 handlerForReplayXetra.start();
135
136 Samples::SignalHelper::waitUntilKey("to stop the handlers");
137
138 std::clog << "Stopping..." << std::endl;
139
140 handlerForRealtime.stop();
141 handlerForReplay.stop();
142 handlerForReplayXetra.stop();
143
144 std::clog << "Handlers are stopped." << std::endl;
145 }
146 catch(const std::exception& ex)
147 {
148 std::cerr << "EXCEPTION: " << ex.what() << std::endl;
149 }
150
151 return 0;
152}
Eurex Extended Market Data Service Handler.
A pool of threads executing feed engine tasks.
The given class implements feed engine concept using pool of working threads and standard socket API.