public async Task GetStockPrices(int dividend, long marketCapMoreThan, DateTime from, DateTime to, string sector, long volumeMoreThan) { await _stocksRepository.DeleteAllStockPriceHistoricEntities(); var sortedStocks = await _stockListService.GetSortedStocks(new DCFRequest() { DividendMoreThan = dividend, MarketCapMoreThan = marketCapMoreThan, Sector = sector, VolumeMoreThan = volumeMoreThan }); var splitList = ListExtensions.Split(sortedStocks, 5); foreach (var stockItem in splitList) { var dbEntities = new List <StockPriceHistoricEntity>(); var stockSymbols = StringExtensions.GetSymbolsString(stockItem.Select(x => x.Symbol).ToArray()); var historicPrices = await _stockPriceService.GetHistoricPrices(stockSymbols, from, to); if (historicPrices.HistoricalStockList != null) { foreach (var historicPrice in historicPrices.HistoricalStockList) { var stockEntities = _mapper.Map <List <StockPriceHistoricEntity> >(historicPrice.Historical); foreach (var stockEntity in stockEntities) { stockEntity.Symbol = historicPrice.Symbol; } dbEntities.AddRange(stockEntities); } } await _stocksRepository.SaveStockPriceHistoricEntities(dbEntities); } var spyPrice = await _stockPriceService.GetHistoricPrices($"SPY?from={from.ToString("yyyy-MM-dd")}&to={to.ToString("yyyy-MM-dd")}"); var spyEntities = _mapper.Map <List <StockPriceHistoricEntity> >(spyPrice.Historical); foreach (var stockEntity in spyEntities) { stockEntity.Symbol = spyPrice.Symbol; } spyEntities.AddRange(spyEntities); await _stocksRepository.SaveStockPriceHistoricEntities(spyEntities); }
public async Task <RedditDdDtoList> GetStockPricesForUi(List <RedditDdDto> dtos, RedditOtherRequest request) { string pattern = @"[A-Z]{2,}"; var regex = new Regex(pattern); var tickers = new List <string>(); var validatedTickers = new List <string>(); var stockList = await _stockListService.GetStockList(); foreach (var dto in dtos) { if (!string.IsNullOrWhiteSpace(dto.title)) { var potentialTickers = dto.title.Split(); var uppercaseTickers = new List <string>(); foreach (var val in potentialTickers) { var match = regex.Match(val); if (!string.IsNullOrWhiteSpace(match.Value) && !StockLists.TickerBlackList.Contains(match.Value)) { if (!tickers.Contains(match.Value)) { tickers.Add(match.Value); } uppercaseTickers.Add(match.Value); } } dto.PotentialTickers = uppercaseTickers; } } foreach (var ticker in tickers) { if (stockList.Select(x => x.Symbol).Contains(ticker)) { validatedTickers.Add(ticker); } } var result = new List <StockPriceHistoric>(); if (validatedTickers.Count != 0) { var stockSplits = ListExtensions.Split(validatedTickers, 5); foreach (var stockSplit in stockSplits) { var stockSymbols = StringExtensions.GetSymbolsString(stockSplit); var prices = await _stockPriceService.GetHistoricPrices(stockSymbols, DateTime.Now.AddDays(-100), DateTime.Now); if (prices.HistoricalStockList != null) { foreach (var price in prices.HistoricalStockList) { result.Add(price); } } } } foreach (var dto in dtos) { dto.Prices = new StockPricesForUi(); foreach (var potentialTicker in dto.PotentialTickers) { var prices = result.Where(x => x.Symbol.Contains(potentialTicker)).ToList(); if (prices.Count != 0 && prices[0].Historical != null && prices[0].Historical.Count >= 61) { dto.Ticker = prices[0].Symbol; if (prices[0].Historical[0] != null) { if (prices[0]?.Historical[1] != null) { dto.Prices.Day = new StockPriceForUi() { Performance = decimal.Round(((prices[0].Historical[0].AdjClose - prices[0].Historical[1].AdjClose) / prices[0].Historical[1].AdjClose), 2, MidpointRounding.AwayFromZero) //.ToString("P2", new NumberFormatInfo { PercentPositivePattern = 1, PercentNegativePattern = 1 }) }; } if (prices[0]?.Historical[5] != null) { dto.Prices.Week = new StockPriceForUi() { Performance = decimal.Round(((prices[0].Historical[0].AdjClose - prices[0].Historical[5].AdjClose) / prices[0].Historical[5].AdjClose), 2, MidpointRounding.AwayFromZero) //.ToString("P2", new NumberFormatInfo { PercentPositivePattern = 1, PercentNegativePattern = 1 }) }; } if (prices[0]?.Historical[20] != null) { dto.Prices.Month = new StockPriceForUi() { Performance = decimal.Round(((prices[0].Historical[0].AdjClose - prices[0].Historical[20].AdjClose) / prices[0].Historical[20].AdjClose), 2, MidpointRounding.AwayFromZero) //.ToString("P2", new NumberFormatInfo { PercentPositivePattern = 1, PercentNegativePattern = 1 }) }; } if (prices[0]?.Historical[60] != null) { dto.Prices.ThreeMonths = new StockPriceForUi() { Performance = decimal.Round(((prices[0].Historical[0].AdjClose - prices[0].Historical[60].AdjClose) / prices[0].Historical[60].AdjClose), 2, MidpointRounding.AwayFromZero) //.ToString("P2", new NumberFormatInfo { PercentPositivePattern = 1, PercentNegativePattern = 1 }) }; } } } } } return(new RedditDdDtoList() { Aggregated = GetAggregateds(dtos), Items = dtos, Paging = new PagingModel() { Page = request.Page, PageSize = request.RowsPerPage, TotalItems = result.Count } }); }
public async Task <IActionResult> StockPrice(string ticker) { var result = await _stockPriceService.GetHistoricPrices(ticker); return(Ok(result)); }