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 value

  • Setters: 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) - Calls set_field_name(value) and returns *this for 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.