private string ValidateOrder(ModifyCancelOrder modify, SingleOrder order) { if (modify.ClientKey == Guid.Empty || modify.ClientKey == null) { return("Invalid ClientKey"); } string username = Sessions.GetUsername(modify.ClientKey); if (!Sessions.IsSubscribedToSendMsg(username)) { return("Client not subscribed"); } Dictionary <string, object> optionalParam = modify.OptionalParam; if (optionalParam != null) { bool aon = false; if (optionalParam.ContainsKey("AON") && (optionalParam["AON"] == null || !bool.TryParse(optionalParam["AON"].ToString(), out aon))) { return("Invalid AON"); } if (aon) { if (!optionalParam.ContainsKey("MinQty")) { return("Missing Min. Qty"); } int minq = 0; if (optionalParam["MinQty"] == null || !int.TryParse(optionalParam["MinQty"].ToString(), out minq)) { return("Invalid Min. Qty"); } if (minq <= 0) { return("Invalid Min. Qty"); } if (minq > modify.Quantity) { return("Min. quantity should be equal or less than order's quantity"); } } } return("valid"); }
public bool Handle(IRequestMessage msg) { try { Type msgType = msg.GetType(); if (typeof(IRequestMessage).IsAssignableFrom(msgType)) { if (typeof(ModifyCancelOrder) == msgType) { Counters.IncrementCounter(CountersConstants.ClientsReplaceOrderReqs); ModifyCancelOrder modifyOrder = (ModifyCancelOrder)msg; SingleOrder order = OrdersManager.GetOrder(modifyOrder.RequesterOrderID); #region order existanse validation if (order == null) { Sessions.Push(Sessions.GetUsername(modifyOrder.ClientKey), new IResponseMessage[] { new Fix_OrderReplaceRefusedByService() { ClientKey = modifyOrder.ClientKey, RefuseReason = "Order Not Found!", RequesterOrderID = modifyOrder.RequesterOrderID } }); SystemLogger.LogEventAsync(string.Format("Order Not Found RequesterID {0} ", modifyOrder.RequesterOrderID)); return(true); } #endregion order existanse validation lock (order) { #region check order activation // check ispending before isactive becoz a pendingnew order might be not isactive but ispending bool isPending, isMcsdPending = false; isPending = Convert.ToBoolean(order[SingleOrderProperties.IsPending]); isMcsdPending = Convert.ToBoolean(order[SingleOrderProperties.IsPendingMcsd]); if (isPending || isMcsdPending) { Sessions.Push(Sessions.GetUsername(modifyOrder.ClientKey), new IResponseMessage[] { new Fix_OrderReplaceRefusedByService() { ClientKey = modifyOrder.ClientKey, RefuseReason = !isMcsdPending ? "Order is in pending request" : "Awaiting for allocation response", RequesterOrderID = modifyOrder.RequesterOrderID } }); return(true); } bool isActive = false; isActive = Convert.ToBoolean(order[SingleOrderProperties.IsActive]); if (!isActive) { Sessions.Push(Sessions.GetUsername(modifyOrder.ClientKey), new IResponseMessage[] { new Fix_OrderReplaceRefusedByService() { ClientKey = modifyOrder.ClientKey, RefuseReason = "Order not active any more", RequesterOrderID = modifyOrder.RequesterOrderID } }); return(true); } #endregion check order activation #region order validation // ValidateOrder string validation = ValidateOrder(modifyOrder, order); if (validation != "valid") { Sessions.Push(Sessions.GetUsername(modifyOrder.ClientKey), new IResponseMessage[] { new Fix_OrderReplaceRefusedByService() { ClientKey = modifyOrder.ClientKey, RefuseReason = validation, RequesterOrderID = modifyOrder.RequesterOrderID } }); return(true); } #endregion order validation // handle ClOrderID and OrigClOrdID OrdersManager.HandleModifyOrder(Sessions.GetUsername(modifyOrder.ClientKey), modifyOrder.ClientKey, modifyOrder.RequesterOrderID, (long)order[SingleOrderProperties.OrderID], modifyOrder.Quantity, Math.Round(modifyOrder.Price, m_orderPriceDigitsRounding), modifyOrder.OrderType, modifyOrder.TimeInForce, modifyOrder.OptionalParam); return(true); } } } return(false); } catch (Exception ex) { Counters.IncrementCounter(CountersConstants.ExceptionMessages); SystemLogger.LogErrorAsync("ModifyCancelOrderHandler Error: " + ex.Message); return(true); } }