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); } }