private void MatchOrders(PlaceOrderData data) { if (data.IsBuy) { if (_sellPendingOrders.Count > 0) { MatchBuyOrder(data); } else { AddNewDataInTheBuyList(data); } } else { if (_buyPendingOrders.Count > 0) { MatchSellOrder(data); } else { AddNewDataInTheSellList(data); } } UpdateMarketOrderBook(); }
public void PlaceOrder(PlaceOrderData data) { if (ObjFactory.Instance.CreateRegisterClients().GetClients().ContainsKey(data.ClientId)) { ObjFactory.Instance.CreateOrder().AddOrderIntoQueue(data); } }
private void AddBidQuantity(PlaceOrderData item, MarketOrderData marketData) { if (item.ClientId == ClientId) { marketData.MyBidQuantity = marketData.MyBidQuantity + item.Quantity; } marketData.MrktBidQuantity = marketData.MrktBidQuantity + item.Quantity; }
private bool IsValidOrder(PlaceOrderData data) { if (data != null && data.ClientId > 0 && data.Price > 0 && data.Quantity > 0) { return(true); } return(false); }
public async Task <IActionResult> Put(PlaceOrderData data) { ITradingEngine tradingEngine = new ReliableTradingEngine( _stateManager, new OrdersMatchingRule()); await tradingEngine.PlaceAsync(new Order( new CurrencyPair(data.BaseCurrency, data.QuoteCurrency), data.Side, data.Price, data.Amount)); return(new OkResult()); }
public void AddOrderIntoQueue(PlaceOrderData data) { if (IsValidOrder(data)) { _unprocessed.Enqueue(data); ObjFactory.Instance.CreateLogger() .Log(string.Format("Order Enqueue Client Id = {0} Price = {1} Quantity= {2} type ={3}", data.ClientId, data.Price, data.Quantity, data.IsBuy) , this.GetType().Name, false); if (!_unprocessed.IsEmpty && !_alreadyRunning) { _alreadyRunning = true; Task.Run(() => StartProcess_UnProcessedOrder()); } } }
private void ExecuteBuyOrder(PlaceOrderData data, PlaceOrderData oldOrderData) { if (data.Quantity < oldOrderData.Quantity) { int tradeQuantity = data.Quantity; oldOrderData.Quantity = oldOrderData.Quantity - tradeQuantity; data.Quantity = 0; UpdateTrade(data.ClientId, oldOrderData.ClientId, tradeQuantity, oldOrderData.Price); } else { int tradeQuantity = oldOrderData.Quantity; oldOrderData.Quantity = oldOrderData.Quantity - tradeQuantity; data.Quantity = data.Quantity - tradeQuantity; UpdateTrade(data.ClientId, oldOrderData.ClientId, tradeQuantity, oldOrderData.Price); } }
private void MatchBuyOrder(PlaceOrderData data) { var list = _sellPendingOrders.Where(x => x.Price <= data.Price).ToList(); foreach (var oldData in list) { ExecuteBuyOrder(data, oldData); if (data.Quantity == 0) { break; } } _sellPendingOrders.RemoveAll(x => x.Quantity == 0); if (data.Quantity > 0) { AddNewDataInTheBuyList(data); } }
public async Task <IActionResult> PlaceOrder([FromBody] PlaceOrderData data) // TODO: PlaceOrderDto { _logger.LogInformation($"PlaceOrderData: {JsonConvert.SerializeObject(data)}."); var command = new PlaceOrder(Guid.NewGuid(), data.ClientId, data.ProductId, data.Price, DateTime.Now); try { await _commandHandler.HandleAsync(command); } catch (InfrastructureException ex) { _logger.LogError($"Server error during processing command: {ex.Message}"); return(StatusCode((int)HttpStatusCode.InternalServerError)); } catch (Exception ex) { _logger.LogInformation($"Client error during processing command: {ex.Message}"); return(BadRequest()); } return(Ok(JsonConvert.SerializeObject(new { orderId = command.Id }))); }
private void AddNewDataInTheSellList(PlaceOrderData data) { _sellPendingOrders.Add(data); }
private void AddNewDataInTheBuyList(PlaceOrderData data) { _buyPendingOrders.Add(data); }