private async Task <OrderBook> CalculateCrossOrderBookAsync(OrderBook directOrderBook, CrossInstrument crossInstrument) { Quote quote = await _quoteService .GetAsync(crossInstrument.QuoteSource, crossInstrument.ExternalAssetPairId); if (quote == null) { _log.WarningWithDetails("No quote for instrument", new { Source = crossInstrument.QuoteSource, AssetPair = crossInstrument.ExternalAssetPairId }); return(null); } LimitOrder[] validDirectLimitOrders = directOrderBook.LimitOrders .Where(o => o.Error == LimitOrderError.None) .ToArray(); if (validDirectLimitOrders.Length == 0) { return(null); } AssetPair assetPair = await _assetsServiceWithCache.TryGetAssetPairAsync(crossInstrument.AssetPairId); Asset baseAsset = await _assetsServiceWithCache.TryGetAssetAsync(assetPair.BaseAssetId); IReadOnlyCollection <LimitOrder> crossLimitOrders = Calculator.CalculateCrossLimitOrders(quote, validDirectLimitOrders, crossInstrument.IsInverse, assetPair.Accuracy, baseAsset.Accuracy); await ValidateQuoteTimeoutAsync(crossLimitOrders, quote); ValidateMinVolume(crossLimitOrders, (decimal)assetPair.MinVolume); await ValidateBalanceAsync(crossLimitOrders, assetPair); WriteInfoLog(crossInstrument.AssetPairId, directOrderBook.AssetPairId, quote, crossLimitOrders, "Cross limit orders calculated"); return(new OrderBook { AssetPairId = crossInstrument.AssetPairId, Time = DateTime.UtcNow, LimitOrders = crossLimitOrders, IsDirect = false, BaseAssetPairId = directOrderBook.AssetPairId, CrossQuote = quote }); }