public Task ProcessNewExternalOrderbookAsync(ExternalExchangeOrderbookMessage orderbook) { if (string.IsNullOrEmpty(orderbook.AssetPairId) || string.IsNullOrEmpty(orderbook.ExchangeName)) { return(Task.CompletedTask); } var settings = _settingsService.TryGetAssetPair(orderbook.ExchangeName, orderbook.AssetPairId); if (settings == null || (orderbook.Bids?.Count ?? 0) == 0 || (orderbook.Asks?.Count ?? 0) == 0) { return(Task.CompletedTask); } orderbook.Bids.RemoveAll(e => e == null || e.Price <= 0 || e.Volume == 0); orderbook.Asks.RemoveAll(e => e == null || e.Price <= 0 || e.Volume == 0); orderbook.Bids.Sort((a, b) => - a.Price.CompareTo(b.Price)); orderbook.Asks.Sort((a, b) => a.Price.CompareTo(b.Price)); var now = _system.UtcNow; var externalOrderbook = new ExternalExchangeOrderbookMessage { AssetPairId = settings.ResultingAssetPairId, ExchangeName = orderbook.ExchangeName, Timestamp = now, Bids = GetOrderbookPositions(orderbook.Bids, settings.Markups.BidMultiplier), Asks = GetOrderbookPositions(orderbook.Asks, settings.Markups.AskMultiplier) }; _watchdogService.OnOrderbookArrived(orderbook.ExchangeName, orderbook.AssetPairId, now); WriteStats(orderbook, externalOrderbook, now); return(_messageProducer.ProduceAsync(externalOrderbook)); }