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 Strategy::printExecutionReport( const FIX42::ExecutionReport ereport ) { FIX::OrderID orderID; FIX::ExecID execID; FIX::ExecTransType execTransType; FIX::ExecType execType; FIX::OrdStatus ordStatus; FIX::Symbol symbol; FIX::Side side; FIX::LeavesQty leavesQty; FIX::CumQty cumQty; FIX::AvgPx avgPx; ereport.get(orderID); ereport.get(execID); ereport.get(execTransType); ereport.get(execType); ereport.get(ordStatus); ereport.get(symbol); ereport.get(side); ereport.get(leavesQty); ereport.get(cumQty); ereport.get(avgPx); std::cout<< "[EXECUTION REPORT] symbol:" << symbol << "\tSide:" << ( side == FIX::Side_SELL ? "SELL" : "BUY" ) << "\tLeavesQty:" << leavesQty << "\tCumQty:" << cumQty << "\tAvgPx:"<< std::fixed << std::setprecision(2) << (double)avgPx << std::endl; }
void Application::onMessage ( const FIX42::ExecutionReport& message, const FIX::SessionID& ) { FIX::OrdStatus status; message.get(status); switch(status){ case (FIX::OrdStatus_NEW): getConfirmationTrade=true; break; case (FIX::OrdStatus_PARTIALLY_FILLED): getConfirmationPartialExecutionTrade =true; this->strategy.postTrade(message); break; case (FIX::OrdStatus_FILLED): getConfirmationExecutionTrade =true; this->strategy.postTrade(message); break; case (FIX::OrdStatus_CANCELED): getConfirmationCanceledTrade=true; break; default: break; } }
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& ) {}}
void Strategy::postTrade(FIX42::ExecutionReport ereport){ std::cout << "Strategy::PostTrade"<<std::endl; //this->printExecutionReport(ereport); FIX::LastShares lastShares; FIX::LastPx lastPx; FIX::Side side; ereport.get(lastShares); ereport.get(lastPx); ereport.get(side); this->numberStock += ( side == FIX::Side_SELL ? -lastShares : +lastShares ); this->cash += ( side == FIX::Side_SELL ? +lastShares*lastPx : -lastShares*lastPx ); FIX::TransactTime now; this->agentControl.setPortfolio(now.getString(),this->cash, this->numberStock, 0.0); //if(this->cash <= 0.0 && this->numberStock <= 0.0) // exit(1); }
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& ) {} }