OnixS C++ CME MDP Premium Market Data Handler 5.11.1
Users' manual and API documentation
Loading...
Searching...
No Matches
IncrementalRefreshTradeSummary.h
Go to the documentation of this file.
1// Copyright Onix Solutions Limited [OnixS]. All rights reserved.
2//
3// This software owned by Onix Solutions Limited [OnixS] and is protected by copyright law
4// and international copyright treaties.
5//
6// Access to and use of the software is governed by the terms of the applicable OnixS Software
7// Services Agreement (the Agreement) and Customer end user license agreements granting
8// a non-assignable, non-transferable and non-exclusive license to use the software
9// for it's own data processing purposes under the terms defined in the Agreement.
10//
11// Except as otherwise granted within the terms of the Agreement, copying or reproduction of any part
12// of this source code or associated reference material to any other location for further reproduction
13// or redistribution, and any amendments to this copyright notice, are expressly prohibited.
14//
15// Any reproduction or redistribution for sale or hiring of the Software not in accordance with
16// the terms of the Agreement is a violation of copyright law.
17//
18
19#pragma once
20
21#include <type_traits>
22#include <utility>
23
24#include <OnixS/CME/MDH/ABI.h>
27#include <OnixS/CME/MDH/Order.h>
31#include <OnixS/CME/MDH/Watch.h>
32
34
37
39namespace details
40{
41 template <typename Holder>
43
45 enum class IncrementalRefreshTradeSummaryInitializationTag {};
47
48 template <Messaging::UpdateAction::Enum Action>
49 struct IsTradeSummaryAction : std::integral_constant<bool,
50 Action == Messaging::UpdateAction::New ||
51 Action == Messaging::UpdateAction::Change ||
52 Action == Messaging::UpdateAction::Delete>
53 {};
54
55 template <Messaging::UpdateAction::Enum Action, typename Holder>
56 using EnableTradeSummaryEntry = typename std::enable_if<
58
59 template <Messaging::UpdateAction::Enum Action, typename Holder>
61 Holder& message, SecurityId securityId, Messaging::UInt32 rptSeq, Messaging::Decimal9 price,
62 Messaging::Int32 quantity, Messaging::Int32 numberOfOrders)
63 {
64 auto entry = appendGroupEntry(message->entries(), [&message](
65 typename decltype(message->entries())::Size size) { return message->entries(size); });
66
67 entry.setUpdateAction(Action);
68 entry.setSecurityId(securityId);
69 entry.setRptSeq(rptSeq);
70 entry.setEntryPx(price);
71 entry.setEntrySize(quantity);
72 entry.setNumberOfOrders(numberOfOrders);
73 entry.tradeEntryIdNull();
74 entry.aggressorSideNull();
75
76 return entry;
77 }
78
79 template <typename Holder>
81 Holder& message, OrderId orderId, Messaging::Int32 lastQuantity)
82 {
83 auto entry = appendGroupEntry(message->orderIdEntries(), [&message](
84 typename decltype(message->orderIdEntries())::Size size) { return message->orderIdEntries(size); });
85
86 entry.setOrderId(orderId);
87 entry.setLastQty(lastQuantity);
88
89 return entry;
90 }
91}
92
99template <typename Holder, details::IncrementalRefreshTradeSummaryInitializationTag...>
100auto initialize(Holder& message, EventFlags::Bits eventIndicator, Messaging::Timestamp transactTime = UtcWatch::now()) noexcept
101 -> details::EnableIncrementalRefreshTradeSummary<Holder>
102{
103 return details::initializeMessage<IncrementalRefreshTradeSummary>(message, eventIndicator, transactTime);
104}
105
111template <typename Holder, details::IncrementalRefreshTradeSummaryInitializationTag...>
113auto initialize(EventFlags::Bits eventIndicator, Messaging::Timestamp transactTime = UtcWatch::now()) -> decltype(
115{
117}
118
130template <Messaging::UpdateAction::Enum Action, typename Holder>
131auto addEntry(
132 Holder& message, SecurityId securityId, Messaging::UInt32 rptSeq, Messaging::Decimal9 price,
133 Messaging::Int32 quantity, Messaging::Int32 numberOfOrders)
135{
137 message, securityId, rptSeq, price, quantity, numberOfOrders);
138
139 return message;
140}
141
149template <typename Holder>
150auto addOrderIdEntry(Holder& message, OrderId orderId, Messaging::Int32 lastQuantity)
152{
153 details::appendOrderIdEntry(message, orderId, lastQuantity);
154 return message;
155}
156
158namespace details
159{
160 template <Messaging::UpdateAction::Enum Action>
162 {
163 template <typename Holder, typename... Arguments>
164 static auto apply(Holder& message, Arguments&&... arguments) -> decltype(
165 addEntry<Action>(message, std::forward<Arguments>(arguments)...),
166 appendTradeSummaryEntry<Action>(message, std::forward<Arguments>(arguments)...))
167 {
168 return appendTradeSummaryEntry<Action>(message, std::forward<Arguments>(arguments)...);
169 }
170 };
171
173 {
174 template <typename Holder, typename... Arguments>
175 static auto apply(Holder& message, Arguments&&... arguments) -> decltype(
176 addOrderIdEntry(message, std::forward<Arguments>(arguments)...),
177 appendOrderIdEntry(message, std::forward<Arguments>(arguments)...))
178 {
179 return appendOrderIdEntry(message, std::forward<Arguments>(arguments)...);
180 }
181 };
182
183 template <>
185 {
186 template <Messaging::UpdateAction::Enum Action, typename Holder, typename... Arguments>
187 static auto apply(Holder& message, Arguments&&... arguments) -> typename std::enable_if<
190 message, std::forward<Arguments>(arguments)...))>::type
191 {
193 message, std::forward<Arguments>(arguments)...);
194 }
195 };
196}
197
203inline auto tradeEntry(OrderId orderId, Messaging::Int32 lastQuantity) -> decltype(
205{
207}
208
210
230#define ONIXS_CMEMDH_TRADE_ENTRY(...) \
231 ONIXS_CME_MDH_TESTING_NAMESPACE::details::deferMessageOperation([&]() { \
232 return ONIXS_CME_MDH_TESTING_NAMESPACE::tradeEntry(__VA_ARGS__); \
233 })
#define ONIXS_CME_MDH_TESTING_NAMESPACE_END
Definition Bootstrap.h:84
#define ONIXS_CME_MDH_TESTING_NAMESPACE_BEGIN
Definition Bootstrap.h:83
#define ONIXS_CMEMDH_NODISCARD
Definition Compiler.h:165
The time point without the time-zone information.
Definition Time.h:450
Owns fixed-capacity storage for a prefixed CME message.
static Messaging::Timestamp now() noexcept
Returns current UTC time.
Definition Watch.h:66
FixedPointDecimal< Int64, IntegralConstant< Int8, -9 > > Decimal9
Decimal with constant exponent -9.
Definition Composites.h:37
std::uint32_t UInt32
uInt32.
Definition Integral.h:35
std::int32_t Int32
int32.
Definition Integral.h:34
EnableMutableMessageHolder< IncrementalRefreshTradeSummary, Holder > EnableIncrementalRefreshTradeSummary
auto makeInitializationRecipe(Arguments &&... arguments) -> typename std::enable_if< IsMutableMessageHolder< ExpectedHolder, Holder >::value, decltype(makeMessageRecipe< typename std::decay< Holder >::type >(makeMessageOperation< Operation >(std::forward< Arguments >(arguments)...)))>::type
typename std::enable_if< IsMutableMessageHolder< ExpectedHolder, Holder >::value, Holder & >::type EnableMutableMessageHolder
Messaging::IncrementalRefreshBook46::OrderIDEntry appendOrderIdEntry(Holder &message, OrderId orderId, OrderPriority orderPriority, DisplayQuantity quantity, Messaging::UInt8 referenceId)
MessageOperation< Operation, typename std::decay< Arguments >::type... > makeMessageOperation(Arguments &&... arguments)
auto initializeMessage(Holder &message, EventFlags::Bits eventIndicator, Messaging::Timestamp transactTime) noexcept -> EnableMutableMessageHolder< ExpectedHolder, Holder >
Messaging::IncrementalRefreshTradeSummary48::Entry appendTradeSummaryEntry(Holder &message, SecurityId securityId, Messaging::UInt32 rptSeq, Messaging::Decimal9 price, Messaging::Int32 quantity, Messaging::Int32 numberOfOrders)
typename std::enable_if< IsTradeSummaryAction< Action >::value, EnableIncrementalRefreshTradeSummary< Holder > >::type EnableTradeSummaryEntry
Group::Entry appendGroupEntry(Group group, Resize resize)
auto tradeEntry(OrderId orderId, Messaging::Int32 lastQuantity) -> decltype(details::makeMessageOperation< details::TradeEntryOperation >(orderId, lastQuantity))
Creates a pipeline operation that appends an order-level fill entry.
MessageHolder< Messaging::IncrementalRefreshTradeSummary48 > IncrementalRefreshTradeSummary
Owns storage for an incremental trade-summary refresh test message.
SecurityId securityId(const Messaging::FIX::MultiContainer &message)
Definition Accessors.h:43
Messaging::Int32 SecurityId
Identifies a security in CME MDP 3.0 market data.
Definition Domain.h:31
Messaging::UInt64 OrderId
Identifies an order in a Market By Order book.
Definition Order.h:32
Messaging::MatchEventIndicator::Bits Bits
Protocol storage type for combined event flags.
Definition EventFlags.h:30
static auto apply(Holder &message, Arguments &&... arguments) -> typename std::enable_if< IsTradeSummaryAction< Action >::value, decltype(TradeSummaryEntryOperation< Action >::apply(message, std::forward< Arguments >(arguments)...))>::type
static auto apply(Holder &message, Arguments &&... arguments) -> decltype(addOrderIdEntry(message, std::forward< Arguments >(arguments)...), appendOrderIdEntry(message, std::forward< Arguments >(arguments)...))
static auto apply(Holder &message, Arguments &&... arguments) -> decltype(addEntry< Action >(message, std::forward< Arguments >(arguments)...), appendTradeSummaryEntry< Action >(message, std::forward< Arguments >(arguments)...))