示例#1
0
 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();
 }
示例#2
0
 public void PlaceOrder(PlaceOrderData data)
 {
     if (ObjFactory.Instance.CreateRegisterClients().GetClients().ContainsKey(data.ClientId))
     {
         ObjFactory.Instance.CreateOrder().AddOrderIntoQueue(data);
     }
 }
示例#3
0
 private void AddBidQuantity(PlaceOrderData item, MarketOrderData marketData)
 {
     if (item.ClientId == ClientId)
     {
         marketData.MyBidQuantity = marketData.MyBidQuantity + item.Quantity;
     }
     marketData.MrktBidQuantity = marketData.MrktBidQuantity + item.Quantity;
 }
示例#4
0
 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());
        }
示例#6
0
        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());
                }
            }
        }
示例#7
0
 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);
     }
 }
示例#8
0
        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 })));
        }
示例#10
0
 private void AddNewDataInTheSellList(PlaceOrderData data)
 {
     _sellPendingOrders.Add(data);
 }
示例#11
0
 private void AddNewDataInTheBuyList(PlaceOrderData data)
 {
     _buyPendingOrders.Add(data);
 }