Example #1
0
        public async Task <List <Quote> > GetQuotes(List <string> symbols)
        {
            var existingQuotes = await _stockData.GetQuotes();

            List <Quote> quotesToReuse   = new List <Quote>();
            List <Quote> quotesToRefresh = new List <Quote>();

            foreach (var quote in existingQuotes)
            {
                if (DateTimeOffset.UtcNow.Subtract(quote.UpdatedDate).TotalMinutes > 5)
                {
                    quotesToRefresh.Add(quote);
                }
                else
                {
                    if (symbols.Contains(quote.Symbol))
                    {
                        symbols.Remove(quote.Symbol);
                    }
                    quotesToReuse.Add(quote);
                }
            }

            var symbolsToRetrieve = quotesToRefresh.Select(q => q.Symbol).Union(symbols).Distinct().ToList();

            if (symbolsToRetrieve.Any())
            {
                ConcurrentQueue <Quote> quotes = new ConcurrentQueue <Quote>();
                await Task.WhenAll(symbolsToRetrieve.Select(symbol => Task.Run(async() =>
                {
                    var quote = await _iexClient.GetQuote(symbol);
                    quotes.Enqueue(new Quote
                    {
                        Symbol      = quote.symbol,
                        Price       = quote.latestPrice,
                        QuoteDate   = quote.latestUpdate,
                        UpdatedDate = DateTimeOffset.UtcNow
                    });
                })));

                quotesToRefresh = quotes.ToList();
                await _stockData.SaveQuotes(quotesToRefresh);
            }

            return(quotesToReuse.Union(quotesToRefresh).ToList());
        }
Example #2
0
        public async Task <List <Quote> > GetQuotes(List <string> symbols)
        {
            var existingQuotes = await _stockData.GetQuotes();

            List <Quote> quotesToReuse   = new List <Quote>();
            List <Quote> quotesToRefresh = new List <Quote>();

            foreach (var quote in existingQuotes)
            {
                if (DateTimeOffset.UtcNow.Subtract(quote.UpdatedDate).TotalMinutes > 5)
                {
                    quotesToRefresh.Add(quote);
                }
                else
                {
                    if (symbols.Contains(quote.Symbol))
                    {
                        symbols.Remove(quote.Symbol);
                    }
                    quotesToReuse.Add(quote);
                }
            }

            var symbolsToRetrieve = quotesToRefresh.Select(q => q.Symbol).Union(symbols).Distinct().ToList();

            if (symbolsToRetrieve.Any())
            {
                var quotes = await _alphaClient.Execute(x => x.RequestBatchQuotesAsync(symbolsToRetrieve.ToArray()));

                quotesToRefresh = quotes.Select(q => new Quote
                {
                    Symbol      = q.Symbol,
                    Price       = q.Price,
                    QuoteDate   = q.Time,
                    UpdatedDate = DateTimeOffset.UtcNow
                }).ToList();

                await _stockData.SaveQuotes(quotesToRefresh);
            }

            return(quotesToReuse.Union(quotesToRefresh).ToList());
        }