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) { }
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(); }
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(); }
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(); }
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; }
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; } }