Example #1
0
        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);
            }
        }
Example #3
0
        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);
            }
        }
Example #5
0
        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);
            }
        }