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.