Message Types#
All OUCH 5.0 message types are strongly-typed and provide type-safe accessors.
Message Wrappers#
Ingress messages (Exchange → Client, i.e., messages received by your application) transport framing is handled internally using SequencedMessage, and listener callbacks expose typed OUCH message pointers (e.g. const OrderAccepted*).
Egress messages (Client → Exchange, i.e., messages sent from your application) are generated as ready-to-send wire types (they include SoupBinTCP UnsequencedData framing), so users do not write UnsequencedMessage<...> boilerplate.
Note on Terminology: This documentation uses client-perspective terms. See Terminology Glossary for mapping to official OUCH 5.0 terminology.
Ingress Messages (Exchange → Client) - SequencedMessage (internal)#
Used internally for receiving messages from the exchange (handled automatically by listeners):
void on_order_accepted(Session* s, std::uint64_t seq, const OrderAccepted* msg) {
// msg is a SequencedMessage<OrderAccepted>
UInt32 user_ref_num = msg->get_user_ref_num();
}
Egress Messages (Client → Exchange)#
These messages are sent from your client to the exchange:
EnterOrder (Type O)#
Create a new order:
EnterOrder order;
order.set_user_ref_num(user_ref_num);
order.set_side(Side::Buy);
order.set_quantity(1000);
order.set_symbol("AAPL");
order.set_price(Price::from_double(150.50));
order.set_time_in_force(TimeInForce::Day);
order.set_display(DisplayFlag::Visible);
order.set_capacity(Capacity::Agency);
order.set_intermarket_sweep_elig('N');
order.set_cross_type(CrossType::None);
order.set_cl_ord_id("ORD001");
session.send_message(&order);
ReplaceOrderRequest (Type U)#
Replace an existing order:
ReplaceOrderRequest replace;
replace.set_orig_user_ref_num(orig_user_ref_num);
replace.set_user_ref_num(new_user_ref_num); // Must be strictly increasing
replace.set_quantity(2000);
replace.set_price(Price::from_double(150.75));
// ... set other fields ...
session.send_message(&replace);
CancelOrderRequest (Type X)#
Cancel an order:
CancelOrderRequest cancel;
cancel.set_user_ref_num(user_ref_num);
cancel.set_quantity(0); // 0 = cancel all, >0 = partial cancel
session.send_message(&cancel);
ModifyOrderRequest (Type M)#
Modify order attributes:
ModifyOrderRequest modify;
modify.set_user_ref_num(user_ref_num);
// ... set fields to modify ...
session.send_message(&modify);
MassCancelRequest (Type C)#
Cancel multiple orders:
MassCancelRequest mass_cancel;
mass_cancel.set_user_ref_num(user_ref_num);
mass_cancel.set_cancel_type(CancelType::AllOrders);
// ... set other fields ...
session.send_message(&mass_cancel);
AccountQueryRequest (Type Q)#
Query account information:
AccountQueryRequest query;
session.send_message(&query);
Ingress Messages (Exchange → Client)#
These messages are received from the exchange:
OrderAccepted (Type A)#
Acknowledges receipt and acceptance of an Enter Order:
void on_order_accepted(Session* s, std::uint64_t seq, const OrderAccepted* msg) {
UInt32 user_ref_num = msg->get_user_ref_num();
std::string_view symbol = msg->get_symbol();
OrderState state = msg->get_order_state();
// ...
}
OrderReplaced (Type R)#
Acknowledges a successful Replace Order request:
void on_order_replaced(Session* s, std::uint64_t seq, const OrderReplaced* msg) {
UInt32 orig_user_ref_num = msg->get_orig_user_ref_num();
UInt32 user_ref_num = msg->get_user_ref_num();
// ...
}
OrderCanceled (Type C)#
Acknowledges a successful Cancel Order request:
void on_order_canceled(Session* s, std::uint64_t seq, const OrderCanceled* msg) {
UInt32 user_ref_num = msg->get_user_ref_num();
UInt32 canceled_quantity = msg->get_canceled_quantity();
// ...
}
OrderExecuted (Type E)#
Reports an order execution:
void on_order_executed(Session* s, std::uint64_t seq, const OrderExecuted* msg) {
UInt32 user_ref_num = msg->get_user_ref_num();
UInt32 executed_quantity = msg->get_executed_quantity();
Price execution_price = msg->get_execution_price();
// ...
}
BrokenTrade (Type B)#
Reports a broken trade:
void on_broken_trade(Session* s, std::uint64_t seq, const BrokenTrade* msg) {
UInt32 user_ref_num = msg->get_user_ref_num();
// ...
}
Rejected (Type J)#
Reports a rejected order:
void on_rejected(Session* s, std::uint64_t seq, const Rejected* msg) {
UInt32 user_ref_num = msg->get_user_ref_num();
RejectReason reason = msg->get_reason();
// ...
}
CancelReject (Type I)#
Reports a rejected cancel request:
void on_cancel_reject(Session* s, std::uint64_t seq, const CancelReject* msg) {
UInt32 user_ref_num = msg->get_user_ref_num();
// ...
}
AccountQueryResponse (Type Q)#
Response to AccountQueryRequest:
void on_account_query_response(Session* s, std::uint64_t seq, const AccountQueryResponse* msg) {
UInt32 next_user_ref_num = msg->get_next_user_ref_num();
// Recover UserRefNum after reconnection
s->get_user_refnum_generator().reset(next_user_ref_num);
}
SystemEvent (Type S)#
System events (Start of Day, End of Day):
void on_system_event(Session* s, std::uint64_t seq, const SystemEvent* msg) {
EventCode code = msg->get_event_code();
if (code == EventCode::StartOfDay) {
// Trading day started
} else if (code == EventCode::EndOfDay) {
// Trading day ended
}
}
Message Accessors#
All messages provide type-safe accessors following the pattern:
Getters:
get_field_name()- Returns the field valueSetters:
set_field_name(value)- Sets the field value
Fluent with_*() Helpers#
For convenience, all message fields also have fluent helpers:
Fluent setters:
with_field_name(value)- Callsset_field_name(value)and returns*thisfor chaining
Example:
EnterOrder order;
order
.with_user_ref_num(user_ref_num)
.with_side(Side::Buy)
.with_quantity(1000)
.with_symbol("AAPL")
.with_price_raw(1505000)
.with_time_in_force(TimeInForce::Day)
.with_display(DisplayFlag::Visible)
.with_capacity(Capacity::Agency)
.with_intermarket_sweep_elig('N')
.with_cross_type(CrossType::None)
.with_cl_ord_id("ORD001");
Example:
// Getting values
UInt32 user_ref_num = msg->get_user_ref_num();
std::string_view symbol = msg->get_symbol();
Price price = msg->get_price();
// Setting values
order.set_user_ref_num(user_ref_num);
order.set_symbol("AAPL");
order.set_price(Price::from_double(150.50));
TagValue Appendages#
Many messages support optional fields via TagValue appendages. See TagValue Appendages for details.