Esempio n. 1
0
 protected ClientOrder(int id, Security security, OrderType type, TimeInForce tif, DateTime?expiry, Side side,
                       int?price, int?stopPrice, int quantity, int minQuantity, int?maxVisibleQuantity,
                       string selfMatchId, SelfMatchPreventionInstruction selfMatchMode)
     : base(id, security, type, tif, expiry, side, price, stopPrice, quantity, minQuantity, maxVisibleQuantity,
            selfMatchId, selfMatchMode)
 {
 }
Esempio n. 2
0
        public void CreateLimitOrder(int id, TimeInForce tif, DateTime?expiry, Side side,
                                     int?price, int quantity, int minQuantity = 0,
                                     int maxVisibleQuantity = int.MaxValue, string smpId = null,
                                     SelfMatchPreventionInstruction smpInstruction = SelfMatchPreventionInstruction.CancelResting)
        {
            var order = new Order(id, Security, OrderType.Limit, tif, expiry, side, price, null,
                                  quantity, minQuantity, maxVisibleQuantity,
                                  smpId, smpInstruction);

            if (quantity < 1)
            {
                FireCreateRejected(order, OrderRejectReason.QuantityTooLow);
                return;
            }

            if (Status == SecurityTradingStatus.Close || Status == SecurityTradingStatus.NotAvailable)
            {
                FireCreateRejected(order, OrderRejectReason.MarketClosed);
                return;
            }

            if (order.TimeInForce == TimeInForce.FillAndKill)
            {
                // TODO: catch earlier?
                if (order.MinQuantity > order.Quantity)
                {
                    FireCreateRejected(order, OrderRejectReason.QuantityOutOfRange);
                    return;
                }
            }

            CreateOrder(order);
            Match();
        }
Esempio n. 3
0
        public void CreateStopLimitOrder(int id, TimeInForce tif, DateTime?expiry, Side side,
                                         int?price, int?stopPrice, int quantity, int minQuantity = 0,
                                         int maxVisibleQuantity = int.MaxValue, string smpId = null,
                                         SelfMatchPreventionInstruction smpInstruction = SelfMatchPreventionInstruction.CancelResting)
        {
            var order = new Order(id, Security, OrderType.StopLimit, tif, expiry, side, price, stopPrice,
                                  quantity, minQuantity, maxVisibleQuantity,
                                  smpId, smpInstruction);

            if (quantity < 1)
            {
                FireCreateRejected(order, OrderRejectReason.QuantityTooLow);
                return;
            }

            if (Status == SecurityTradingStatus.Close || Status == SecurityTradingStatus.NotAvailable)
            {
                FireCreateRejected(order, OrderRejectReason.MarketClosed);
                return;
            }

            if (order.Side == Side.Buy && stopPrice.Value > lastTradePrice)
            {
                FireCreateRejected(order, OrderRejectReason.StopPriceMustBeLessThanLastTradePrice);
                return;
            }
            if (order.Side == Side.Sell && stopPrice.Value < lastTradePrice)
            {
                FireCreateRejected(order, OrderRejectReason.StopPriceMustBeGreaterThanLastTradePrice);
                return;
            }

            if (order.Type == OrderType.StopLimit)
            {
                if (order.Side == Side.Buy && price.Value < stopPrice.Value)
                {
                    FireCreateRejected(order, OrderRejectReason.InvalidStopPriceMustBeGreaterThanEqualTriggerPrice);
                    return;
                }
                if (order.Side == Side.Sell && price.Value > stopPrice.Value)
                {
                    FireCreateRejected(order, OrderRejectReason.InvalidStopPriceMustBeLessThanEqualTriggerPrice);
                    return;
                }
            }

            if (order.TimeInForce == TimeInForce.FillAndKill)
            {
                // TODO: catch earlier?
                if (order.MinQuantity > order.Quantity)
                {
                    FireCreateRejected(order, OrderRejectReason.QuantityOutOfRange);
                    return;
                }
            }

            CreateOrder(order);
            order.Status = OrderStatus.Hidden;
            Match();
        }
Esempio n. 4
0
        public void CreateMarketOrder(int id, TimeInForce tif, DateTime?expiry, Side side,
                                      int quantity, int minQuantity = 0,
                                      int maxVisibleQuantity        = int.MaxValue, string smpId = null,
                                      SelfMatchPreventionInstruction smpInstruction = SelfMatchPreventionInstruction.CancelResting)
        {
            var order = new Order(id, Security, OrderType.Market, tif, expiry, side, null, null,
                                  quantity, minQuantity, maxVisibleQuantity,
                                  smpId, smpInstruction);

            if (quantity < 1)
            {
                FireCreateRejected(order, OrderRejectReason.QuantityTooLow);
                return;
            }

            if (Status != SecurityTradingStatus.Open)
            {
                FireCreateRejected(order, OrderRejectReason.MarketClosed);
                return;
            }

            // TODO: reject if for market-limit, "A designated limit is farther than price bands from current Last Best Price"

            var top = WorkingOrders(order.Side == Side.Buy ? Side.Sell : Side.Buy).FirstOrDefault();

            // check if book is empty
            if (top == null)
            {
                FireCreateRejected(order, OrderRejectReason.NoOrdersToMatchMarketOrder);
                return;
            }

            // TODO: need to get these Protection Point values from somewhere
            //       -- "Protection point values usually equal half of the Non-reviewable range"
            int protectionPoints = 10 * (order.Side == Side.Buy ? 1 : -1);

            order.Price = top.Price + protectionPoints;

            if (order.TimeInForce == TimeInForce.FillAndKill)
            {
                // TODO: catch earlier?
                if (order.MinQuantity > order.Quantity)
                {
                    FireCreateRejected(order, OrderRejectReason.QuantityOutOfRange);
                    return;
                }
            }

            CreateOrder(order);
            Match();
        }
Esempio n. 5
0
 public Order(int id, Security security, OrderType type, TimeInForce tif, DateTime?expiry, Side side,
              int?price, int?stopPrice, int quantity, int minQuantity, int?maxVisibleQuantity,
              string selfMatchId, SelfMatchPreventionInstruction selfMatchMode)
 {
     Id                 = id;
     Security           = security;
     Type               = type;
     TimeInForce        = tif;
     ExpireDate         = expiry;
     Side               = side;
     Price              = price;
     StopPrice          = stopPrice;
     Quantity           = quantity;
     FilledQuantity     = 0;
     RemainingQuantity  = quantity;
     MinQuantity        = minQuantity;
     MaxVisibleQuantity = maxVisibleQuantity ?? int.MaxValue;
     SelfMatchId        = selfMatchId;
     SelfMatchMode      = selfMatchMode;
 }
Esempio n. 6
0
        private void HandleCreateRequest(object sender, NewOrder request)
        {
            if (!books.ContainsKey(request.Contract))
            {
                ((FixTcpClient)sender).Send(new BusinessLevelReject(request, BusinessLevelRejectReason.UnknownSecurity));
                return;
            }

            int    id       = nextOrderId++;
            string globexId = id.ToString();

            ordersToClients[id] = (FixTcpClient)sender;
            orderInfos[id]      = new OrderInfo(globexId, request.ClientOrderId,
                                                request.CorrelationClientOrderId, request.Account,
                                                request.IsManualOrder, request.PreTradeAnonymity);
            orderIds[globexId] = id;

            var book = books[request.Contract];

            int minQty        = request.MinQuantity ?? 0;
            int maxVisibleQty = request.MaxVisibleQuantity ?? int.MaxValue;
            SelfMatchPreventionInstruction smpMode = request.SelfMatchPreventionInstruction ?? SelfMatchPreventionInstruction.CancelResting;

            switch (request.OrderType)
            {
            case OrderType.Limit:
                book.CreateLimitOrder(id, request.TimeInForce, request.ExpireDate,
                                      request.Side, request.Price, request.Quantity,
                                      minQty, maxVisibleQty,
                                      request.SelfMatchPreventionId, smpMode);
                break;

            case OrderType.Market:
                book.CreateMarketOrder(id, request.TimeInForce, request.ExpireDate,
                                       request.Side, request.Quantity,
                                       minQty, maxVisibleQty,
                                       request.SelfMatchPreventionId, smpMode);
                break;

            case OrderType.MarketLimit:
                book.CreateMarketLimitOrder(id, request.TimeInForce, request.ExpireDate,
                                            request.Side, request.Quantity,
                                            minQty, maxVisibleQty,
                                            request.SelfMatchPreventionId, smpMode);
                break;

            case OrderType.Stop:
                book.CreateStopOrder(id, request.TimeInForce, request.ExpireDate,
                                     request.Side, request.StopPrice, request.Quantity,
                                     minQty, maxVisibleQty,
                                     request.SelfMatchPreventionId, smpMode);
                break;

            case OrderType.StopLimit:
                book.CreateStopLimitOrder(id, request.TimeInForce, request.ExpireDate,
                                          request.Side, request.Price, request.StopPrice, request.Quantity,
                                          minQty, maxVisibleQty,
                                          request.SelfMatchPreventionId, smpMode);
                break;
            }
        }