libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
mit_to_fix_conversions.hpp
Go to the documentation of this file.
1 #ifndef ISIMUD_EXCHANGES_conversions_mit_to_fix_conversions_hpp
2 #define ISIMUD_EXCHANGES_conversions_mit_to_fix_conversions_hpp
3 
4 /******************************************************************************
5 ** Copyright © 2015 by J.M.McGuiness, isimud@hussar.me.uk
6 **
7 ** This library is free software; you can redistribute it and/or
8 ** modify it under the terms of the GNU Lesser General Public
9 ** License as published by the Free Software Foundation; either
10 ** version 2.1 of the License, or (at your option) any later version.
11 **
12 ** This library is distributed in the hope that it will be useful,
13 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 ** Lesser General Public License for more details.
16 **
17 ** You should have received a copy of the GNU Lesser General Public
18 ** License along with this library; if not, write to the Free Software
19 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21 
22 #include "../../exchanges/FIX/v5.0sp2/messages.hpp"
23 #include "../../exchanges/MIT/BIT/messages.hpp"
24 #include "../../exchanges/MIT/JSE/messages.hpp"
25 #include "../../exchanges/MIT/LSE/messages.hpp"
26 #include "../../exchanges/MIT/OSLO/messages.hpp"
27 #include "../../exchanges/MIT/TRQ/messages.hpp"
28 
29 namespace isimud { namespace ISIMUD_VER_NAMESPACE { namespace exchanges { namespace FIX { namespace common {
30 
31 /**
32  Note that only ISIN symbology is supported.
33 */
34 template<class RefData> constexpr inline int
35 convert(MIT::common::SecurityID_t const &key, RefData const &ref_data, char *buff, [[maybe_unused]] std::size_t sz) {
36  assert(!ref_data.lookup_isin().empty());
37  auto const &i=ref_data.lookup_isin().find(key);
38  assert(i!=ref_data.lookup_isin().end());
39  assert(sizeof(typename RefData::lookup_isin_t::mapped_type::element_type)<=sz);
40  libjmmcg::memcpy_opt(i->second.isin_.data(), reinterpret_cast<typename RefData::lookup_isin_t::mapped_type::element_type::block_t &>(*buff));
41  return sizeof(typename RefData::lookup_isin_t::mapped_type::element_type);
42 }
43 
44 /**
45  \todo What should be done with ExecType's that cannot be mapped?.
46 */
47 inline ExecType
48 convert(MIT::common::ExecType const &a) noexcept(false) {
49  switch (a) {
51  return ExecType::New;
53  return ExecType::Canceled;
55  return ExecType::Replaced;
57  return ExecType::Rejected;
59  return ExecType::Suspended;
61  return ExecType::Expired;
63  return ExecType::Restated;
65  return ExecType::Trade;
67  return ExecType::Trade_Correct;
69  return ExecType::Trade_Cancel;
72  default: {
73  std::ostringstream os;
74  os<<"Unknown MIT ExecType: "<<a;
75  throw std::runtime_error(os.str());
76  }
77  };
78 }
79 
80 /**
81  \todo What should be done with OrderStatus's that cannot be mapped?.
82 */
83 inline OrdStatus
84 convert(MIT::common::OrderStatus const &a) noexcept(false) {
85  switch (a) {
87  return OrdStatus::New;
89  return OrdStatus::Partially_filled;
91  return OrdStatus::Filled;
93  return OrdStatus::Canceled;
95  return OrdStatus::Expired;
97  return OrdStatus::Rejected;
99  return OrdStatus::Suspended;
100  default: {
101  std::ostringstream os;
102  os<<"Unknown MIT OrderStatus: "<<a;
103  throw std::runtime_error(os.str());
104  }
105  };
106 }
107 
108 inline int
109 convert_MIT_price(MIT::common::Price_t const &a, char *buff, std::size_t sz) {
110  const double c=static_cast<double>(a)/MIT::common::implied_decimal_places;
111  return libjmmcg::tostring(c, buff, sz);
112 }
113 
114 /**
115  \todo What should be done with Side's that cannot be mapped?.
116 */
117 constexpr inline char
118 convert(MIT::common::Side const &a) {
119  switch (a) {
121  return '1';
123  return '2';
124  default:
125  return '?';
126  };
127 }
128 
129 template<>
130 template<> inline __stdcall
132 : Header_t() {
135  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
136  data+=msg.clientOrderID().size()-1;
139  ++data;
141  const int i=convert(msg.instrumentID(), rd, data, this->data_.size()-(data-this->data_.begin()));
142  assert(i>0);
143  data+=i;
145  *data=static_cast<char>(convert(msg.execType()));
146  ++data;
148  const int j=convert_MIT_price(msg.executedPrice(), data, this->data_.size()-(data-this->data_.begin()));
149  assert(j>0);
150  data+=j;
152  *data=static_cast<char>(convert(msg.orderStatus()));
153  ++data;
155  const int k=convert(msg.executedQty(), data, this->data_.size()-(data-this->data_.begin()));
156  assert(k>0);
157  data+=k;
159  const int l=convert(msg.leavesQty(), data, this->data_.size()-(data-this->data_.begin()));
160  assert(l>0);
161  data+=l;
163  *data=convert(msg.side());
164  ++data;
167 // TODO msg.orderRejectCode();
169 }
170 
171 template<>
172 template<> inline __stdcall
174 : Header_t() {
177  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
178  data+=msg.clientOrderID().size()-1;
181  ++data;
183  const int i=convert(msg.instrumentID(), rd, data, this->data_.size()-(data-this->data_.begin()));
184  assert(i>0);
185  data+=i;
187  *data=static_cast<char>(convert(msg.execType()));
188  ++data;
190  const int j=convert_MIT_price(msg.executedPrice(), data, this->data_.size()-(data-this->data_.begin()));
191  assert(j>0);
192  data+=j;
194  *data=static_cast<char>(convert(msg.orderStatus()));
195  ++data;
197  const int k=convert(msg.executedQty(), data, this->data_.size()-(data-this->data_.begin()));
198  assert(k>0);
199  data+=k;
201  const int l=convert(msg.leavesQty(), data, this->data_.size()-(data-this->data_.begin()));
202  assert(l>0);
203  data+=l;
205  *data=convert(msg.side());
206  ++data;
209 // TODO msg.orderRejectCode();
211 }
212 
213 template<>
214 template<> inline __stdcall
216 : Header_t() {
219  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
220  data+=msg.clientOrderID().size()-1;
223  ++data;
225  const int i=convert(msg.instrumentID(), rd, data, this->data_.size()-(data-this->data_.begin()));
226  assert(i>0);
227  data+=i;
229  *data=static_cast<char>(convert(msg.execType()));
230  ++data;
232  const int j=convert_MIT_price(msg.executedPrice(), data, this->data_.size()-(data-this->data_.begin()));
233  assert(j>0);
234  data+=j;
236  *data=static_cast<char>(convert(msg.orderStatus()));
237  ++data;
239  const int k=convert(msg.executedQty(), data, this->data_.size()-(data-this->data_.begin()));
240  assert(k>0);
241  data+=k;
243  const int l=convert(msg.leavesQty(), data, this->data_.size()-(data-this->data_.begin()));
244  assert(l>0);
245  data+=l;
247  *data=convert(msg.side());
248  ++data;
251 // TODO msg.orderRejectCode();
253 }
254 
255 template<>
256 template<> inline __stdcall
258 : Header_t() {
261  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
262  data+=msg.clientOrderID().size()-1;
265  ++data;
267  const int i=convert(msg.instrumentID(), rd, data, this->data_.size()-(data-this->data_.begin()));
268  assert(i>0);
269  data+=i;
271  *data=static_cast<char>(convert(msg.execType()));
272  ++data;
274  const int j=convert_MIT_price(msg.executedPrice(), data, this->data_.size()-(data-this->data_.begin()));
275  assert(j>0);
276  data+=j;
278  *data=static_cast<char>(convert(msg.orderStatus()));
279  ++data;
281  const int k=convert(msg.executedQty(), data, this->data_.size()-(data-this->data_.begin()));
282  assert(k>0);
283  data+=k;
285  const int l=convert(msg.leavesQty(), data, this->data_.size()-(data-this->data_.begin()));
286  assert(l>0);
287  data+=l;
289  *data=convert(msg.side());
290  ++data;
293 // TODO msg.orderRejectCode();
295 }
296 
297 template<>
298 template<> inline __stdcall
300 : Header_t() {
303  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
304  data+=msg.clientOrderID().size()-1;
307  ++data;
309  const int i=convert(msg.instrumentID(), rd, data, this->data_.size()-(data-this->data_.begin()));
310  assert(i>0);
311  data+=i;
313  *data=static_cast<char>(convert(msg.execType()));
314  ++data;
316  const int j=convert_MIT_price(msg.executedPrice(), data, this->data_.size()-(data-this->data_.begin()));
317  assert(j>0);
318  data+=j;
320  *data=static_cast<char>(convert(msg.orderStatus()));
321  ++data;
323  const int k=convert(msg.executedQty(), data, this->data_.size()-(data-this->data_.begin()));
324  assert(k>0);
325  data+=k;
327  const int l=convert(msg.leavesQty(), data, this->data_.size()-(data-this->data_.begin()));
328  assert(l>0);
329  data+=l;
331  *data=convert(msg.side());
332  ++data;
335 // TODO msg.orderRejectCode();
337 }
338 
339 template<>
340 template<> inline __stdcall
342 : Header_t() {
345  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
346  assert(i>0);
347  data+=i;
351 }
352 
353 template<>
354 template<> inline __stdcall
356 : Header_t() {
359  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
360  assert(i>0);
361  data+=i;
365 }
366 
367 template<>
368 template<> inline __stdcall
370 : Header_t() {
373  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
374  assert(i>0);
375  data+=i;
379 }
380 
381 template<>
382 template<> inline __stdcall
384 : Header_t() {
387  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
388  assert(i>0);
389  data+=i;
393 }
394 
395 template<>
396 template<> inline __stdcall
398 : Header_t() {
401  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
402  assert(i>0);
403  data+=i;
407 }
408 
409 template<>
410 template<> inline __stdcall
412 : Header_t() {
415  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
416  data+=msg.clientOrderID().size()-1;
418  libjmmcg::memcpy_opt(msg.orderID, reinterpret_cast<MIT::common::OrderID_t &>(*data));
419  data+=msg.orderID.size()-1;
422 // TODO cancelRejectReason_;
424 }
425 
426 template<>
427 template<> inline __stdcall
429 : Header_t() {
432  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
433  data+=msg.clientOrderID().size()-1;
435  libjmmcg::memcpy_opt(msg.orderID, reinterpret_cast<MIT::common::OrderID_t &>(*data));
436  data+=msg.orderID.size()-1;
439 // TODO cancelRejectReason_;
441 }
442 
443 template<>
444 template<> inline __stdcall
446 : Header_t() {
449  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
450  data+=msg.clientOrderID().size()-1;
452  libjmmcg::memcpy_opt(msg.orderID, reinterpret_cast<MIT::common::OrderID_t &>(*data));
453  data+=msg.orderID.size()-1;
456 // TODO cancelRejectReason_;
458 }
459 
460 template<>
461 template<> inline __stdcall
463 : Header_t() {
466  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
467  data+=msg.clientOrderID().size()-1;
469  libjmmcg::memcpy_opt(msg.orderID, reinterpret_cast<MIT::common::OrderID_t &>(*data));
470  data+=msg.orderID.size()-1;
473 // TODO cancelRejectReason_;
475 }
476 
477 template<>
478 template<> inline __stdcall
480 : Header_t() {
483  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
484  data+=msg.clientOrderID().size()-1;
486  libjmmcg::memcpy_opt(msg.orderID, reinterpret_cast<MIT::common::OrderID_t &>(*data));
487  data+=msg.orderID.size()-1;
490 // TODO cancelRejectReason_;
492 }
493 
494 template<>
495 template<> inline __stdcall
497 : Header_t() {
500  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
501  data+=msg.clientOrderID().size()-1;
504 // TODO
506 }
507 
508 template<>
509 template<> inline __stdcall
511 : Header_t() {
514  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
515  data+=msg.clientOrderID().size()-1;
518 // TODO
520 }
521 
522 template<>
523 template<> inline __stdcall
525 : Header_t() {
528  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
529  data+=msg.clientOrderID().size()-1;
532 // TODO
534 }
535 
536 template<>
537 template<> inline __stdcall
539 : Header_t() {
542  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
543  data+=msg.clientOrderID().size()-1;
546 // TODO
548 }
549 
550 template<>
551 template<> inline __stdcall
553 : Header_t() {
556  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
557  data+=msg.clientOrderID().size()-1;
560 // TODO
562 }
563 
564 template<>
565 template<> inline __stdcall
567 : Header_t() {
570  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
571  data+=msg.clientOrderID().size()-1;
573  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
574  assert(i>0);
575  data+=i;
578 // TODO
580 }
581 
582 template<>
583 template<> inline __stdcall
585 : Header_t() {
588  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
589  data+=msg.clientOrderID().size()-1;
591  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
592  assert(i>0);
593  data+=i;
596 // TODO
598 }
599 
600 template<>
601 template<> inline __stdcall
603 : Header_t() {
606  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
607  data+=msg.clientOrderID().size()-1;
609  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
610  assert(i>0);
611  data+=i;
614 // TODO
616 }
617 
618 template<>
619 template<> inline __stdcall
621 : Header_t() {
624  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
625  data+=msg.clientOrderID().size()-1;
627  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
628  assert(i>0);
629  data+=i;
632 // TODO
634 }
635 template<>
636 template<> inline __stdcall
638 : Header_t() {
641  libjmmcg::memcpy_opt(msg.clientOrderID(), reinterpret_cast<MIT::common::ClientOrderID_t &>(*data));
642  data+=msg.clientOrderID().size()-1;
644  const int i=convert(msg.sequenceNumber, data, this->data_.size()-(data-this->data_.begin()));
645  assert(i>0);
646  data+=i;
649 // TODO
651 }
652 
653 
654 } } } } }
655 
656 #endif