21 #define BOOST_TEST_MODULE isimud_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "../exchanges/FIX/v5.0sp2/fix.hpp"
27 #include "../exchanges/BATSBOE/EU/v1/batsboe.hpp"
28 #include "../exchanges/BATSBOE/EU/v1/batsboe_sim.hpp"
29 #include "../exchanges/BATSBOE/EU/v2/batsboe.hpp"
30 #include "../exchanges/BATSBOE/EU/v2/batsboe_sim.hpp"
31 #include "../exchanges/BATSBOE/US/v1/batsboe.hpp"
32 #include "../exchanges/BATSBOE/US/v1/batsboe_sim.hpp"
33 #include "../exchanges/BATSBOE/US/v2/batsboe.hpp"
34 #include "../exchanges/BATSBOE/US/v2/batsboe_sim.hpp"
35 #include "../exchanges/conversions/fix_to_batsboe_eu_conversions.hpp"
36 #include "../exchanges/conversions/fix_to_batsboe_us_conversions.hpp"
37 #include "../exchanges/conversions/batsboe_eu_to_fix_conversions.hpp"
38 #include "../exchanges/conversions/batsboe_us_to_fix_conversions.hpp"
40 using namespace libjmmcg;
41 using namespace libisimud;
51 typedef boost::mpl::list<
52 std::pair<exchanges::BATSBOE::EU::v1::link_t<exchanges::FIX::v5_0sp2::MsgTypes>, exchanges::BATSBOE::EU::v1::simulator_t>,
54 std::pair<exchanges::BATSBOE::US::v1::link_t<exchanges::FIX::v5_0sp2::MsgTypes>, exchanges::BATSBOE::US::v1::simulator_t>
58 template<
class exchg_t>
60 using link_t=
typename exchg_t::first_type;
61 using simulator_t=
typename exchg_t::second_type;
62 using conn_pol_t=
typename link_t::exchg_link_t::conn_pol_t;
64 typename simulator_t::msg_processor_t::msg_details_t,
84 no_latency_timestamps
ts{0
};
88 simulator_t::socket_t::socket_priority::low,
89 api_thread_traits::processor_mask_type(exchanges::common::thread_traits::exchange_simulator_thread.core),
90 exchanges::common::thread_traits::exchange_simulator_thread.priority,
91 typename simulator_t::proc_rules_t(),
97 template<
class exchg_t>
100 using link_t=
typename base_t::link_t;
102 no_latency_timestamps
ts{0
};
104 typename link_t::client_link_t::ctor_args{
110 link_t::socket_t::socket_priority::high,
111 link_t::socket_t::socket_priority::low,
118 template<
class exchg_t>
131 BOOST_AUTO_TEST_SUITE(exchange_gateways)
133 BOOST_AUTO_TEST_SUITE(client_initiated)
140 BOOST_AUTO_TEST_CASE_TEMPLATE(logon_no_clients, exchg_t, exchg_t_types) {
145 BOOST_CHECK(f.link.is_logged_on());
153 BOOST_AUTO_TEST_CASE_TEMPLATE(re_logon_no_clients, exchg_t, exchg_t_types) {
157 no_latency_timestamps ts
{0
};
160 const typename fixture_t::link_t link{
161 typename fixture_t::link_t::client_link_t::ctor_args{
164 typename fixture_t::link_t::client_link_t::proc_rules_t(
sequenceNumber)
169 typename fixture_t::link_t::exchg_to_client_proc_rules_t(
sequenceNumber),
173 BOOST_CHECK(link.is_logged_on());
176 const typename fixture_t::link_t link{
177 typename fixture_t::link_t::client_link_t::ctor_args{
180 typename fixture_t::link_t::client_link_t::proc_rules_t(
sequenceNumber)
183 fixture_t::link_t::socket_t::socket_priority::high,
184 fixture_t::link_t::socket_t::socket_priority::low,
185 typename fixture_t::link_t::exchg_to_client_proc_rules_t(
sequenceNumber),
189 BOOST_CHECK(link.is_logged_on());
198 BOOST_AUTO_TEST_CASE_TEMPLATE(logon_with_a_client, exchg_t, exchg_t_types) {
203 BOOST_CHECK(f.link.is_logged_on());
205 const exchanges::
FIX::
v5_0sp2::connection_t client(
206 exchanges::FIX::v5_0sp2::connection_t::conn_pol_t(
207 typename exchanges::FIX::v5_0sp2::connection_t::conn_pol_t::gateways_t(
208 std::make_pair(localhost, client_port)
211 socket::socket_priority::high,
212 exchanges::common::thread_traits::client_to_exchange_thread.core
214 BOOST_CHECK(f.link.is_logged_on());
216 BOOST_CHECK(f.link.is_logged_on());
224 BOOST_AUTO_TEST_CASE_TEMPLATE(re_connect_client_with_logon, exchg_t, exchg_t_types) {
229 BOOST_CHECK(f.link.is_logged_on());
231 const exchanges::
FIX::
v5_0sp2::connection_t client(
232 exchanges::FIX::v5_0sp2::connection_t::conn_pol_t(
233 typename exchanges::FIX::v5_0sp2::connection_t::conn_pol_t::gateways_t(
234 std::make_pair(localhost, client_port)
237 socket::socket_priority::high,
238 exchanges::common::thread_traits::client_to_exchange_thread.core
240 BOOST_CHECK(f.link.is_logged_on());
242 BOOST_CHECK(f.link.is_logged_on());
244 const exchanges::
FIX::
v5_0sp2::connection_t client(
245 exchanges::FIX::v5_0sp2::connection_t::conn_pol_t(
246 typename exchanges::FIX::v5_0sp2::connection_t::conn_pol_t::gateways_t(
247 std::make_pair(localhost, client_port)
250 socket::socket_priority::high,
251 exchanges::common::thread_traits::client_to_exchange_thread.core
253 BOOST_CHECK(f.link.is_logged_on());
255 BOOST_CHECK(f.link.is_logged_on());
263 BOOST_AUTO_TEST_CASE_TEMPLATE(heartbeats_no_clients, exchg_t, exchg_t_types) {
268 std::this_thread::sleep_for(std::chrono::seconds(fixture_t::simulator_t::svr_mgr_t::heartbeats_t::heartbeat_interval*(fixture_t::simulator_t::svr_mgr_t::heartbeats_t::max_missed_heartbeats+1)));
269 BOOST_CHECK(f.link.is_logged_on());
277 BOOST_AUTO_TEST_CASE_TEMPLATE(heartbeats_with_client, exchg_t, exchg_t_types) {
282 std::this_thread::sleep_for(std::chrono::seconds(fixture_t::simulator_t::svr_mgr_t::heartbeats_t::heartbeat_interval*(fixture_t::simulator_t::svr_mgr_t::heartbeats_t::max_missed_heartbeats+1)));
283 BOOST_CHECK(f.link.is_logged_on());
291 BOOST_AUTO_TEST_CASE_TEMPLATE(reject, exchg_t, exchg_t_types) {
296 BOOST_CHECK(f.link.is_logged_on());
299 "8=FIX.5.0\0019=154\00135=D\00134=10\00143=N\00149=VENDOR\00150=CUSTOME\00156=BROKER\00160=19980930-09:25:58\0011=XQCCFUND\00111=10\00121=1\00155=EK\00148=GB0000595859\00122=4\00154=1\00138=10000\00140=2\00144=76.750000\00159=0\00110=092\001"
301 exchanges::
FIX::
v5_0sp2::
MsgTypes::NewOrderSingle
const &fix_msg=
reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle
const &>(*fix_buffer.begin());
302 BOOST_CHECK_EQUAL(fix_msg.type(), exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle::static_type);
303 BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
304 BOOST_CHECK(f.link.is_logged_on());
306 BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
307 BOOST_CHECK(receive_fix_msg.is_valid());
308 auto const ref_seq_num=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::RefSeqNum>();
309 BOOST_CHECK_EQUAL(std::string(ref_seq_num.first, ref_seq_num.second),
"2");
310 BOOST_CHECK(f.link.is_logged_on());
318 BOOST_AUTO_TEST_CASE_TEMPLATE(cancel_reject, exchg_t, exchg_t_types) {
323 BOOST_CHECK(f.link.is_logged_on());
326 "8=FIX.5.0\0019=141\00135=F\00111=10\00141=10\00148=GB00BH4HKS39\00149=VENDOR\00156=BROKER\00134=10\00152=20000426-12:05:06\00155=EK\00154=1\00160=19980930-09:25:58\00138=99\00140=1\00144=43.000000\00159=0\00110=101\001"
328 exchanges::
FIX::
v5_0sp2::
MsgTypes::OrderCancelRequest
const &fix_msg=
reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest
const &>(*fix_buffer.begin());
329 BOOST_CHECK_EQUAL(fix_msg.type(), exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest::static_type);
330 BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
331 BOOST_CHECK(f.link.is_logged_on());
333 BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
334 BOOST_CHECK(receive_fix_msg.is_valid());
335 auto const client_order_id=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
336 BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(),
"10");
337 auto const seqNum=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::MsgSeqNum>();
338 BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second),
"2");
339 BOOST_CHECK(f.link.is_logged_on());
347 BOOST_AUTO_TEST_CASE_TEMPLATE(cancel_accept, exchg_t, exchg_t_types) {
353 "8=FIX.5.0\0019=151\00135=D\00134=10\00143=N\00149=VENDOR\00150=CUSTOME\00156=BROKER\00160=19980930-09:25:58\0011=XQCCFUND\00111=10\00121=1\00155=EK\00148=GB00BH4HKS39\00122=4\00154=1\00138=99\00140=2\00144=43.000000\00159=0\00110=136\001"
355 exchanges::
FIX::
v5_0sp2::
MsgTypes::NewOrderSingle
const &order_fix_msg=
reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle
const &>(*order_fix_buffer.begin());
356 BOOST_CHECK_EQUAL(order_fix_msg.type(), exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle::static_type);
357 BOOST_CHECK(order_fix_msg.is_valid());
358 BOOST_REQUIRE_NO_THROW(f.client.send(order_fix_msg));
360 "8=FIX.5.0\0019=141\00135=F\00111=10\00141=10\00148=GB00BH4HKS39\00149=VENDOR\00156=BROKER\00134=10\00152=20000426-12:05:06\00155=EK\00154=1\00160=19980930-09:25:58\00138=99\00140=2\00144=43.000000\00159=0\00110=102\001"
362 exchanges::
FIX::
v5_0sp2::
MsgTypes::OrderCancelRequest
const &cancel_fix_msg=
reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest
const &>(*cancel_fix_buffer.begin());
363 BOOST_REQUIRE_NO_THROW(f.client.send(cancel_fix_msg));
365 BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
366 BOOST_CHECK(receive_fix_msg.is_valid());
367 auto const client_order_id=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
368 BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(),
"10");
369 auto const seqNum=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::MsgSeqNum>();
370 BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second),
"3");
371 auto const price=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::Price>();
372 BOOST_CHECK_EQUAL(std::string(price.first, price.second),
"43.000000");
373 auto const side=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::Side>();
374 BOOST_CHECK_EQUAL(std::string(side.first, side.second),
"1");
375 auto const orderQty=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>();
376 BOOST_CHECK_EQUAL(std::string(orderQty.first, orderQty.second),
"99");
377 auto const leavesQty=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::LeavesQty>();
378 BOOST_CHECK_EQUAL(std::string(leavesQty.first, leavesQty.second),
"99");
379 BOOST_CHECK(f.link.is_logged_on());
387 BOOST_AUTO_TEST_CASE_TEMPLATE(modify_reject, exchg_t, exchg_t_types) {
393 "8=FIX.5.0\0019=141\00135=G\00111=10\00141=10\00148=GB00BH4HKS39\00149=VENDOR\00156=BROKER\00134=10\00152=20000426-12:05:06\00155=EK\00154=1\00160=19980930-09:25:58\00138=99\00140=1\00144=43.000000\00159=0\00110=102\001"
395 exchanges::
FIX::
v5_0sp2::
MsgTypes::OrderCancelReplace
const &fix_msg=
reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace
const &>(*fix_buffer.begin());
396 BOOST_CHECK_EQUAL(fix_msg.type(), exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace::static_type);
397 BOOST_CHECK(fix_msg.is_valid());
398 BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
400 BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
401 BOOST_CHECK(receive_fix_msg.is_valid());
402 auto const client_order_id=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
403 BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(),
"10");
404 auto const seqNum=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::MsgSeqNum>();
405 BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second),
"2");
406 BOOST_CHECK(f.link.is_logged_on());
409 BOOST_AUTO_TEST_SUITE_END()
411 BOOST_AUTO_TEST_SUITE(new_order)
413 BOOST_AUTO_TEST_SUITE(buy)
415 BOOST_AUTO_TEST_SUITE(day)
422 BOOST_AUTO_TEST_CASE_TEMPLATE(market_fill, exchg_t, exchg_t_types) {
428 "8=FIX.5.0\0019=151\00135=D\00134=10\00143=N\00149=VENDOR\00150=CUSTOME\00156=BROKER\00160=19980930-09:25:58\0011=XQCCFUND\00111=10\00121=1\00155=EK\00148=GB00BH4HKS39\00122=4\00154=1\00138=99\00140=1\00144=41.000000\00159=0\00110=133\001"
430 exchanges::
FIX::
v5_0sp2::
MsgTypes::NewOrderSingle
const &fix_msg=
reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle
const &>(*fix_buffer.begin());
431 BOOST_CHECK_EQUAL(fix_msg.type(), exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle::static_type);
432 BOOST_CHECK(fix_msg.is_valid());
433 BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
435 BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
436 BOOST_CHECK(receive_fix_msg.is_valid());
437 auto const client_order_id=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
438 BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(),
"10");
439 auto const seqNum=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::MsgSeqNum>();
440 BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second),
"2");
441 auto const securityIDSource=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityIDSource>();
442 BOOST_CHECK_EQUAL(std::string(securityIDSource.first, securityIDSource.second),
"4");
443 auto const securityID=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityID>();
444 BOOST_CHECK_EQUAL(std::string(securityID.first),
"GB00BH4HKS39");
445 auto const price=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::Price>();
446 BOOST_CHECK_EQUAL(std::string(price.first, price.second),
"41.000000");
447 auto const side=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::Side>();
448 BOOST_CHECK_EQUAL(std::string(side.first, side.second),
"1");
449 auto const orderQty=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>();
450 BOOST_CHECK_EQUAL(std::string(orderQty.first, orderQty.second),
"99");
451 auto const leavesQty=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::LeavesQty>();
452 BOOST_CHECK_EQUAL(std::string(leavesQty.first, leavesQty.second),
"0");
460 BOOST_AUTO_TEST_CASE_TEMPLATE(market_partial_fill, exchg_t, exchg_t_types) {
466 "8=FIX.5.0\0019=152\00135=D\00134=10\00143=N\00149=VENDOR\00150=CUSTOME\00156=BROKER\00160=19980930-09:25:58\0011=XQCCFUND\00111=10\00121=1\00155=EK\00148=GB00BH4HKS39\00122=4\00154=1\00138=101\00140=1\00144=41.000000\00159=0\00110=166\001"
468 exchanges::
FIX::
v5_0sp2::
MsgTypes::NewOrderSingle
const &fix_msg=
reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle
const &>(*fix_buffer.begin());
469 BOOST_CHECK_EQUAL(fix_msg.type(), exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle::static_type);
470 BOOST_CHECK(fix_msg.is_valid());
471 BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
473 BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
474 BOOST_CHECK(receive_fix_msg.is_valid());
475 auto const client_order_id=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
476 BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(),
"10");
477 auto const seqNum=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::MsgSeqNum>();
478 BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second),
"2");
479 auto const securityIDSource=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityIDSource>();
480 BOOST_CHECK_EQUAL(std::string(securityIDSource.first, securityIDSource.second),
"4");
481 auto const securityID=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityID>();
482 BOOST_CHECK_EQUAL(std::string(securityID.first),
"GB00BH4HKS39");
483 auto const price=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::Price>();
484 BOOST_CHECK_EQUAL(std::string(price.first, price.second),
"42.000000");
485 auto const side=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::Side>();
486 BOOST_CHECK_EQUAL(std::string(side.first, side.second),
"1");
487 auto const orderQty=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>();
488 BOOST_CHECK_EQUAL(std::string(orderQty.first, orderQty.second),
"100");
489 auto const leavesQty=receive_fix_msg.find<exchanges::FIX::common::FieldsFast::LeavesQty>();
490 BOOST_CHECK_EQUAL(std::string(leavesQty.first, leavesQty.second),
"1");
493 BOOST_AUTO_TEST_SUITE_END()
495 BOOST_AUTO_TEST_SUITE_END()
497 BOOST_AUTO_TEST_SUITE_END()
499 BOOST_AUTO_TEST_SUITE_END()