root/isimud/tests/batsboe_exchanges.cpp

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. BOOST_AUTO_TEST_SUITE
  2. BOOST_AUTO_TEST_CASE_TEMPLATE
  3. BOOST_AUTO_TEST_CASE_TEMPLATE
  4. BOOST_AUTO_TEST_CASE_TEMPLATE
  5. BOOST_AUTO_TEST_CASE_TEMPLATE
  6. BOOST_AUTO_TEST_CASE_TEMPLATE
  7. BOOST_AUTO_TEST_CASE_TEMPLATE
  8. BOOST_AUTO_TEST_CASE_TEMPLATE
  9. BOOST_AUTO_TEST_CASE_TEMPLATE
  10. BOOST_AUTO_TEST_CASE_TEMPLATE
  11. BOOST_AUTO_TEST_SUITE_END
  12. BOOST_AUTO_TEST_CASE_TEMPLATE

   1 /******************************************************************************

   2 ** $Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/isimud/tests/batsboe_exchanges.cpp 2329 2018-09-26 01:02:36Z jmmcg $

   3 **

   4 ** Copyright (c) 2015 by J.M.McGuiness, coder@hussar.me.uk

   5 **

   6 ** This library is free software; you can redistribute it and/or

   7 ** modify it under the terms of the GNU Lesser General Public

   8 ** License as published by the Free Software Foundation; either

   9 ** version 2.1 of the License, or (at your option) any later version.

  10 **

  11 ** This library is distributed in the hope that it will be useful,

  12 ** but WITHOUT ANY WARRANTY; without even the implied warranty of

  13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

  14 ** Lesser General Public License for more details.

  15 **

  16 ** You should have received a copy of the GNU Lesser General Public

  17 ** License along with this library; if not, write to the Free Software

  18 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

  19 */
  20 
  21 #include "stdafx.h"
  22 
  23 #define BOOST_TEST_MODULE libjmmcg_tests
  24 #include <boost/test/included/unit_test.hpp>
  25 
  26 #include <boost/test/test_case_template.hpp>
  27 #include <boost/mpl/list.hpp>
  28 
  29 #include "../exchanges/FIX/v5.0sp2/fix.hpp"
  30 #include "../exchanges/BATSBOE/EU/v1/batsboe.hpp"
  31 #include "../exchanges/BATSBOE/EU/v1/batsboe_sim.hpp"
  32 #include "../exchanges/BATSBOE/EU/v2/batsboe.hpp"
  33 #include "../exchanges/BATSBOE/EU/v2/batsboe_sim.hpp"
  34 #include "../exchanges/BATSBOE/US/v1/batsboe.hpp"
  35 #include "../exchanges/BATSBOE/US/v1/batsboe_sim.hpp"
  36 #include "../exchanges/BATSBOE/US/v2/batsboe.hpp"
  37 #include "../exchanges/BATSBOE/US/v2/batsboe_sim.hpp"
  38 #include "../exchanges/conversions/fix_to_batsboe_eu_conversions.hpp"
  39 #include "../exchanges/conversions/fix_to_batsboe_us_conversions.hpp"
  40 #include "../exchanges/conversions/batsboe_eu_to_fix_conversions.hpp"
  41 #include "../exchanges/conversions/batsboe_us_to_fix_conversions.hpp"
  42 
  43 const boost::asio::ip::address localhost(boost::asio::ip::address_v4::loopback());
  44 const unsigned short client_port=12377u;
  45 const boost::asio::ip::address primary_gw(boost::asio::ip::address_v4::loopback());
  46 const unsigned short unused_primary_port=client_port+1;
  47 const uint32_t sequenceNumber(1);
  48 
  49 typedef boost::mpl::list<
  50         std::pair<isimud::exchanges::BATSBOE::EU::v1::link_t<isimud::exchanges::FIX::v5_0sp2::MsgTypes>, isimud::exchanges::BATSBOE::EU::v1::simulator_t>,
  51 // TODO std::pair<isimud::exchanges::BATSBOE::EU::v2::link_t<isimud::exchanges::FIX::v5_0sp2::MsgTypes>, isimud::exchanges::BATSBOE::EU::v2::simulator_t>,

  52         std::pair<isimud::exchanges::BATSBOE::US::v1::link_t<isimud::exchanges::FIX::v5_0sp2::MsgTypes>, isimud::exchanges::BATSBOE::US::v1::simulator_t>//,

  53 // TODO std::pair<isimud::exchanges::BATSBOE::US::v2::link_t<isimud::exchanges::FIX::v5_0sp2::MsgTypes>, isimud::exchanges::BATSBOE::US::v2::simulator_t>

  54 > exchg_t_types;
  55 
  56 template<class exchg_t>
  57 struct only_sim {
  58         using link_t=typename exchg_t::first_type;
  59         using simulator_t=typename exchg_t::second_type;
  60         using conn_pol_t=typename link_t::exchg_link_t::conn_pol_t;
  61         using connection_t=isimud::exchanges::common::connection<typename simulator_t::msg_processor_t::msg_details_t, typename link_t::exchg_link_t::conn_pol_t>;
  62 
  63         const conn_pol_t conn_pol{
  64                 typename conn_pol_t::gateways_t(
  65                         std::make_pair(primary_gw, unused_primary_port)
  66                 ),
  67                 isimud::exchanges::BATSBOE::common::logon_args_t{
  68                         0,
  69                         {"000"},
  70                         simulator_t::proc_rules_t::username,
  71                         simulator_t::proc_rules_t::password,
  72                         false
  73                 },
  74                 isimud::exchanges::BATSBOE::common::logoff_args_t{
  75                         sequenceNumber
  76                 }
  77         };
  78         simulator_t svr{primary_gw, unused_primary_port, typename simulator_t::proc_rules_t()};
  79 };
  80 
  81 template<class exchg_t>
  82 struct simulator_and_link : public only_sim<exchg_t> {
  83         using base_t=only_sim<exchg_t>;
  84         using link_t=typename base_t::link_t;
  85 
  86         link_t link{
  87                 typename link_t::client_link_t::ctor_args{
  88                         localhost,
  89                         client_port,
  90                         typename link_t::client_link_t::proc_rules_t()
  91                 },
  92                 this->conn_pol,
  93                 typename link_t::exchg_to_client_proc_rules_t()
  94         };
  95 };
  96 
  97 template<class exchg_t>
  98 struct simulator_and_link_client_too : public simulator_and_link<exchg_t> {
  99         isimud::exchanges::FIX::v5_0sp2::connection_t client{
 100                 isimud::exchanges::FIX::v5_0sp2::connection_t::conn_pol_t(
 101                         typename isimud::exchanges::FIX::v5_0sp2::connection_t::conn_pol_t::gateways_t(
 102                                 std::make_pair(localhost, client_port)
 103                         )
 104                 )
 105         };
 106 };
 107 
 108 BOOST_AUTO_TEST_SUITE(exchanges)
 109 
 110 BOOST_AUTO_TEST_SUITE(client_initiated)
 111 
 112 /**

 113         \test Verify Logon - no clients.

 114                         ==========================

 115         Verify that the link can log on to the exchange, with no clients.

 116 */
 117 BOOST_AUTO_TEST_CASE_TEMPLATE(logon_no_clients, exchg_t, exchg_t_types) {
 118         using fixture_t=simulator_and_link<exchg_t>;
 119 
 120         const fixture_t f{};
 121 
 122         BOOST_CHECK(f.link.is_logged_on());
 123 }
 124 
 125 /**

 126         \test Verify that gateway can re-Logon.

 127                         =================================

 128         Verify that the gateway can re-log on to the exchange, without any clients.

 129 */
 130 BOOST_AUTO_TEST_CASE_TEMPLATE(re_logon_no_clients, exchg_t, exchg_t_types) {
 131         using fixture_t=only_sim<exchg_t>;
 132 
 133         fixture_t f;
 134 
 135         {
 136                 const typename fixture_t::link_t link{
 137                         typename fixture_t::link_t::client_link_t::ctor_args{
 138                                 localhost,
 139                                 client_port,
 140                                 typename fixture_t::link_t::client_link_t::proc_rules_t()
 141                         },
 142                         f.conn_pol,
 143                         typename fixture_t::link_t::exchg_to_client_proc_rules_t()
 144                 };
 145                 BOOST_CHECK(link.is_logged_on());
 146         }
 147         {
 148                 const typename fixture_t::link_t link{
 149                         typename fixture_t::link_t::client_link_t::ctor_args{
 150                                 localhost,
 151                                 client_port,
 152                                 typename fixture_t::link_t::client_link_t::proc_rules_t()
 153                         },
 154                         f.conn_pol,
 155                         typename fixture_t::link_t::exchg_to_client_proc_rules_t()
 156                 };
 157                 BOOST_CHECK(link.is_logged_on());
 158         }
 159 }
 160 
 161 /**

 162         \test Verify Logon - with a client.

 163                         =============================

 164         Verify that the link can log on to the exchange and remains logged on, with a client connected.

 165 */
 166 BOOST_AUTO_TEST_CASE_TEMPLATE(logon_with_a_client, exchg_t, exchg_t_types) {
 167         using fixture_t=simulator_and_link<exchg_t>;
 168 
 169         const fixture_t f{};
 170 
 171         BOOST_CHECK(f.link.is_logged_on());
 172         {
 173                 const isimud::exchanges::FIX::v5_0sp2::connection_t client(
 174                         isimud::exchanges::FIX::v5_0sp2::connection_t::conn_pol_t(
 175                                 typename isimud::exchanges::FIX::v5_0sp2::connection_t::conn_pol_t::gateways_t(
 176                                         std::make_pair(localhost, client_port)
 177                                 )
 178                         )
 179                 );
 180                 BOOST_CHECK(f.link.is_logged_on());
 181         }
 182         BOOST_CHECK(f.link.is_logged_on());
 183 }
 184 
 185 /**

 186         \test Verify that clients can re-connect to logged-on gateway.

 187                         ========================================================

 188         Verify that the gateway can re-log on to the exchange, with a connected client.

 189 */
 190 BOOST_AUTO_TEST_CASE_TEMPLATE(re_connect_client_with_logon, exchg_t, exchg_t_types) {
 191         using fixture_t=simulator_and_link<exchg_t>;
 192 
 193         const fixture_t f{};
 194 
 195         BOOST_CHECK(f.link.is_logged_on());
 196         {
 197                 const isimud::exchanges::FIX::v5_0sp2::connection_t client(
 198                         isimud::exchanges::FIX::v5_0sp2::connection_t::conn_pol_t(
 199                                 typename isimud::exchanges::FIX::v5_0sp2::connection_t::conn_pol_t::gateways_t(
 200                                         std::make_pair(localhost, client_port)
 201                                 )
 202                         )
 203                 );
 204                 BOOST_CHECK(f.link.is_logged_on());
 205         }
 206         BOOST_CHECK(f.link.is_logged_on());
 207         {
 208                 const isimud::exchanges::FIX::v5_0sp2::connection_t client(
 209                         isimud::exchanges::FIX::v5_0sp2::connection_t::conn_pol_t(
 210                                 typename isimud::exchanges::FIX::v5_0sp2::connection_t::conn_pol_t::gateways_t(
 211                                         std::make_pair(localhost, client_port)
 212                                 )
 213                         )
 214                 );
 215                 BOOST_CHECK(f.link.is_logged_on());
 216         }
 217         BOOST_CHECK(f.link.is_logged_on());
 218 }
 219 
 220 /**

 221         \test Verify Heartbeats - no clients.

 222                         ===============================

 223         Verify that Heartbeats occur, without any clients.

 224 */
 225 BOOST_AUTO_TEST_CASE_TEMPLATE(heartbeats_no_clients, exchg_t, exchg_t_types) {
 226         using fixture_t=simulator_and_link<exchg_t>;
 227 
 228         const fixture_t f{};
 229 
 230         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)));
 231         BOOST_CHECK(f.link.is_logged_on());
 232 }
 233 
 234 /**

 235         \test Verify Heartbeats - with client.

 236                         ================================

 237         Verify that Heartbeats occur, with a connected client.

 238 */
 239 BOOST_AUTO_TEST_CASE_TEMPLATE(heartbeats_with_client, exchg_t, exchg_t_types) {
 240         using fixture_t=simulator_and_link<exchg_t>;
 241 
 242         const fixture_t f{};
 243 
 244         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)));
 245         BOOST_CHECK(f.link.is_logged_on());
 246 }
 247 
 248 /**

 249         \test Response to an invalid NewOrder.

 250                         ================================

 251         Verify that the response to an invalid NewOrder is a BusinessReject.

 252 */
 253 BOOST_AUTO_TEST_CASE_TEMPLATE(reject, exchg_t, exchg_t_types) {
 254         using fixture_t=simulator_and_link_client_too<exchg_t>;
 255 
 256         fixture_t f;
 257 
 258         BOOST_CHECK(f.link.is_logged_on());
 259 
 260         const isimud::exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
 261                 "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=028\001"
 262         };
 263         isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &fix_msg=reinterpret_cast<isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*fix_buffer.begin());
 264         BOOST_CHECK_EQUAL(fix_msg.type(), isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle::type_const);
 265         BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
 266         BOOST_CHECK(f.link.is_logged_on());
 267         isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderRejected receive_fix_msg;
 268         BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
 269         BOOST_CHECK(receive_fix_msg.is_valid());
 270         auto const ref_seq_num=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::RefSeqNum>();
 271         BOOST_CHECK_EQUAL(std::string(ref_seq_num.first, ref_seq_num.second), "2");
 272         BOOST_CHECK(f.link.is_logged_on());
 273 }
 274 
 275 /**

 276         \test Response to an invalid OrderCancelRequest.

 277                         ==========================================

 278         Verify that the response to an invalid OrderCancelRequest is a CancelRejected.

 279 */
 280 BOOST_AUTO_TEST_CASE_TEMPLATE(cancel_reject, exchg_t, exchg_t_types) {
 281         using fixture_t=simulator_and_link_client_too<exchg_t>;
 282 
 283         fixture_t f;
 284 
 285         BOOST_CHECK(f.link.is_logged_on());
 286 
 287         const isimud::exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
 288                 "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"
 289         };
 290         isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &fix_msg=reinterpret_cast<isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &>(*fix_buffer.begin());
 291         BOOST_CHECK_EQUAL(fix_msg.type(), isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest::type_const);
 292         BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
 293         BOOST_CHECK(f.link.is_logged_on());
 294         isimud::exchanges::FIX::v5_0sp2::MsgTypes::BusinessMessageReject receive_fix_msg;
 295         BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
 296         BOOST_CHECK(receive_fix_msg.is_valid());
 297         auto const client_order_id=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::ClOrdID>();
 298         BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(), "10");
 299         auto const seqNum=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::MsgSeqNum>();
 300         BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second), "2");
 301         BOOST_CHECK(f.link.is_logged_on());
 302 }
 303 
 304 /**

 305         \test Response to a valid OrderCancelRequest.

 306                         =======================================

 307         Verify that the response to a valid OrderCancelRequest is a cancelled order ExecutionReport.

 308 */
 309 BOOST_AUTO_TEST_CASE_TEMPLATE(cancel_accept, exchg_t, exchg_t_types) {
 310         using fixture_t=simulator_and_link_client_too<exchg_t>;
 311 
 312         fixture_t f;
 313 
 314         const isimud::exchanges::FIX::common::underlying_fix_data_buffer order_fix_buffer={
 315                 "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"
 316         };
 317         isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &order_fix_msg=reinterpret_cast<isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*order_fix_buffer.begin());
 318         BOOST_CHECK_EQUAL(order_fix_msg.type(), isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle::type_const);
 319         BOOST_CHECK(order_fix_msg.is_valid());
 320         BOOST_REQUIRE_NO_THROW(f.client.send(order_fix_msg));
 321         const isimud::exchanges::FIX::common::underlying_fix_data_buffer cancel_fix_buffer={
 322                 "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"
 323         };
 324         isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &cancel_fix_msg=reinterpret_cast<isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &>(*cancel_fix_buffer.begin());
 325         BOOST_REQUIRE_NO_THROW(f.client.send(cancel_fix_msg));
 326         isimud::exchanges::FIX::v5_0sp2::MsgTypes::ExecutionReport receive_fix_msg;
 327         BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
 328         BOOST_CHECK(receive_fix_msg.is_valid());
 329         auto const client_order_id=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::ClOrdID>();
 330         BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(), "10");
 331         auto const seqNum=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::MsgSeqNum>();
 332         BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second), "3");
 333         auto const price=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::Price>();
 334         BOOST_CHECK_EQUAL(std::string(price.first, price.second), "43.000000");
 335         auto const side=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::Side>();
 336         BOOST_CHECK_EQUAL(std::string(side.first, side.second), "1");
 337         auto const orderQty=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::OrderQty>();
 338         BOOST_CHECK_EQUAL(std::string(orderQty.first, orderQty.second), "99");
 339         auto const leavesQty=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::LeavesQty>();
 340         BOOST_CHECK_EQUAL(std::string(leavesQty.first, leavesQty.second), "99");
 341         BOOST_CHECK(f.link.is_logged_on());
 342 }
 343 
 344 /**

 345         \test Response to an invalid OrderCancelReplaceRequest.

 346                         =================================================

 347         Verify that the response to an invalid OrderCancelReplaceRequest is a cancelled order CancelRejected.

 348 */
 349 BOOST_AUTO_TEST_CASE_TEMPLATE(modify_reject, exchg_t, exchg_t_types) {
 350         using fixture_t=simulator_and_link_client_too<exchg_t>;
 351 
 352         fixture_t f;
 353 
 354         const isimud::exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
 355                 "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"
 356         };
 357         isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace const &fix_msg=reinterpret_cast<isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace const &>(*fix_buffer.begin());
 358         BOOST_CHECK_EQUAL(fix_msg.type(), isimud::exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace::type_const);
 359         BOOST_CHECK(fix_msg.is_valid());
 360         BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
 361         isimud::exchanges::FIX::v5_0sp2::MsgTypes::BusinessMessageReject receive_fix_msg;
 362         BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
 363         BOOST_CHECK(receive_fix_msg.is_valid());
 364         auto const client_order_id=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::ClOrdID>();
 365         BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(), "10");
 366         auto const seqNum=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::MsgSeqNum>();
 367         BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second), "2");
 368         BOOST_CHECK(f.link.is_logged_on());
 369 }
 370 
 371 BOOST_AUTO_TEST_SUITE_END()
 372 
 373 BOOST_AUTO_TEST_SUITE(new_order)
 374 
 375 BOOST_AUTO_TEST_SUITE(buy)
 376 
 377 BOOST_AUTO_TEST_SUITE(day)
 378 
 379 /**

 380         \test "Order handling" Test: Response to a BUY, DAY, MARKET NewOrder is a filled FIX message.

 381                         =======================================================================================

 382         Verify that the response to a buy, day, market NewOrder is a filled FIX message.

 383 */
 384 BOOST_AUTO_TEST_CASE_TEMPLATE(market_fill, exchg_t, exchg_t_types) {
 385         using fixture_t=simulator_and_link_client_too<exchg_t>;
 386 
 387         fixture_t f;
 388 
 389         const isimud::exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
 390                 "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"
 391         };
 392         isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &fix_msg=reinterpret_cast<isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*fix_buffer.begin());
 393         BOOST_CHECK_EQUAL(fix_msg.type(), isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle::type_const);
 394         BOOST_CHECK(fix_msg.is_valid());
 395         BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
 396         isimud::exchanges::FIX::v5_0sp2::MsgTypes::ExecutionReport receive_fix_msg;
 397         BOOST_REQUIRE_NO_THROW(f.client.receive(receive_fix_msg));
 398         BOOST_CHECK(receive_fix_msg.is_valid());
 399         auto const client_order_id=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::ClOrdID>();
 400         BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second).c_str(), "10");
 401         auto const seqNum=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::MsgSeqNum>();
 402         BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second), "2");
 403         auto const securityIDSource=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::SecurityIDSource>();
 404         BOOST_CHECK_EQUAL(std::string(securityIDSource.first, securityIDSource.second), "4");
 405         auto const securityID=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::SecurityID>();
 406         BOOST_CHECK_EQUAL(std::string(securityID.first), "GB00BH4HKS39");
 407         auto const price=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::Price>();
 408         BOOST_CHECK_EQUAL(std::string(price.first, price.second), "41.000000");
 409         auto const side=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::Side>();
 410         BOOST_CHECK_EQUAL(std::string(side.first, side.second), "1");
 411         auto const orderQty=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::OrderQty>();
 412         BOOST_CHECK_EQUAL(std::string(orderQty.first, orderQty.second), "99");
 413         auto const leavesQty=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::LeavesQty>();
 414         BOOST_CHECK_EQUAL(std::string(leavesQty.first, leavesQty.second), "0");
 415 }
 416 
 417 /**

 418         \test "Order handling" Test: Response to a BUY, DAY, MARKET NewOrder is a filled FIX message.

 419                         =======================================================================================

 420         Verify that the response to a buy, day, market NewOrder is a filled FIX message.

 421 */
 422 BOOST_AUTO_TEST_CASE_TEMPLATE(market_partial_fill, exchg_t, exchg_t_types) {
 423         using fixture_t=simulator_and_link_client_too<exchg_t>;
 424 
 425         fixture_t f;
 426 
 427         const isimud::exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
 428                 "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"
 429         };
 430         isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &fix_msg=reinterpret_cast<isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*fix_buffer.begin());
 431         BOOST_CHECK_EQUAL(fix_msg.type(), isimud::exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle::type_const);
 432         BOOST_CHECK(fix_msg.is_valid());
 433         BOOST_REQUIRE_NO_THROW(f.client.send(fix_msg));
 434         isimud::exchanges::FIX::v5_0sp2::MsgTypes::ExecutionReport receive_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<isimud::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<isimud::exchanges::FIX::common::FieldsFast::MsgSeqNum>();
 440         BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second), "2");
 441         auto const securityIDSource=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::SecurityIDSource>();
 442         BOOST_CHECK_EQUAL(std::string(securityIDSource.first, securityIDSource.second), "4");
 443         auto const securityID=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::SecurityID>();
 444         BOOST_CHECK_EQUAL(std::string(securityID.first), "GB00BH4HKS39");
 445         auto const price=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::Price>();
 446         BOOST_CHECK_EQUAL(std::string(price.first, price.second), "42.000000");
 447         auto const side=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::Side>();
 448         BOOST_CHECK_EQUAL(std::string(side.first, side.second), "1");
 449         auto const orderQty=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::OrderQty>();
 450         BOOST_CHECK_EQUAL(std::string(orderQty.first, orderQty.second), "100");
 451         auto const leavesQty=receive_fix_msg.find<isimud::exchanges::FIX::common::FieldsFast::LeavesQty>();
 452         BOOST_CHECK_EQUAL(std::string(leavesQty.first, leavesQty.second), "1");
 453 }
 454 
 455 BOOST_AUTO_TEST_SUITE_END()
 456 
 457 BOOST_AUTO_TEST_SUITE_END()
 458 
 459 BOOST_AUTO_TEST_SUITE_END()
 460 
 461 BOOST_AUTO_TEST_SUITE_END()

/* [<][>][^][v][top][bottom][index][help] */