コード例 #1
0
        public void CancelOrder(String id)
        {
            if (!OrderDict.ContainsKey(id))
            {
                return;
            }

            var orderToCancel = OrderDict[id];

            if (orderToCancel.Status != OrderStatus.ON_MARKET)
            {
                return;
            }

            orderToCancel.Status = OrderStatus.CANCELED;
            ulong openQuantity = orderToCancel.Quantity - orderToCancel.FilledQuantity;

            OrderEntries[orderToCancel.Price].TotalQuantity -= openQuantity;

            if (orderToCancel.Side == OrderSide.BUY)
            {
                while (OrderEntries[MaxBid].TotalQuantity == 0 && MaxBid > MinPrice)
                {
                    MaxBid--;
                }
            }
            else
            {
                while (OrderEntries[MinAsk].TotalQuantity == 0 && MinAsk < MaxPrice)
                {
                    MinAsk++;
                }
            }
        }
コード例 #2
0
        public void UpdateOrder(String orderId, OrderSide side, UInt32 price, UInt32 qty)
        {
            if (!OrderDict.ContainsKey(orderId))
            {
                return;
            }

            var orderToUpdate = OrderDict[orderId];

            if (orderToUpdate.Status != OrderStatus.ON_MARKET)
            {
                return;
            }

            if (orderToUpdate.Type == OrderType.IOC)
            {
                return;
            }

            CancelOrder(orderId);
            OrderDict.Remove(orderId);
            var newOrder = new Order(side, price, qty, OrderType.GFD, orderId);

            SendOrder(newOrder);
        }
コード例 #3
0
        public void SendOrder(Order order)
        {
            if (!IsValid(order))
            {
                return;
            }

            if (OrderDict.ContainsKey(order.Id))
            {
                return;
            }

            OrderDict.Add(order.Id, order);

            // making buy order
            if (order.Side == OrderSide.BUY && order.Price < MinAsk)
            {
                if (order.Type == OrderType.IOC)
                {
                    order.Status = OrderStatus.CANCELED;
                    return;
                }

                OrderEntries[order.Price].AddOrder(order);
                if (order.Price > MaxBid)
                {
                    MaxBid = order.Price;
                }

                order.Status = OrderStatus.ON_MARKET;
            }
            // making sell order
            else if ((order.Side == OrderSide.SELL && order.Price > MaxBid))
            {
                if (order.Type == OrderType.IOC)
                {
                    order.Status = OrderStatus.CANCELED;
                    return;
                }

                OrderEntries[order.Price].AddOrder(order);
                if (order.Price < MinAsk)
                {
                    MinAsk = order.Price;
                }

                order.Status = OrderStatus.ON_MARKET;
            }
            // taking order
            else
            {
                TryMatch(order);
            }
        }