Handle New Order

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

Create and add a FIXSessionOrderManagerCommonListener in FIXStandaloneApplicationListener.engineInitialized event handler.

    // Prerequisites: Variable "session" of type FIXSession.
    FIXSessionOrderManager sessionOM = FIXOrderManager.getSessionOrderManager(session);
    // Create an order cancel reject event handler
    // See FIXSessionOrderManagerCommonListener.orderCancelRejectAdded for more details.
    sessionOM.addCommonListener(listener);

The code snippet below demonstrates how to generate an order acknowledgment by send back an execution report with OrderStatus=New.

  public void 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 instanceof 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 = (FIXRegularOrder)order;
                FIXMessage orderMessage = singleOrder.getCurrentOrderMessage();
                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+.