public async Task RetrieveAllFinancialStatements(int whichBatch, int batchSize, int minId, int maxId, StatementFrequency frequency) { var idFrom = minId + (whichBatch - 1) * batchSize; var idTo = minId + (whichBatch * batchSize) - 1; var stocks = _context.Stocks .Include(s => s.FinancialStatements) .ThenInclude(f => f.BalanceSheet) .Include(s => s.FinancialStatements) .ThenInclude(f => f.IncomeStatement) .Include(s => s.FinancialStatements) .ThenInclude(f => f.CashFlowStatement). Where(x => x.Id >= idFrom && x.Id <= idTo); await _financialStatementUpdater.UpdateFinancialStatementsBatchAsync(stocks, frequency); await _context.SaveChangesAsync(); }
private void UpdateStockFinancialStatements(List <FinancialStatement> financialStatements, Stock stock, StatementFrequency frequency) { if (financialStatements.Any(f => f.PrimarySymbol.ToLower().Trim() == stock.Ticker.ToLower().Trim())) { var sourceToDelete = frequency == StatementFrequency.Annual ? "annual" : "quarterly"; stock.FinancialStatements.RemoveAll(f => f.Source == sourceToDelete); var newStatements = financialStatements.Where(f => f.PrimarySymbol.ToLower().Trim() == stock.Ticker.ToLower().Trim()).OrderByDescending(f => f.FiscalYear).ThenByDescending(f => f.FiscalQuarter).ToList(); if (frequency == StatementFrequency.Quarterly) { newStatements = newStatements.Take(4).ToList(); } stock.FinancialStatements.AddRange(newStatements); } }
public async Task <IEnumerable <FinancialStatement> > GetFinancialStatementsBatchSafe(List <string> tickers, StatementFrequency frequency) { var errMax = 2; var currErr = 0; while (currErr < errMax) { try { return(await GetFinancialStatementsBatch(tickers, frequency)); } catch (Exception) { Thread.Sleep(500); currErr++; } } return(await GetFinancialStatementsBatch(tickers, frequency)); }
public async Task UpdateFinancialStatementsBatchAsync(IQueryable <Stock> stocks, StatementFrequency frequency) { var batchSize = 60; var count = await stocks.CountAsync(); List <FinancialStatement> financialStatements = new List <FinancialStatement>(); var batchNumber = (int)Math.Ceiling(count / (double)batchSize); for (var ithBatch = 1; ithBatch <= batchNumber; ithBatch++) { Thread.Sleep(500); var tickers = BuildTickers(stocks, ithBatch, batchNumber, batchSize); financialStatements.AddRange(await _financialStatementService.GetFinancialStatementsBatchSafe(tickers, frequency)); } foreach (var stock in stocks) { UpdateStockFinancialStatements(financialStatements, stock, frequency); } }
public async Task <IEnumerable <FinancialStatement> > GetFinancialStatementsBatch(List <string> tickers, StatementFrequency frequency) { tickers.RemoveAll(x => x.Contains(".")); if (!tickers.Any()) { return(new List <FinancialStatement>()); } var url = string.Format("http://edgaronline.api.mashery.com/v2/corefinancials/{0}.json?primarysymbols={1}&limit=1000&appkey={2}", frequency == StatementFrequency.Annual?"ann":"qtr", string.Join(",", tickers), _apiKey); try { using (System.Net.Http.HttpClient hc = new System.Net.Http.HttpClient()) { var str = await hc.GetStringAsync(url); var statements = ParseFinancialStatements(str, frequency == StatementFrequency.Annual ? "annual" : "quarterly"); return(statements); } } catch (Exception exc) { throw new Exception("url " + url, exc); } }