Esempio n. 1
0
        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");
        }
Esempio n. 2
0
        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);
            }
        }