To receive specific solicited order / fill events, you need to:
- Create a class that is derived from ttsdk::IOrderEventHandler and provide implementations for the following methods.
- virtual void OnExecutionReport(OrderPtr order, ExecutionReportPtr execRpt) = 0;
- Callback fired when delivering execution report messages
- virtual void OnReject(OrderPtr order, RejectResponsePtr rejResp) = 0;
- Callback fired when delivering order reject messages
- virtual void OnSendFailed(OrderPtr order, const OrderProfile& profile, const SendCode code) = 0;
- Callback fired when a request delivery surpasses the timeout threshold
- virtual void OnUnsubscribed(const char* orderId) = 0;
- Callback fired when the unsubscribe request is complete and it is safe to destroy the handler object
- virtual void OnExecutionReport(OrderPtr order, ExecutionReportPtr execRpt) = 0;
- Call the Subscribe() method of the OrderPtr instance passing an instance of the class that defines your ttsdk::IOrderEventHandler event handler.
- This is discussed further in the Submitting Orders section.
A sample implementation of class derived from ttsdk::IOrderEventHandler is demonstrated in the following code snippet.
class OrderObserver : public ttsdk::IOrderEventHandler
{
public:
OrderObserver() {}
virtual void OnExecutionReport(ttsdk::OrderPtr order,
ttsdk::ExecutionReportPtr execRpt) override
{
switch(execRpt->GetExecType())
{
case ttsdk::ExecType::New :
std::cout << "Order successfully entered in market. RequestId="
<< execRpt->GetRequestId()
<< " OrderStatus="
<< ttsdk::ToString(execRpt->GetOrderStatus()) << std::endl;
break;
case ttsdk::ExecType::Canceled :
std::cout << "Order successfully cancelled. RequestId="
<< execRpt->GetRequestId()
<< " OrderStatus="
<< ttsdk::ToString(execRpt->GetOrderStatus())
<< " [external=" << execRpt->IsExternalAction()
<< "]" << std::endl;
break;
case ttsdk::ExecType::Replaced :
std::cout << "Order replaced. RequestId="
<< execRpt->GetRequestId()
<< " TTOrderId=" << order->GetOrderId()
<< " OrderStatus="
<< ttsdk::ToString(execRpt->GetOrderStatus())
<< " [external=" << execRpt->IsExternalAction()
<< "]" << std::endl;
break;
case ttsdk::ExecType::Trade :
std::cout << "Order filled. RequestId="
<< execRpt->GetRequestId()
<< " TTOrderId=" << order->GetOrderId()
<< " OrderStatus="
<< ttsdk::ToString(execRpt->GetOrderStatus()) << std::endl;
break;
case ttsdk::ExecType::Rejected :
std::cout << "Order filled. RequestId=" << execRpt->GetRequestId()
<< " TTOrderId=" << order->GetOrderId()
<< " OrderStatus="
<< ttsdk::ToString(execRpt->GetOrderStatus()) << std::endl;
break;
default:
std::cout << "Unhandled event. RequestId="
<< execRpt->GetRequestId() << " TTOrderId="
<< order->GetOrderId() << " OrderStatus="
<< ttsdk::ToString(execRpt->GetOrderStatus())
<< " ExecutionType="
<< ttsdk::ToString(execRpt->GetExecType()) << std::endl;
}
}
virtual void OnReject(ttsdk::OrderPtr order, ttsdk::RejectResponsePtr rejResp) override
{
std::cout << "OnReject event. RequestId=" << rejResp->GetRequestId()
<< " TTOrderId=" << order->GetOrderId() << " RejectReason="
<< ttsdk::ToString(rejResp->GetRejectReason())
<< " Text=" << rejResp->GetText() << std::endl;
order_.reset();
}
virtual void OnSendFailed(ttsdk::OrderPtr order, const ttsdk::OrderProfile& profile,
const ttsdk::IOrderEventHandler::SendCode code) override
{
std::cout << "Order send failed. RequestId=" << profile.request_id
<< " TTOrderId=" << order->GetOrderId() << " SendCode="
<< (int)code << std::endl;
}
virtual void OnUnsubscribed(const char* orderId) override
{
std::cout << "Order observer for orderId=" << orderId
<< " has been successfully unsubscribed." << std::endl;
}
};