Handle Order Modification (Cancel or Cancel/Replace)

Application needs to hook up to proper event handlers.

CopyHandle Order Modification (Cancel or Cancel/Replace)
// 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.

CopyHandle Order Modification (Cancel or Cancel/Replace)
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+.