void Application::onMessage( const FIX42::NewOrderSingle& message, const FIX::SessionID& ) { FIX::SenderCompID senderCompID; FIX::TargetCompID targetCompID; FIX::ClOrdID clOrdID; FIX::Symbol symbol; FIX::Side side; FIX::OrdType ordType; FIX::Price price; FIX::OrderQty orderQty; FIX::TimeInForce timeInForce( FIX::TimeInForce_DAY ); message.getHeader().get( senderCompID ); message.getHeader().get( targetCompID ); message.get( clOrdID ); message.get( symbol ); message.get( side ); message.get( ordType ); if ( ordType == FIX::OrdType_LIMIT ) message.get( price ); message.get( orderQty ); if ( message.isSetField( timeInForce ) ) message.get( timeInForce ); try { if ( timeInForce != FIX::TimeInForce_DAY ) throw std::logic_error( "Unsupported TIF, use Day" ); Order order( clOrdID, symbol, senderCompID, targetCompID, convert( side ), convert( ordType ), price, (long)orderQty ); processOrder( order ); } catch ( std::exception & e ) { rejectOrder( senderCompID, targetCompID, clOrdID, symbol, side, e.what() ); } }
void NewOrderRequestMessage::process(OrderBook& orderBook) const { LOG4CXX_INFO(logger_, "Handing new order request"); FIX::SenderCompID senderCompId; fixMsg_.getHeader().get(senderCompId); FIX::TargetCompID targetCompId; fixMsg_.getHeader().get(targetCompId); FIX::ClOrdID clOrdId; fixMsg_.get(clOrdId); FIX::Symbol symbol; fixMsg_.get(symbol); FIX::Side side; fixMsg_.get(side); FIX::OrdType orderType; fixMsg_.get(orderType); FIX::Price price; if (orderType == FIX::OrdType_LIMIT) fixMsg_.get(price); FIX::OrderQty orderQty; fixMsg_.get(orderQty); FIX::TimeInForce timeInForce(FIX::TimeInForce_DAY); if(fixMsg_.isSetField(timeInForce)) fixMsg_.get(timeInForce); // let's do our validations here if(!exchange_->getOrderBookManager()->symbolExists(symbol.getString())) { LOG4CXX_INFO(logger_, "Symbol " << symbol.getString() << " not found. Rejecting this order."); reject("Security not found"); return; } shared_ptr<Order> order(new Order( exchange_->getIdGenerator()->nextOrderId(), clOrdId.getValue(), senderCompId.getValue(), symbol.getValue(), FixTypeConverter::convert(side), (long)orderQty, price.getValue(), FixTypeConverter::convert(orderType), FixTypeConverter::convert(timeInForce))); // order is accepted, send order confirmation LOG4CXX_INFO(logger_, "New order accepted"); exchange_->getFixEngine()->getFixMessageHandler()->sendOrderResponse(order, Order::ORDER_STATUS_NEW); // now match the order orderBook.match(order); if(order->isOpen()) { // order is not completely filled. let's add it to the order book orderBook.add(order); } }