libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
fix_to_batsboe_us.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_us_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::US::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 {
43  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
44  "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"
45  };
46  exchanges::FIX::v5_0sp2::MsgTypes::LogonRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::LogonRequest const &>(*fix_buffer.begin());
47  typename msg::LogonRequest exchg_msg(fix_msg, sequenceNumber, exchanges::BATSBOE::common::SessionSubID_t(), false);
48  BOOST_CHECK_EQUAL(exchg_msg.start_of_message, exchanges::BATSBOE::common::msg_start_code);
49  BOOST_CHECK_EQUAL(std::string(exchg_msg.userName.begin(), exchg_msg.userName.size()), "USER");
50  BOOST_CHECK_EQUAL(std::string(exchg_msg.password.begin()), "PASSWORD");
51 }
52 
53 BOOST_AUTO_TEST_CASE_TEMPLATE(LogoutRequest, msg, msg_types)
54 {
55  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
56  "8=FIX.5.0\0019=005\00135=5\00110=092\001"
57  };
58  exchanges::FIX::v5_0sp2::MsgTypes::LogoutRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::LogoutRequest const &>(*fix_buffer.begin());
59  typename msg::LogoutRequest exchg_msg(fix_msg, sequenceNumber);
60  BOOST_CHECK_EQUAL(exchg_msg.start_of_message, exchanges::BATSBOE::common::msg_start_code);
61 }
62 
63 BOOST_AUTO_TEST_CASE_TEMPLATE(ClientHeartbeat, msg, msg_types)
64 {
65  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
66  "8=FIX.5.0\0019=005\00135=0\00110=092\001"
67  };
68  exchanges::FIX::v5_0sp2::MsgTypes::ClientHeartbeat const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::ClientHeartbeat const &>(*fix_buffer.begin());
69  typename msg::ClientHeartbeat exchg_msg(fix_msg, sequenceNumber);
70  BOOST_CHECK_EQUAL(exchg_msg.start_of_message, exchanges::BATSBOE::common::msg_start_code);
71 }
72 
73 BOOST_AUTO_TEST_CASE_TEMPLATE(ServerHeartbeat, msg, msg_types)
74 {
75  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
76  "8=FIX.5.0\0019=005\00135=0\00110=092\001"
77  };
78  exchanges::FIX::v5_0sp2::MsgTypes::ServerHeartbeat const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::ServerHeartbeat const &>(*fix_buffer.begin());
79  typename msg::ServerHeartbeat exchg_msg(fix_msg, sequenceNumber);
80  BOOST_CHECK_EQUAL(exchg_msg.start_of_message, exchanges::BATSBOE::common::msg_start_code);
81 }
82 
83 BOOST_AUTO_TEST_SUITE_END()
84 
85 BOOST_AUTO_TEST_SUITE(conversions)
86 
87 BOOST_AUTO_TEST_CASE_TEMPLATE(NewOrderSingle, msg, msg_types) {
88  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
89  "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"
90  };
91  exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*fix_buffer.begin());
92  BOOST_CHECK_EQUAL(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::OrdType>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrdType>()), exchanges::BATSBOE::common::OrdType::Limit);
93  BOOST_CHECK_EQUAL(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::TIF>(fix_msg.find<exchanges::FIX::common::FieldsFast::TimeInForce>()), exchanges::BATSBOE::common::TIF::Day);
94  BOOST_CHECK_EQUAL(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Side>(fix_msg.find<exchanges::FIX::common::FieldsFast::Side>()), exchanges::BATSBOE::common::Side::Buy);
95  BOOST_CHECK_EQUAL(std::string(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::SecurityID_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::Symbol>()).data()), "69");
96  BOOST_CHECK_EQUAL(exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Quantity_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>()), 10000);
97  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);
98 }
99 
100 BOOST_AUTO_TEST_SUITE_END()
101 
102 BOOST_AUTO_TEST_SUITE(trade)
103 
104 BOOST_AUTO_TEST_CASE_TEMPLATE(NewOrderSingle, msg, msg_types) {
105  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
106  "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"
107  };
108  exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*fix_buffer.begin());
109  typename msg::NewOrder_t exchg_msg(fix_msg, sequenceNumber);
110  BOOST_CHECK_EQUAL(std::string(exchg_msg.clientOrderID().begin()), "10");
111  BOOST_CHECK_EQUAL(exchg_msg.orderQty(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Quantity_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>()));
112  BOOST_CHECK_EQUAL(exchg_msg.orderType(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::OrdType>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrdType>()));
113  BOOST_CHECK_EQUAL(exchg_msg.side(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Side>(fix_msg.find<exchanges::FIX::common::FieldsFast::Side>()));
114  BOOST_CHECK_EQUAL(exchg_msg.instrumentID(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::SecurityID_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityID>()));
115  BOOST_CHECK_EQUAL(exchg_msg.limitPrice(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Price_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::Price>()));
116  BOOST_CHECK_EQUAL(exchg_msg.tif(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::TIF>(fix_msg.find<exchanges::FIX::common::FieldsFast::TimeInForce>()));
117 }
118 
119 BOOST_AUTO_TEST_CASE_TEMPLATE(OrderCancelRequest, msg, msg_types) {
120  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
121  "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"
122  };
123  exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &>(*fix_buffer.begin());
124  BOOST_CHECK(fix_msg.is_valid());
125  typename msg::CancelOrder exchg_msg(fix_msg, sequenceNumber);
126  BOOST_CHECK_EQUAL(std::string(exchg_msg.originalClientOrderID().begin()), "10");
127 }
128 
129 BOOST_AUTO_TEST_CASE_TEMPLATE(OrderCancelReplace, msg, msg_types) {
130  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
131  "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"
132  };
133  exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace const &>(*fix_buffer.begin());
134  BOOST_CHECK(fix_msg.is_valid());
135  typename msg::OrderCancelReplaceRequest exchg_msg(fix_msg, sequenceNumber);
136  BOOST_CHECK_EQUAL(std::string(exchg_msg.originalClientOrderID().begin()), "10");
137  BOOST_CHECK_EQUAL(exchg_msg.orderQty(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Quantity_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>()));
138  BOOST_CHECK_EQUAL(exchg_msg.side(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Side>(fix_msg.find<exchanges::FIX::common::FieldsFast::Side>()));
139  BOOST_CHECK_EQUAL(exchg_msg.limitPrice(), exchanges::BATSBOE::common::convert<exchanges::BATSBOE::common::Price_t>(fix_msg.find<exchanges::FIX::common::FieldsFast::Price>()));
140 }
141 
142 BOOST_AUTO_TEST_SUITE_END()
143 
144 BOOST_AUTO_TEST_SUITE_END()