Ejemplo n.º 1
0
        public static void PlaceNewSingleOrder(Guid clientKey, Guid requesterOrderID, int clientID, string custodyID, string securityID,
                                               string orderSide, double price, int quantity, string orderType, DateTime placementDateTime, string timeInForce,
                                               CurrencyItem currency, string exchangeID, DateTime orderCreatedBySysDateTime, string groupID,
                                               string marketID, HandleInstruction handleInst, DateTime expiryDate, Dictionary <string, object> optionalParam)
        {
            long orderID = -1;

            try
            {
                // Get Currency
                LookupItem currencyLookup = Lookups.GetCurrencyLookupByCurrencyCode(currency.Code);
                // Get Destination Type
                LookupItem exchangeLookup = Lookups.GetExchangeDestinationByExchangeID(exchangeID);
                // order Type
                LookupItem orderTypeLookup = Lookups.GetOrderTypeLookupByCodeValue(orderType);
                // Order Side
                LookupItem orderSideLookup = Lookups.GetOrderSidesLookupByCodeValue(orderSide);
                // Time In Force
                LookupItem timeInForceLookup = Lookups.GetTimeInForceLookupByCode(timeInForce);
                // Handle Instruction
                string     handleValue      = Enum.GetName(typeof(HandleInstruction), handleInst);
                LookupItem handleInstLookup = Lookups.GetHandleInstTypeLookupByCodeValue(handleValue);
                bool       hasAON           = false;
                int        minQ             = 0;
                if (optionalParam != null)
                {
                    if (optionalParam.ContainsKey("AON") && (bool)optionalParam["AON"])
                    {
                        hasAON = true;
                    }
                }
                if (hasAON)// MinQty must be existed if AON = true as it's already been validated before
                {
                    minQ = (int)optionalParam["MinQty"];
                }
                using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
                {
                    DatabaseMethods db = new DatabaseMethods();
                    //orderID = db.AddNewSingleOrder(clientKey, requesterOrderID, null, null, clientID, custodyID, securityID, orderSide,
                    //price, price, price, quantity, orderType, placementDateTime, ORD_STATUS.PendingNew, ORD_STATUS.PendingNew, "", false, "", timeInForce);


                    Dictionary <string, object> data = new Dictionary <string, object>();
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.CurrencyID).ColumnName, currency.ID);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.GroupID).ColumnName, groupID);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.MarketID).ColumnName, marketID);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.ExchangeID).ColumnName, exchangeID);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.RequesterOrderID).ColumnName, requesterOrderID);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.ClientID).ColumnName, clientID);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.CustodyID).ColumnName, custodyID);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.SecurityCode).ColumnName, securityID);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OrderSide).ColumnName, orderSide);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.CurrentPrice).ColumnName, price);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OriginalPrice).ColumnName, price);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.PlacementDateTime).ColumnName, placementDateTime);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OriginalQuantity).ColumnName, quantity);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.RemainingQuantity).ColumnName, 0);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.ExecutedQuantity).ColumnName, 0);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.LastExecQuantity).ColumnName, 0);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.LastExecPrice).ColumnName, 0);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.AvgPrice).ColumnName, 0);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.CurrentQuantity).ColumnName, quantity);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OriginalOrderType).ColumnName, orderType);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OrderType).ColumnName, orderType);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OrderStatus).ColumnName, ORD_STATUS.PendingNew);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OriginalOrderStatus).ColumnName, ORD_STATUS.PendingNew);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.ExecType).ColumnName, EXEC_TYP.PendingNew);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OrderCreatedBySysDateTime).ColumnName, orderCreatedBySysDateTime);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OrderRecievedDateTime).ColumnName, DateTime.Now);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.ModifiedDateTime).ColumnName, DateTime.Now);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.Note).ColumnName, "awaiting for acceptance response");
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.IsPending).ColumnName, true);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.IsActive).ColumnName, false);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.IsExecuted).ColumnName, false);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.IsCompleted).ColumnName, false);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.HasSystemError).ColumnName, false);
                    //data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.ErrorMessage).ColumnName, string.Empty);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OriginalTimeInForce).ColumnName, timeInForce);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.TimeInForce).ColumnName, timeInForce);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OriginalHandleInst).ColumnName, handleValue);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.HandleInst).ColumnName, handleValue);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.ExpirationDate).ColumnName, expiryDate.ToShortDateString());
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.ExpirationDateTime).ColumnName, expiryDate);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.AON).ColumnName, hasAON);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OriginalAON).ColumnName, hasAON);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.OriginalMinQty).ColumnName, minQ);
                    data.Add(PropColMapper.GetColumnByProperty(SingleOrderProperties.TableName, SingleOrderProperties.MinQty).ColumnName, minQ);

                    Dictionary <string, object> dataDetails = new Dictionary <string, object>();
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.CurrentPrice).ColumnName, price);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.CurrentQuantity).ColumnName, quantity);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.RemainingQuantity).ColumnName, quantity);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.ExecutedQuantity).ColumnName, 0);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.AvgPrice).ColumnName, 0);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.ExecPrice).ColumnName, 0);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.LastExecQuantity).ColumnName, 0);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.OrderType).ColumnName, orderType);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.OrderStatus).ColumnName, ORD_STATUS.PendingNew);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.ExecType).ColumnName, EXEC_TYP.PendingNew);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.DateTime).ColumnName, DateTime.Now);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.Note).ColumnName, "New Order");
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.HasSystemError).ColumnName, false);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.ErrorMessage).ColumnName, string.Empty);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.TimeInForce).ColumnName, timeInForce);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.IsNewOrderRequest).ColumnName, true);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.IsUserRequest).ColumnName, true);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.HandleInst).ColumnName, handleValue);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.AON).ColumnName, hasAON);
                    dataDetails.Add(PropColMapper.GetColumnByProperty(SingleOrdDetailsProps.TableName, SingleOrdDetailsProps.MinQty).ColumnName, minQ);



                    //orderID = db.AddNewSingleOrder(clientKey, data, dataDetails);

                    string clOrderID = string.Format("{0}-{1}", orderID.ToString(), "1");

                    SingleOrder order = new SingleOrder();
                    order.Data[SingleOrderProperties.OrderID]          = orderID;
                    order.Data[SingleOrderProperties.ClOrderID]        = clOrderID;
                    order.Data[SingleOrderProperties.GroupID]          = groupID;
                    order.Data[SingleOrderProperties.MarketID]         = marketID;
                    order.Data[SingleOrderProperties.ExchangeID]       = exchangeID;
                    order.Data[SingleOrderProperties.CurrencyID]       = currency.ID;
                    order.Data[SingleOrderProperties.RequesterOrderID] = requesterOrderID;
                    order.Data[SingleOrderProperties.ClientID]         = clientID;
                    order.Data[SingleOrderProperties.CustodyID]        = custodyID;
                    order.Data[SingleOrderProperties.SecurityCode]     = securityID;
                    order.Data[SingleOrderProperties.OrderSide]        = orderSide;

                    order.Data[SingleOrderProperties.IsActive]    = false;
                    order.Data[SingleOrderProperties.IsPending]   = true;
                    order.Data[SingleOrderProperties.IsCompleted] = false;
                    order.Data[SingleOrderProperties.IsExecuted]  = false;

                    order.Data[SingleOrderProperties.CurrentPrice]  = price;
                    order.Data[SingleOrderProperties.OriginalPrice] = price;
                    order.Data[SingleOrderProperties.AvgPrice]      = 0;
                    order.Data[SingleOrderProperties.LastExecPrice] = 0;

                    order.Data[SingleOrderProperties.OriginalQuantity]  = quantity;
                    order.Data[SingleOrderProperties.RemainingQuantity] = 0;
                    order.Data[SingleOrderProperties.ExecutedQuantity]  = 0;
                    order.Data[SingleOrderProperties.LastExecQuantity]  = 0;
                    order.Data[SingleOrderProperties.CurrentQuantity]   = quantity;

                    order.Data[SingleOrderProperties.OriginalOrderType]   = orderType;
                    order.Data[SingleOrderProperties.OrderType]           = orderType;
                    order.Data[SingleOrderProperties.OrderStatus]         = ORD_STATUS.PendingNew;
                    order.Data[SingleOrderProperties.OriginalOrderStatus] = ORD_STATUS.PendingNew;
                    order.Data[SingleOrderProperties.ExecType]            = EXEC_TYP.PendingNew;
                    order.Data[SingleOrderProperties.OriginalTimeInForce] = timeInForce;
                    order.Data[SingleOrderProperties.TimeInForce]         = timeInForce;
                    order.Data[SingleOrderProperties.OriginalHandleInst]  = handleValue;
                    order.Data[SingleOrderProperties.HandleInst]          = handleValue;

                    order.Data[SingleOrderProperties.AON]            = hasAON;
                    order.Data[SingleOrderProperties.MinQty]         = minQ;
                    order.Data[SingleOrderProperties.OriginalAON]    = hasAON;
                    order.Data[SingleOrderProperties.OriginalMinQty] = minQ;

                    order.Data[SingleOrderProperties.PlacementDateTime]         = placementDateTime;
                    order.Data[SingleOrderProperties.OrderCreatedBySysDateTime] = orderCreatedBySysDateTime;
                    order.Data[SingleOrderProperties.OrderRecievedDateTime]     = DateTime.Now;
                    order.Data[SingleOrderProperties.ModifiedDateTime]          = DateTime.Now;
                    order.Data[SingleOrderProperties.Note] = "Awaiting For Acceptance Response";

                    order.Data[SingleOrderProperties.HasSystemError] = false;

                    // lock only shared entities as each method create its only copy of variable except shared entities
                    lock (m_syncObject)
                    {
                        if (!m_sessionKey_ReqOrdIDs.ContainsKey(clientKey))
                        {
                            m_sessionKey_ReqOrdIDs.Add(clientKey, new List <Guid>());
                        }
                        m_sessionKey_ReqOrdIDs[clientKey].Add((Guid)order.Data[SingleOrderProperties.RequesterOrderID]);
                        m_ReqOrdID_OrdID.Add((Guid)order.Data[SingleOrderProperties.RequesterOrderID], (long)order.Data[SingleOrderProperties.OrderID]);
                        m_orderID_ordersDetails.Add((long)order.Data[SingleOrderProperties.OrderID], order);
                        m_OrdID_sessionKey.Add(orderID, clientKey);
                        //if (!m_ReqOrdID_subIDs.ContainsKey((Guid)order.Data[SingleOrderProperties.RequesterOrderID]))
                        //{
                        //    m_ReqOrdID_subIDs.Add((Guid)order.Data[SingleOrderProperties.RequesterOrderID], new List<Guid>());
                        //}
                        //m_ReqOrdID_subIDs[(Guid)order.Data[SingleOrderProperties.RequesterOrderID]].Add(clientKey);
                    }

                    FixGatewayManager.PlaceNewSingleOrder(clOrderID, clientID.ToString(), securityID, quantity, price, custodyID, orderSideLookup.FixValue.ToCharArray()[0], orderTypeLookup.FixValue.ToCharArray()[0], currencyLookup.FixValue, exchangeLookup.FixValue, timeInForceLookup.FixValue.ToCharArray()[0], groupID, handleInstLookup.FixValue.ToCharArray()[0], expiryDate, hasAON, minQ);

                    ts.Complete();
                    db = null;
                }
            }
            catch (Exception ex)
            {
                Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                SystemLogger.WriteOnConsoleAsync(true, string.Format("Error placing order, ClientKey {0}, Req Order ID {1}, Error: {2}", clientKey, requesterOrderID, ex.Message), ConsoleColor.Red, ConsoleColor.White, false);
                if (orderID > -1)
                {
                    RemoveOrderRef(orderID);
                }

                try
                {
                    // Sessions.Push(new IResponseMessage[] { new Fix_OrderRefusedByService() { ClientKey = clientKey, RefuseMessage = "System Erorr", RequesterOrderID = requesterOrderID } });
                }
                catch (Exception inEx)
                {
                    Counters.IncrementCounter(CountersConstants.ExceptionMessages);
                    SystemLogger.WriteOnConsoleAsync(true, string.Format("Error sending refused order to the client while placing order, ClientKey {0}, Req Order ID {1}, Error: {2}", clientKey, requesterOrderID, inEx.Message), ConsoleColor.Red, ConsoleColor.White, false);
                }
            }
        }