Handle New Order

Event handlers of new order messages can be specified by session.

CopyHandle New Order
// Prerequisits: Variable "session" of type FIXSession.
// All sessions can be enumerated from FIXEngine.Sessions
FIXSessionOrderManager sessionOM = FIXOrderManager.GetSessionOrderManager(session);
sessionOM.OrderAdded += new OrderEventHandler(sessionOM_OrderAdded);

In event handler, application can send back execution reports and perform other required operations. The code snippet below demonstrates how to generate an order acknowledgment by send back an execution report with OrderStatus=New.

CopyHandle New Order
static String GenerateOrderID(FIXMessage message)
{
    return null;
}

static String GenerateExecID(FIXMessage message)
{
    return null;
}

static void sessionOM_OrderAdded(FIXOrder order, FIXEngineMessageHandlerStatus status)
{
    // Example, automatically send back the order acknowledgment (execution report with order status="New")
    // Note: This is just an example. In reality application may even choose to send back "Reject", depending on the business logic.
    if (order is 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)
        {
            // This example works with FIX versions from 4.1 to 5.0+.
            // It is a perfect example for version independent order management.
            FIXRegularOrder singleOrder = order as FIXRegularOrder;
            FIXMessage orderMessage = singleOrder.CurrentOrderMessage;
            FIXMessage execNew = singleOrder.CreateNewExecutionNew();
            // Note: Application may choose its own method to generate "OrderID" and "ExecID"
            string orderID = GenerateOrderID(orderMessage);
            string execID = GenerateExecID(orderMessage);
            execNew.SetValue(Tags.OrderID, orderID);
            execNew.SetValue(Tags.ExecID, execID);
            execNew.SetValue(Tags.CumQty, 0.0);
            execNew.SetValue(Tags.AvgPx, 0.0);
            // In this example, since it's just an acknowledgment execution, "LeavesQty" 
            // should be equal to "OrderQty" because there is no fill yet.
            execNew.SetValue(Tags.LeavesQty, orderMessage.GetFloatValue(Tags.OrderQty));
            singleOrder.AddExecution(execNew);
        }
        // TODO: Your own custom business logic code.
    }
}

This example works with FIX versions from 4.1 to 5.0+.