Application needs to hook up to proper event handlers.
// Prerequisits: Variable "session" of type FIXSession. // All sessions can be enumerated from FIXEngine.Sessions FIXSessionOrderManager sessionOM = FIXOrderManager.GetSessionOrderManager(session); sessionOM.OrderCancelRequestAdded += new OrderMessageAddedEventHandler(sessionOM_OrderCancelRequestAdded); sessionOM.OrderReplaceRequestAdded += new OrderMessageAddedEventHandler(sessionOM_OrderReplaceRequestAdded);
In event handler, application can accept or reject the request or perform other required operations.
static void sessionOM_OrderReplaceRequestAdded(FIXOrder order, FIXMessage message, FIXEngineMessageHandlerStatus status) { if (order is FIXRegularOrder) { FIXRegularOrder singleOrder = order as FIXRegularOrder; // Make sure the session handler status is "Normal". It could be "Recovery", in which case no execution should be sent back. if (status == FIXEngineMessageHandlerStatus.Normal) { // Developer can implement their own way of generating "OrderID" string orderID = GenerateOrderID(message); // Example: Accept the request by sending back a "PendingCancel" execution. { FIXMessage execMsg = singleOrder.CreateNewExecutionPendingReplace(message); // Developer can implement their own way of generating "ExecID" string execID = GenerateExecID(message); execMsg.SetValue(Tags.OrderID, orderID); execMsg.SetValue(Tags.ExecID, execID); FIXMessageComponent lastExec = singleOrder.LastExecution; if (lastExec != null) { execMsg.SetValue(Tags.CumQty, lastExec.GetFloatValue(Tags.CumQty)); execMsg.SetValue(Tags.LeavesQty, lastExec.GetFloatValue(Tags.LeavesQty)); execMsg.SetValue(Tags.AvgPx, lastExec.GetFloatValue(Tags.AvgPx)); } else { FIXMessageComponent curOrder = singleOrder.CurrentOrder; execMsg.SetValue(Tags.CumQty, 0); execMsg.SetValue(Tags.LeavesQty, curOrder.GetFloatValue(Tags.OrderQty)); execMsg.SetValue(Tags.AvgPx, 0); } singleOrder.AddExecution(execMsg); } // Another example: Reject the request by sending back "OrderCancelReject" { FIXMessage cxlRej = singleOrder.CreateOrderCancelReject(message, singleOrder.OrdStatus, ValidValues.CxlRejReason.AlreadyPendingCxl, null); cxlRej.SetValue(Tags.OrderID, orderID); singleOrder.AddCancelReject(cxlRej); } // TODO: Implement your own business logic ... } } } static void sessionOM_OrderCancelRequestAdded(FIXOrder order, FIXMessage message, FIXEngineMessageHandlerStatus status) { // TODO: Implement your own business logic ... }
This example works with FIX versions from 4.1 to 5.0+.