void Application::updateOrder( const Order& order, char status ) { FIX::TargetCompID targetCompID( order.getOwner() ); FIX::SenderCompID senderCompID( order.getTarget() ); FIX42::ExecutionReport fixOrder ( FIX::OrderID ( order.getClientID() ), FIX::ExecID ( m_generator.genExecutionID() ), FIX::ExecTransType ( FIX::ExecTransType_NEW ), FIX::ExecType ( status ), FIX::OrdStatus ( status ), FIX::Symbol ( order.getSymbol() ), FIX::Side ( convert( order.getSide() ) ), FIX::LeavesQty ( order.getOpenQuantity() ), FIX::CumQty ( order.getExecutedQuantity() ), FIX::AvgPx ( order.getAvgExecutedPrice() ) ); fixOrder.set( FIX::ClOrdID( order.getClientID() ) ); fixOrder.set( FIX::OrderQty( order.getQuantity() ) ); if ( status == FIX::OrdStatus_FILLED || status == FIX::OrdStatus_PARTIALLY_FILLED ) { fixOrder.set( FIX::LastShares( order.getLastExecutedQuantity() ) ); fixOrder.set( FIX::LastPx( order.getLastExecutedPrice() ) ); } try { FIX::Session::sendToTarget( fixOrder, senderCompID, targetCompID ); } catch ( FIX::SessionNotFound& ) {}}
void Application::onMessage( const FIX42::NewOrderSingle& message, const FIX::SessionID& sessionID ) { FIX::Symbol symbol; FIX::Side side; FIX::OrdType ordType; FIX::OrderQty orderQty; FIX::Price price; FIX::ClOrdID clOrdID; FIX::Account account; message.get( ordType ); if ( ordType != FIX::OrdType_LIMIT ) throw FIX::IncorrectTagValue( ordType.getField() ); message.get( symbol ); message.get( side ); message.get( orderQty ); message.get( price ); message.get( clOrdID ); FIX42::ExecutionReport executionReport = FIX42::ExecutionReport ( FIX::OrderID( genOrderID() ), FIX::ExecID( genExecID() ), FIX::ExecTransType( FIX::ExecTransType_NEW ), FIX::ExecType( FIX::ExecType_FILL ), FIX::OrdStatus( FIX::OrdStatus_FILLED ), symbol, side, FIX::LeavesQty( 0 ), FIX::CumQty( orderQty ), FIX::AvgPx( price ) ); executionReport.set( clOrdID ); executionReport.set( orderQty ); executionReport.set( FIX::LastShares( orderQty ) ); executionReport.set( FIX::LastPx( price ) ); if( message.isSet(account) ) executionReport.setField( message.get(account) ); try { FIX::Session::sendToTarget( executionReport, sessionID ); } catch ( FIX::SessionNotFound& ) {} }
void Application::rejectOrder ( const FIX::SenderCompID& sender, const FIX::TargetCompID& target, const FIX::ClOrdID& clOrdID, const FIX::Symbol& symbol, const FIX::Side& side, const std::string& message ) { FIX::TargetCompID targetCompID( sender.getValue() ); FIX::SenderCompID senderCompID( target.getValue() ); FIX42::ExecutionReport fixOrder ( FIX::OrderID ( clOrdID.getValue() ), FIX::ExecID ( m_generator.genExecutionID() ), FIX::ExecTransType ( FIX::ExecTransType_NEW ), FIX::ExecType ( FIX::ExecType_REJECTED ), FIX::OrdStatus ( FIX::ExecType_REJECTED ), symbol, side, FIX::LeavesQty( 0 ), FIX::CumQty( 0 ), FIX::AvgPx( 0 ) ); fixOrder.set( clOrdID ); fixOrder.set( FIX::Text( message ) ); try { FIX::Session::sendToTarget( fixOrder, senderCompID, targetCompID ); } catch ( FIX::SessionNotFound& ) {}}