Exemple #1
0
 static void SingleTest10K()
 {
     do
     {
         Console.WriteLine("What stock?");
         string          stock = Console.ReadLine();
         LucaCloudHelper lch   = new LucaCloudHelper();
         LucaDataPackage ldp   = lch.GetFinancialsAsync(stock, "10-K", DateTime.Now, false).Result;
         string          json  = JsonConvert.SerializeObject(ldp);
         Console.WriteLine(json);
     } while (true);
 }
        public async Task <LucaDataPackage[]> GetHistoricalFinancialsAsync(string symbol, string filing, bool force_calculation)
        {
            if (filing.ToLower() != "10-k" && filing.ToLower() != "10-q")
            {
                throw new Exception("Did not recognize filing '" + filing + "'. Use only '10-K' or '10-Q'.");
            }


            EdgarSearch es = await EdgarSearch.CreateAsync(symbol, filing, null);

            //Get a list of dates to pull (right before each 10-? filing date)
            List <DateTime> BeforeDates = new List <DateTime>();

            foreach (EdgarSearchResult esr in es.Results)
            {
                if (esr.Filing == filing)
                {
                    if (esr.InteractiveDataUrl != null & esr.InteractiveDataUrl != "")
                    {
                        BeforeDates.Add(esr.FilingDate.AddDays(5));
                    }
                }
            }

            //Get a filing to call for the api
            string filing_for_api = "";

            if (filing.ToLower() == "10-k")
            {
                filing_for_api = "10k";
            }
            else if (filing.ToLower() == "10-q")
            {
                filing_for_api = "10q";
            }

            //Assemble a list of calls
            HttpClient hc = new HttpClient();

            hc.Timeout = new TimeSpan(0, 10, 0);
            List <Task <HttpResponseMessage> > responses = new List <Task <HttpResponseMessage> >();

            foreach (DateTime dt in BeforeDates)
            {
                string url = "https://projectluca.azurewebsites.net/api/GetFinancials?";
                url = url + "symbol=" + symbol.Trim().ToLower();
                url = url + "&filing=" + filing_for_api.Trim().ToLower();
                url = url + "&before=" + dt.Month.ToString("00") + dt.Day.ToString("00") + dt.Year.ToString("0000");
                url = url + "&forcecalculation=" + force_calculation.ToString();
                responses.Add(hc.GetAsync(url));
            }



            //Call them
            //Console.WriteLine(responses.Count.ToString() + " requests");
            HttpResponseMessage[] resps = await Task.WhenAll(responses);

            //Console.WriteLine(resps.Length.ToString() + " responses");

            //Parse
            List <LucaDataPackage> statements = new List <LucaDataPackage>();

            foreach (HttpResponseMessage hrm in resps)
            {
                if (hrm.StatusCode == HttpStatusCode.OK)
                {
                    string content = await hrm.Content.ReadAsStringAsync();

                    LucaDataPackage fs = JsonConvert.DeserializeObject <LucaDataPackage>(content);
                    statements.Add(fs);
                }
            }

            return(statements.ToArray());
        }
Exemple #3
0
        public static async Task <HttpResponseMessage> GetFinancialsAsync([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req, ILogger log)
        {
            string symbol           = req.Query["symbol"];
            string filing           = req.Query["filing"];
            string before           = req.Query["before"];
            string forcecalculation = req.Query["forcecalculation"];

            //Report
            log.LogInformation("Symbol: " + symbol);
            log.LogInformation("Filing: " + filing);
            log.LogInformation("Before: " + before);
            log.LogInformation("Force Calculation: " + forcecalculation);

            //Symbol
            if (symbol == null)
            {
                HttpResponseMessage ToReturn = new HttpResponseMessage(HttpStatusCode.BadRequest);
                StringContent       sc       = new StringContent("Critical request error: symbol was blank.", System.Text.Encoding.UTF8);
                ToReturn.Content = sc;
                return(ToReturn);
            }
            symbol = symbol.Trim().ToLower();

            //Filing
            FilingWithXbrlDocument FilingRequest;

            if (filing != null)
            {
                if (filing.ToLower() == "10q")
                {
                    FilingRequest = FilingWithXbrlDocument.Filing10q;
                }
                else if (filing.ToLower() == "10k")
                {
                    FilingRequest = FilingWithXbrlDocument.Filing10k;
                }
                else
                {
                    HttpResponseMessage ToReturn = new HttpResponseMessage(HttpStatusCode.BadRequest);
                    StringContent       sc       = new StringContent("Fatal request error: value '" + filing + "' was not understood.  Options are '10k' or '10q'.", System.Text.Encoding.UTF8);
                    ToReturn.Content = sc;
                    return(ToReturn);
                }
            }
            else
            {
                HttpResponseMessage ToReturn = new HttpResponseMessage(HttpStatusCode.BadRequest);
                StringContent       sc       = new StringContent("Fatal request error: parameter 'filing' was blank but is a required parameter.", System.Text.Encoding.UTF8);
                ToReturn.Content = sc;
                return(ToReturn);
            }


            //Before
            //Format for the before request: MMDDYYYY
            DateTime BeforeRequest = DateTime.UtcNow;

            if (before != null)
            {
                try
                {
                    string monthstr = before.Substring(0, 2);
                    string daystr   = before.Substring(2, 2);
                    string yearstr  = before.Substring(4, 4);
                    BeforeRequest = new DateTime(Convert.ToInt32(yearstr), Convert.ToInt32(monthstr), Convert.ToInt32(daystr));
                    log.LogInformation("Before date used for EDGAR query: " + BeforeRequest.ToShortDateString());
                }
                catch
                {
                    HttpResponseMessage ToReturn = new HttpResponseMessage(HttpStatusCode.BadRequest);
                    StringContent       sc       = new StringContent("Fatal request error: unable to parse 'before' parameter of value '" + before + "' to DateTime format.", System.Text.Encoding.UTF8);
                    ToReturn.Content = sc;
                    return(ToReturn);
                }
            }


            //Force Calculation
            bool ForceCalculationRequest = false;

            if (forcecalculation != null)
            {
                if (forcecalculation.ToLower() == "true")
                {
                    ForceCalculationRequest = true;
                }
                else if (forcecalculation.ToLower() == "false")
                {
                    ForceCalculationRequest = false;
                }
                else
                {
                    HttpResponseMessage ToReturn = new HttpResponseMessage(HttpStatusCode.BadRequest);
                    StringContent       sc       = new StringContent("Critical request error: value '" + forcecalculation + "' was not recognized as a valid value for parameter 'forcecalculation'.  Value should either be 'true' or 'false'.", System.Text.Encoding.UTF8);
                    ToReturn.Content = sc;
                    return(ToReturn);
                }
            }

            //Create Luca Manager Client
            LucaManager lm;

            try
            {
                lm = LucaManager.Create();
            }
            catch
            {
                HttpResponseMessage ToReturn = new HttpResponseMessage(HttpStatusCode.InternalServerError);
                StringContent       sc       = new StringContent("Internal error: unable to establish connection to Luca storage.", System.Text.Encoding.UTF8);
                ToReturn.Content = sc;
                return(ToReturn);
            }

            //Get the Financial Statement
            try
            {
                log.LogInformation("Downloading financial statement...");
                LucaDataPackage ldp = await lm.DownloadLucaDataPackageAsync(symbol, FilingRequest, BeforeRequest, ForceCalculationRequest);

                string asJson = JsonConvert.SerializeObject(ldp);

                HttpResponseMessage hrm = new HttpResponseMessage(HttpStatusCode.OK);
                StringContent       sc  = new StringContent(asJson, System.Text.Encoding.UTF8, "application/json");
                hrm.Content = sc;
                return(hrm);
            }
            catch (Exception e)
            {
                HttpResponseMessage ToReturn = new HttpResponseMessage(HttpStatusCode.InternalServerError);
                StringContent       sc       = new StringContent("Fatal error while downloading financial statement.  Internal error message: " + e.Message, System.Text.Encoding.UTF8);
                ToReturn.Content = sc;
                return(ToReturn);
            }
        }