Esempio n. 1
0
        public void SetOrderbook(ExternalOrderBook orderbook)
        {
            var isEodOrderbook = orderbook.ExchangeName == ExternalOrderbookService.EodExternalExchange;

            var instrumentTradingStatus = _assetPairDayOffService.IsAssetTradingDisabled(orderbook.AssetPairId);

            if (!isEodOrderbook &&
                !instrumentTradingStatus.TradingEnabled &&
                instrumentTradingStatus.Reason == InstrumentTradingDisabledReason.InstrumentTradingDisabled)
            {
                return;
            }

            if (_orderbookValidation.ValidateInstrumentStatusForEodQuotes && isEodOrderbook ||
                _orderbookValidation.ValidateInstrumentStatusForTradingQuotes && !isEodOrderbook)
            {
                // we should process normal orderbook only if instrument is currently tradable
                if (_orderbookValidation.ValidateInstrumentStatusForTradingQuotes && instrumentTradingStatus && !isEodOrderbook)
                {
                    return;
                }

                // and process EOD orderbook only if instrument is currently not tradable
                if (_orderbookValidation.ValidateInstrumentStatusForEodQuotes && !instrumentTradingStatus && isEodOrderbook)
                {
                    //log current schedule for the instrument
                    var schedule = _scheduleSettingsCache.GetMarketTradingScheduleByAssetPair(orderbook.AssetPairId);

                    _log.WriteWarning("EOD quotes processing", $"Current schedule for the instrument's market: {schedule.ToJson()}",
                                      $"EOD quote for {orderbook.AssetPairId} is skipped, because instrument is within trading hours");

                    return;
                }
            }

            if (!CheckZeroQuote(orderbook, isEodOrderbook))
            {
                return;
            }

            orderbook.ApplyExchangeIdFromSettings(_defaultExternalExchangeId);

            var bba = orderbook.GetBestPrice();

            _orderbooks.AddOrUpdate(orderbook.AssetPairId, a => orderbook, (s, book) => orderbook);

            _bestPriceChangeEventChannel.SendEvent(this, new BestPriceChangeEventArgs(bba, isEodOrderbook));
        }
        public void SetOrderbook(ExternalOrderBook orderbook)
        {
            if (!CheckZeroQuote(orderbook))
            {
                return;
            }

            var isDayOff       = _assetPairDayOffService.IsDayOff(orderbook.AssetPairId);
            var isEodOrderbook = orderbook.ExchangeName == ExternalOrderbookService.EodExternalExchange;

            // we should process normal orderbook only if instrument is currently tradable
            if (isDayOff && !isEodOrderbook)
            {
                return;
            }

            // and process EOD orderbook only if instrument is currently not tradable
            if (!isDayOff && isEodOrderbook)
            {
                //log current schedule for the instrument
                var schedule = _scheduleSettingsCache.GetCompiledScheduleSettings(
                    orderbook.AssetPairId,
                    _dateService.Now(),
                    TimeSpan.Zero);

                _log.WriteWarning("EOD quotes processing", $"Current schedule: {schedule.ToJson()}",
                                  $"EOD quote for {orderbook.AssetPairId} is skipped, because instrument is within trading hours");

                return;
            }

            orderbook.ApplyExchangeIdFromSettings(_defaultExternalExchangeId);

            var bba = orderbook.GetBestPrice();

            _orderbooks.AddOrUpdate(orderbook.AssetPairId, a => orderbook, (s, book) => orderbook);

            _bestPriceChangeEventChannel.SendEvent(this, new BestPriceChangeEventArgs(bba));
        }