public void OnMessage(QuickFix.FIX42.NewOrderSingle msg, QuickFix.SessionID session)
        {
            try
            {
                OrderFixBridge r;
                lock (locker_)
                    r = m_orders.AddOrGet(null, msg.ClOrdID.getValue(), session);

                if (r.Order != null)
                {
                    RejectNew(session, msg.Symbol.getValue(), msg.ClOrdID.getValue(), Convert.ToInt32(msg.OrderQty.getValue()), Converter.c(msg.Side), "ClOrdID '" + msg.ClOrdID + "'already exists !");
                    return;
                }

                QuickFixStaticAcceptor.FromFIX_SendOrder(
                    r,
                    msg.Symbol.getValue(),
                    Converter.c(msg.Side),
                    Converter.c(msg.OrdType),
                    msg.IsSetOrderQty() ? Convert.ToInt32(msg.OrderQty.getValue()) : 0,
                    msg.IsSetPrice() ? Convert.ToDouble(msg.Price.getValue()) : 0,
                    msg.IsSetStopPx() ? Convert.ToDouble(msg.StopPx.getValue()) : 0,
                    msg.IsSetText() ? msg.Text.getValue() : string.Empty
                    );

                if (r.Order == null)
                {
                    RejectNew(session, msg.Symbol.getValue(), msg.ClOrdID.getValue(), Convert.ToInt32(msg.OrderQty.getValue()), Converter.c(msg.Side), "NinjaTrader7 returned null on creating order (internal error)");
                    return;
                }
            }
            catch (Exception e)
            {
                RejectNew(session, msg.Symbol.getValue(), msg.ClOrdID.getValue(), Convert.ToInt32(msg.OrderQty.getValue()), Converter.c(msg.Side), e.Message);
            }
        }
        protected void ProcessOrderCancelRequest(QuickFix.SessionID session, QuickFix.Fields.ClOrdID clordid, QuickFix.Fields.OrigClOrdID origordid
                                                 , bool is_cancelreplace_request, int new_qty, double new_px, double new_stop_px)
        {
            IOrder order = null;

            try
            {
                // order exists ?
                OrderFixBridge order_bridge;
                lock (locker_)
                    order_bridge = m_orders.AddOrGet(null, origordid.getValue(), session);

                if (order_bridge.Order == null)
                {
                    RejectCancelRequest(session, clordid, origordid, null, "Unknown order !", QuickFix.Fields.CxlRejReason.UNKNOWN_ORDER, true);
                    return;
                }

                order = order_bridge.Order;

                switch (order.OrderState)
                {
                // order is still alive, go ahead
                case OrderState.Accepted:
                case OrderState.PartFilled:
                case OrderState.Working:
                    if (is_cancelreplace_request)
                    {
                        QuickFixStaticAcceptor.FromFIX_ChangeOrder(order, new_qty, new_px, new_stop_px);
                    }
                    else
                    {
                        QuickFixStaticAcceptor.FromFIX_CancelOrder(order);
                    }

                    return;

                // pending
                case OrderState.PendingChange:     //VV?
                case OrderState.PendingSubmit:     //VV?
                case OrderState.PendingCancel:     //VV?
                {
                    string error_message = "Invalid cancel or cancel/replace request since order " + origordid.getValue() + " is in pending state : " + order.OrderState.ToString();
                    RejectCancelRequest(session, clordid, origordid, order, error_message, QuickFix.Fields.CxlRejReason.ALREADY_PENDING, is_cancelreplace_request);
                    return;
                }

                // terminal state
                case OrderState.Cancelled:
                case OrderState.Filled:
                case OrderState.Rejected:
                {
                    string error_message = "Invalid cancel or cancel/replace request since order " + origordid.getValue() + " is in terminal/closed state : " + order.OrderState.ToString();
                    RejectCancelRequest(session, clordid, origordid, order, error_message, QuickFix.Fields.CxlRejReason.TOO_LATE_TO_CANCEL, is_cancelreplace_request);
                    return;
                }

                case OrderState.Unknown:
                {
                    string error_message = "Invalid cancel or cancel/replace request since order " + origordid.getValue() + " is in unknow NT7 state : " + order.OrderState.ToString();
                    RejectCancelRequest(session, clordid, origordid, order, error_message, QuickFix.Fields.CxlRejReason.OTHER, is_cancelreplace_request);
                    return;
                }
                }
            }
            catch (Exception e)
            {
                RejectCancelRequest(session, clordid, origordid, order, "ProcessOrderCancelRequest : internal Error : " + e.ToString()
                                    , QuickFix.Fields.CxlRejReason.OTHER, is_cancelreplace_request);
            }
        }