private GetMinuteBarsRequest GetMinuteBarsRequest(MarketDataRequest request)
        {
            if (request == null || (!request?.IsValid() ?? true))
            {
                this._logger.LogError(
                    $"{nameof(BmllDataRequestsManager)} had a null request or a request that did not pass data request validation for {request?.Identifiers}");

                return(null);
            }

            if (string.IsNullOrWhiteSpace(request.Identifiers.Figi))
            {
                this._logger.LogError($"{nameof(BmllDataRequestsManager)} asked to process a security without a figi");

                return(null);
            }

            return(new GetMinuteBarsRequest
            {
                Figi = request.Identifiers.Figi,
                From = request.UniverseEventTimeFrom.Value.Date,
                To = request.UniverseEventTimeTo.Value.Date.AddDays(1).AddMilliseconds(-1),
                Interval = "1min"
            });
        }
Exemplo n.º 2
0
        public MarketDataResponse <EquityInstrumentIntraDayTimeBar> GetForLatestDayOnly(MarketDataRequest request)
        {
            if (request == null || !request.IsValid())
            {
                this._logger.LogError("UniverseMarketCache received either a null or invalid request");
                return(MarketDataResponse <EquityInstrumentIntraDayTimeBar> .MissingData());
            }

            this._logger.LogInformation(
                $"UniverseMarketCache fetching for market {request?.MarketIdentifierCode} from {request?.UniverseEventTimeFrom} to {request?.UniverseEventTimeTo} as part of rule run {request?.SystemProcessOperationRuleRunId}");

            if (!this._latestExchangeFrameBook.ContainsKey(request.MarketIdentifierCode))
            {
                this._dataRequestRepository.CreateDataRequest(request);
                this._logger.LogInformation(
                    $"UniverseMarketCache was not able to find the MIC {request.MarketIdentifierCode} in the latest exchange frame book. Recording missing data.");
                return(MarketDataResponse <EquityInstrumentIntraDayTimeBar> .MissingData());
            }

            this._latestExchangeFrameBook.TryGetValue(request.MarketIdentifierCode, out var exchangeFrame);

            if (exchangeFrame == null)
            {
                this._dataRequestRepository.CreateDataRequest(request);
                this._logger.LogInformation(
                    $"UniverseMarketCache was not able to find the MIC {request.MarketIdentifierCode} in the latest exchange frame book. Recording missing data.");
                return(MarketDataResponse <EquityInstrumentIntraDayTimeBar> .MissingData());
            }

            var security =
                exchangeFrame.Securities.FirstOrDefault(sec => Equals(sec.Security.Identifiers, request.Identifiers));

            if (security == null)
            {
                this._dataRequestRepository.CreateDataRequest(request);
                this._logger.LogInformation(
                    $"UniverseMarketCache was not able to find the security {request.Identifiers} for MIC {request.MarketIdentifierCode} in the latest exchange frame book. Recording missing data.");
                return(MarketDataResponse <EquityInstrumentIntraDayTimeBar> .MissingData());
            }

            if (exchangeFrame.Epoch > request.UniverseEventTimeTo ||
                exchangeFrame.Epoch < request.UniverseEventTimeFrom)
            {
                this._dataRequestRepository.CreateDataRequest(request);

                this._logger.LogInformation(
                    $"UniverseMarketCache was not able to find the security {request.Identifiers} for MIC {request.MarketIdentifierCode} in the latest exchange frame book within a suitable data range to {request.UniverseEventTimeTo} from {request.UniverseEventTimeFrom}. Recording missing data.");

                return(MarketDataResponse <EquityInstrumentIntraDayTimeBar> .MissingData());
            }

            this._logger.LogInformation(
                $"UniverseMarketCache was able to find a match for {request.Identifiers} returning data.");
            return(new MarketDataResponse <EquityInstrumentIntraDayTimeBar>(security, false, false));
        }
Exemplo n.º 3
0
        /// <summary>
        ///     Assumes that any data implies that the whole data set/range is covered
        /// </summary>
        public MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > GetMarkets(MarketDataRequest request)
        {
            if (request == null || !request.IsValid())
            {
                this._logger.LogError("UniverseMarketCache received either a null or invalid request");
                return(MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > .MissingData());
            }

            if (!this._marketHistory.TryGetValue(request.MarketIdentifierCode, out var marketStack))
            {
                this._logger.LogInformation(
                    $"UniverseMarketCache GetMarkets was not able to find a market history entry for {request.MarketIdentifierCode}");
                this._dataRequestRepository.CreateDataRequest(request);
                return(MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > .MissingData());
            }

            var securityDataTicks = marketStack.ActiveMarketHistory().Where(amh => amh != null)
                                    .Select(
                amh => amh.Securities?.FirstOrDefault(sec => Equals(sec.Security.Identifiers, request.Identifiers)))
                                    .Where(sec => sec != null).Where(sec => sec.TimeStamp <= request.UniverseEventTimeTo)
                                    .Where(sec => sec.TimeStamp >= request.UniverseEventTimeFrom).ToList();

            if (!securityDataTicks.Any())
            {
                this._logger.LogInformation(
                    $"UniverseMarketCache GetMarkets was not able to find market data for the security on {request.MarketIdentifierCode} with ids {request.Identifiers}");

                this._dataRequestRepository.CreateDataRequest(request);
                return(MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > .MissingData());
            }

            this._logger.LogInformation(
                $"UniverseMarketCache GetMarkets was able to find a market history entry for {request.MarketIdentifierCode} and id {request.Identifiers}");

            return(new MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> >(securityDataTicks, false, false));
        }
Exemplo n.º 4
0
        public MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > GetMarketsForRange(
            MarketDataRequest request,
            IReadOnlyCollection <DateRange> dates,
            RuleRunMode runMode)
        {
            dates = dates?.Where(dat => dat != null)?.ToList();

            if (dates == null || !dates.Any())
            {
                this._logger.LogError(
                    "UniverseMarketCache GetMarketsForRange received either a null or invalid request (dates)");

                return(MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > .MissingData());
            }

            if (request == null || !request.IsValid())
            {
                this._logger.LogError(
                    "UniverseMarketCache GetMarketsForRange received either a null or invalid request");
                return(MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > .MissingData());
            }

            var projectedRequests = dates.Select(
                i => new MarketDataRequest(
                    null,
                    request.MarketIdentifierCode,
                    request.Cfi,
                    request.Identifiers,
                    i.Start,
                    i.End,
                    request.SystemProcessOperationRuleRunId,
                    request.IsCompleted,
                    DataSource.AnyIntraday)).ToList();

            var responseList = new List <MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > >();

            foreach (var paramSet in projectedRequests)
            {
                responseList.Add(this.GetMarkets(paramSet));
            }

            if (!responseList.Any())
            {
                this._logger.LogInformation(
                    $"UniverseMarketCache GetMarketsForRange had missing data for rule run id {request.SystemProcessOperationRuleRunId}");
                return(MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > .MissingData());
            }

            if (runMode == RuleRunMode.ValidationRun && responseList.Any(o => o.HadMissingData))
            {
                this._logger.LogInformation(
                    $"UniverseMarketCache GetMarketsForRange was running a validation run and had missing data for rule run id {request.SystemProcessOperationRuleRunId}");
                return(MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> > .MissingData());
            }

            var isMissingData = responseList.Any(o => o.HadMissingData);
            var responses     = responseList.Where(i => i.Response != null).SelectMany(i => i.Response).ToList();

            if (isMissingData)
            {
                this._logger.LogInformation(
                    $"UniverseMarketCache GetMarketsForRange was running and had missing data for rule run id {request.SystemProcessOperationRuleRunId} but is proceeding on a best effort basis");
            }

            // hide that we're missing data from the consumer
            return(new MarketDataResponse <List <EquityInstrumentIntraDayTimeBar> >(responses, false, true));
        }