Basic Connection Example#
This example demonstrates a basic OUCH 5.0 session setup and message handling.
Overview#
The basic_connection.cpp example demonstrates:
Basic session configuration and connection
Attaching listeners using function object pattern
Sending Enter Order, Cancel Order, and Replace Order messages
Handling OrderAccepted, OrderExecuted, OrderCanceled responses
UserRefNum recovery via AccountQueryRequest
Message buffering and retransmission
UserRefNum persistence
Usage#
./Ouch5BasicConnection --host <host> --port <port> --username <user> --password <pass> [options]
Options#
--host <host>: OUCH server hostname or IP address (required)--port <port>: OUCH server port (required)--username <user>: Login username (required)--password <pass>: Login password (required)--session <id>: Session ID (optional, empty for new session)--symbol <sym>: Symbol to trade (default: “AAPL”)--side <side>: Order side - “Buy” or “Sell” (default: “Buy”)--quantity <qty>: Order quantity (default: 100)--price <price>: Order price (default: 150.0)--persistence-file <file>: UserRefNum persistence file path (optional)
Code Structure#
Session Setup#
// Create IO context
auto io_ctx = std::make_shared<IOContext>(IOContext::Settings{"main", 0, false});
io_ctx->start();
// Configure session
Settings settings;
settings.transport_.username_ = "TRADER01";
settings.transport_.password_ = "password123";
settings.transport_.remote_a_ = Endpoint{"host", port};
settings.initial_user_ref_num_ = 1;
// Create session
Session session(io_ctx, settings);
Handler Definition#
struct ConnectionHandler {
std::atomic<bool> order_accepted_{false};
std::atomic<bool> order_canceled_{false};
void operator()(Session* s, std::uint64_t seq, const OrderAccepted* msg) {
std::cout << "Order accepted: " << msg->get_user_ref_num() << std::endl;
order_accepted_ = true;
}
void operator()(Session* s, std::uint64_t seq, const OrderCanceled* msg) {
std::cout << "Order canceled: " << msg->get_user_ref_num() << std::endl;
order_canceled_ = true;
}
// ... other handlers ...
};
ConnectionHandler handler;
session.attach_listener(std::ref(handler));
Sending Orders#
// Generate UserRefNum
auto& refnum_gen = session.get_user_refnum_generator();
UInt32 user_ref_num = refnum_gen.next();
// Create Enter 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");
// Send order
session.send_message(&order);
UserRefNum Recovery#
// After login, send AccountQueryRequest
AccountQueryRequest query;
session.send_message(&query);
// In AccountQueryResponse handler:
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();
s->get_user_refnum_generator().reset(next_user_ref_num);
}
Complete Example#
See the full source code in nasdaq/ouch50/examples/basic_connection.cpp for the complete implementation.