public Task ProcessNewExternalOrderbookAsync(ExternalExchangeOrderbookMessage orderbook)
        {
            var quotesSource = _assetPairSourceTypeService.Get(orderbook.AssetPairId);

            if (quotesSource != AssetPairQuotesSourceTypeDomainEnum.External ||
                (orderbook.Bids?.Count ?? 0) == 0 || (orderbook.Asks?.Count ?? 0) == 0)
            {
                return(Task.CompletedTask);
            }

            var externalOrderbook = new ExternalOrderbook(orderbook.AssetPairId, orderbook.Source, _system.UtcNow,
                                                          orderbook.Bids.OrderByDescending(p => p.Price).Select(b => new OrderbookPosition(b.Price, b.Volume))
                                                          .ToImmutableArray(),
                                                          orderbook.Asks.OrderBy(p => p.Price).Select(b => new OrderbookPosition(b.Price, b.Volume))
                                                          .ToImmutableArray());
            var resultingOrderbook = _generateOrderbookService.OnNewOrderbook(externalOrderbook);

            if (resultingOrderbook == null)
            {
                return(Task.CompletedTask);
            }

            var orderbooksToSend = _crossRatesService.CalcDependentOrderbooks(resultingOrderbook)
                                   .Add(resultingOrderbook);

            return(SendOrderCommandsAsync(orderbooksToSend));
        }
 public IReadOnlyList <AssetPairModel> List()
 {
     return(_assetPairSourceTypeService.Get()
            .OrderBy(d => d.Key)
            .Select(d => new AssetPairModel {
         SourceType = d.Value.ToString(), AssetPairId = d.Key
     })
            .ToList());
 }
        public ImmutableList <Orderbook> CalcDependentOrderbooks([NotNull] Orderbook orderbook) // ex: (btcusd)
        {
            _orderbooks[orderbook.AssetPairId] = orderbook
                                                 ?? throw new ArgumentNullException(nameof(orderbook));
            var dependent = _crossRateCalcInfosService.GetDependentAssetPairs(orderbook.AssetPairId)
                            .Where(p => _assetPairSourceTypeService.Get(p.ResultingPairId) ==
                                   AssetPairQuotesSourceTypeDomainEnum.CrossRates); // ex: btceur

            return(dependent.Select(CalculateOrderbook).Where(o => o != null).ToImmutableList());
        }