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++; } } }
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); }
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); } }