libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
fix_to_batsboe_eu.cpp
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright © 2015 by J.M.McGuiness, isimud@hussar.me.uk
3 **
4 ** This library is free software; you can redistribute it and/or
5 ** modify it under the terms of the GNU Lesser General Public
6 ** License as published by the Free Software Foundation; either
7 ** version 2.1 of the License, or (at your option) any later version.
8 **
9 ** This library is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ** Lesser General Public License for more details.
13 **
14 ** You should have received a copy of the GNU Lesser General Public
15 ** License along with this library; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 
19 #include "stdafx.h"
20 
21 #define BOOST_TEST_MODULE isimud_tests
22 #include <boost/test/included/unit_test.hpp>
23 
24 #include <boost/mpl/list.hpp>
25 
26 #include "../exchanges/conversions/fix_to_batsboe_eu_conversions.hpp"
27 
28 using namespace libisimud;
29 
30 const exchanges::BATSBOE::common::SeqNum_t sequenceNumber(1);
31 
32 typedef boost::mpl::list<
34 // TODO exchanges::BATSBOE::EU::v2::MsgTypes
36 
37 BOOST_AUTO_TEST_SUITE(exchange_gateways)
38 
39 BOOST_AUTO_TEST_SUITE(admin)
40 
41 BOOST_AUTO_TEST_CASE_TEMPLATE(LogonRequest, msg, msg_types) {
42  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
43  "8=FIX.5.0\0019=099\00135=A\00149=SENDER\00156=TARGET\00134=1\00152=20000426-12:05:06\00198=0\001108=30\001553=USER\001554=PASSWORD\001925=NEWPASSWD\00110=255\001"
44  };
45  exchanges::FIX::v5_0sp2::MsgTypes::LogonRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::LogonRequest const &>(*fix_buffer.begin());
46  typename msg::LogonRequest exchg_msg(fix_msg, sequenceNumber, exchanges::BATSBOE::common::SessionSubID_t(), false);
47  BOOST_CHECK_EQUAL(exchg_msg.start_of_message, exchanges::BATSBOE::common::msg_start_code);
48  BOOST_CHECK_EQUAL(std::string(exchg_msg.userName.begin(), exchg_msg.userName.size()), "USER");
49  BOOST_CHECK_EQUAL(std::string(exchg_msg.password.begin()), "PASSWORD");
50 }
51 
52 BOOST_AUTO_TEST_CASE_TEMPLATE(LogoutRequest, msg, msg_types) {
53  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
54  "8=FIX.5.0\0019=005\00135=5\00110=092\001"
55  };
56  exchanges::FIX::v5_0sp2::MsgTypes::LogoutRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::LogoutRequest const &>(*fix_buffer.begin());
57  typename msg::LogoutRequest exchg_msg(fix_msg, sequenceNumber);
58  BOOST_CHECK_EQUAL(exchg_msg.start_of_message, exchanges::BATSBOE::common::msg_start_code);
59 }
60 
61 BOOST_AUTO_TEST_CASE_TEMPLATE(ClientHeartbeat, msg, msg_types) {
62  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
63  "8=FIX.5.0\0019=005\00135=0\00110=092\001"
64  };
65  exchanges::FIX::v5_0sp2::MsgTypes::ClientHeartbeat const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::ClientHeartbeat const &>(*fix_buffer.begin());
66  typename msg::ClientHeartbeat exchg_msg(fix_msg, sequenceNumber);
67  BOOST_CHECK_EQUAL(exchg_msg.start_of_message, exchanges::BATSBOE::common::msg_start_code);
68 }
69 
70 BOOST_AUTO_TEST_CASE_TEMPLATE(ServerHeartbeat, msg, msg_types) {
71  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
72  "8=FIX.5.0\0019=005\00135=0\00110=092\001"
73  };
74  exchanges::FIX::v5_0sp2::MsgTypes::ServerHeartbeat const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::ServerHeartbeat const &>(*fix_buffer.begin());
75  typename msg::ServerHeartbeat exchg_msg(fix_msg, sequenceNumber);
76  BOOST_CHECK_EQUAL(exchg_msg.start_of_message, exchanges::BATSBOE::common::msg_start_code);
77 }
78 
79 BOOST_AUTO_TEST_SUITE_END()
80 
81 BOOST_AUTO_TEST_SUITE(conversions)
82 
83 BOOST_AUTO_TEST_CASE_TEMPLATE(NewOrderSingle, msg, msg_types) {
84  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
85  "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=69\00148=GB0000595859\00122=4\00154=1\00138=10000\00140=2\00144=76.750000\00159=0\00110=147\001"
86  };
87  exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*fix_buffer.begin());
88  BOOST_CHECK_EQUAL(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::OrdType>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrdType>()), exchanges::BATSBOE::common::OrdType::Limit);
89  BOOST_CHECK_EQUAL(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::TIF>(fix_msg.find<exchanges::FIX::common::FieldsFast::TimeInForce>()), exchanges::BATSBOE::common::TIF::Day);
90  BOOST_CHECK_EQUAL(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Side>(fix_msg.find<exchanges::FIX::common::FieldsFast::Side>()), exchanges::BATSBOE::common::Side::Buy);
91  BOOST_CHECK_EQUAL(std::string(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::SecurityID_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::Symbol>()).data()), "69");
92  BOOST_CHECK_EQUAL(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Quantity_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>()), 10000);
93  BOOST_CHECK_CLOSE(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Price_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::Price>()), exchanges::BATSBOE::common::implied_decimal_places*76.75, 0.01);
94 }
95 
96 BOOST_AUTO_TEST_SUITE_END()
97 
98 BOOST_AUTO_TEST_SUITE(trade)
99 
100 BOOST_AUTO_TEST_CASE_TEMPLATE(NewOrderSingle, msg, msg_types) {
101  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
102  "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=69\00148=GB0000595859\00122=4\00154=1\00138=10000\00140=2\00144=76.750000\00159=0\00110=147\001"
103  };
104  exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*fix_buffer.begin());
105  typename msg::NewOrder_t exchg_msg(fix_msg, sequenceNumber);
106  BOOST_CHECK_EQUAL(std::string(exchg_msg.clientOrderID().begin()), "10");
107  BOOST_CHECK_EQUAL(exchg_msg.orderQty(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Quantity_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>()));
108  BOOST_CHECK_EQUAL(exchg_msg.orderType(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::OrdType>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrdType>()));
109  BOOST_CHECK_EQUAL(exchg_msg.side(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Side>(fix_msg.find<exchanges::FIX::common::FieldsFast::Side>()));
110  BOOST_CHECK_EQUAL(exchg_msg.instrumentID(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::SecurityID_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityID>()));
111  BOOST_CHECK_EQUAL(exchg_msg.limitPrice(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Price_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::Price>()));
112  BOOST_CHECK_EQUAL(exchg_msg.tif(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::TIF>(fix_msg.find<exchanges::FIX::common::FieldsFast::TimeInForce>()));
113 }
114 
115 BOOST_AUTO_TEST_CASE_TEMPLATE(OrderCancelRequest, msg, msg_types) {
116  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
117  "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"
118  };
119  exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &>(*fix_buffer.begin());
120  BOOST_CHECK(fix_msg.is_valid());
121  typename msg::CancelOrder exchg_msg(fix_msg, sequenceNumber);
122  BOOST_CHECK_EQUAL(std::string(exchg_msg.originalClientOrderID().begin()), "10");
123 }
124 
125 BOOST_AUTO_TEST_CASE_TEMPLATE(OrderCancelReplace, msg, msg_types) {
126  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
127  "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"
128  };
129  exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace const &>(*fix_buffer.begin());
130  BOOST_CHECK(fix_msg.is_valid());
131  typename msg::OrderCancelReplaceRequest exchg_msg(fix_msg, sequenceNumber);
132  BOOST_CHECK_EQUAL(std::string(exchg_msg.originalClientOrderID().begin()), "10");
133  BOOST_CHECK_EQUAL(exchg_msg.orderQty(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Quantity_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>()));
134  BOOST_CHECK_EQUAL(exchg_msg.side(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Side>(fix_msg.find<exchanges::FIX::common::FieldsFast::Side>()));
135  BOOST_CHECK_EQUAL(exchg_msg.limitPrice(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Price_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::Price>()));
136 }
137 
138 BOOST_AUTO_TEST_SUITE_END()
139 
140 BOOST_AUTO_TEST_SUITE_END()