private async Task ProcessMessageAsync(LimitOrderMessage message) { foreach (var messageOrder in message.Orders) { if (!_settings.TrustedClientIds.Contains(messageOrder.Order.ClientId)) { continue; } if (messageOrder.Order.Status == OrderStatus.InOrderBook) { var order = new OrderEntity() { ClientId = messageOrder.Order.ClientId, OrderId = messageOrder.Order.ExternalId, CreatedTime = DateTime.UtcNow, AvgExecutionPrice = 0, ExecutedAmount = 0, Instrument = messageOrder.Order.AssetPairId, OriginalAmount = Math.Abs(messageOrder.Order.Volume), Price = messageOrder.Order.Price ?? 0, TradeType = messageOrder.Order.Volume > 0 ? "Buy" : "Sell", RemainingAmount = Math.Abs(messageOrder.Order.Volume), Status = "Active", CountExecute = 0, SumExecutePrice = 0 }; await _orderRepository.AddOrReplace(order); } if (messageOrder.Order.Status == OrderStatus.Matched || messageOrder.Order.Status == OrderStatus.Processing) { var order = await _orderRepository.GetOrder(messageOrder.Order.ClientId, messageOrder.Order.ExternalId); if (order == null) { order = new OrderEntity() { ClientId = messageOrder.Order.ClientId, OrderId = messageOrder.Order.ExternalId, CreatedTime = DateTime.UtcNow, AvgExecutionPrice = 0, ExecutedAmount = 0, Instrument = messageOrder.Order.AssetPairId, OriginalAmount = Math.Abs(messageOrder.Order.Volume), Price = messageOrder.Order.Price ?? 0, TradeType = messageOrder.Order.Volume > 0 ? "Buy" : "Sell", RemainingAmount = Math.Abs(messageOrder.Order.Volume), Status = "Active", CountExecute = 0, SumExecutePrice = 0 }; await _orderRepository.AddOrReplace(order); } ; foreach (var trade in messageOrder.Trades) { var volume = messageOrder.Order.Volume < 0 ? trade.Volume : trade.OppositeVolume; order.RemainingAmount -= Math.Abs(volume); order.SumExecutePrice += trade.Price ?? 0; order.CountExecute++; order.AvgExecutionPrice = order.SumExecutePrice / order.CountExecute; order.ExecutedAmount += Math.Abs(volume); if (messageOrder.Order.Status == OrderStatus.Matched) { order.Status = "Fill"; } } await _orderRepository.AddOrReplace(order); } if (messageOrder.Order.Status == OrderStatus.Cancelled) { var order = await _orderRepository.GetOrder(messageOrder.Order.ClientId, messageOrder.Order.ExternalId); if (order == null) { continue; } order.Status = "Canceled"; await _orderRepository.AddOrReplace(order); } } }