Esempio n. 1
0
        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
            });
        }