public async Task DownloadSummaryAsync() { if (Symbol == "") { throw new Exception("Stock symbol not provided."); } try { Summary = await EquitySummaryData.CreateAsync(Symbol); } catch { throw new Exception("Fatal error while downloading summary data."); } }
public static async Task <EquitySummaryData> CreateAsync(string symbol) { EquitySummaryData ToReturn = new EquitySummaryData(); ToReturn.QueriedSymbol = symbol.ToUpper().Trim(); //Get from yahoo finance string url = "https://finance.yahoo.com/quote/" + symbol; HttpClient cl = new HttpClient(); HttpResponseMessage hrm = await cl.GetAsync(url); string web = await hrm.Content.ReadAsStringAsync(); //Test for invalid if (web.ToLower().Contains(">Please check your spelling.".ToLower())) { throw new Exception("Stock '" + symbol + "' is not a valid stock symbol."); } int loc1; int loc2; List <string> splitter = new List <string>(); //The name and price were left outside of a try bracket intentionally. //This should be the minimum amount of information that can be accessed. If you can't get this, fail. //Get name and stock symbol string name_and_stock_symbol = ToReturn.GetDataByClassName(web, "D(ib) Fz(18px)"); loc1 = name_and_stock_symbol.IndexOf("("); ToReturn.Name = name_and_stock_symbol.Substring(0, loc1 - 1).Trim(); ToReturn.Name = ToReturn.Name.Replace("&", "&"); ToReturn.Name = ToReturn.Name.Replace("'", "'"); loc2 = name_and_stock_symbol.IndexOf(")", loc1 + 1); ToReturn.StockSymbol = name_and_stock_symbol.Substring(loc1 + 1, loc2 - loc1 - 1); //Get price ToReturn.Price = System.Convert.ToSingle(ToReturn.GetDataByClassName(web, "Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")); //Get day change try { loc1 = web.IndexOf("Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px)"); loc1 = web.IndexOf(">", loc1 + 1); loc2 = web.IndexOf("<", loc1 + 1); string dayc = web.Substring(loc1 + 1, loc2 - loc1 - 1); splitter.Clear(); splitter.Add(" "); string[] partsdc = dayc.Split(splitter.ToArray(), StringSplitOptions.None); ToReturn.DollarChange = System.Convert.ToSingle(partsdc[0].Replace("+", "")); ToReturn.PercentChange = System.Convert.ToSingle(partsdc[1].Replace("+", "").Replace("(", "").Replace(")", "").Replace("%", "").Trim()) / 100; } catch { ToReturn.DollarChange = 0; ToReturn.PercentChange = 0; } //Get previous close try { ToReturn.PreviousClose = System.Convert.ToSingle(ToReturn.GetDataByDataTestName(web, "PREV_CLOSE-value")); } catch { ToReturn.PreviousClose = 0; } //Get open try { ToReturn.Open = System.Convert.ToSingle(ToReturn.GetDataByDataTestName(web, "OPEN-value")); } catch { ToReturn.Open = 0; } //Get bid information try { loc1 = 0; loc2 = 0; loc1 = web.IndexOf("BID-value"); loc1 = web.IndexOf(">", loc1 + 1); loc2 = web.IndexOf("<", loc1 + 1); string bid_info = web.Substring(loc1 + 1, loc2 - loc1 - 1); if (bid_info == "") { loc1 = web.IndexOf(">", loc2 + 1); loc2 = web.IndexOf("<", loc1 + 1); bid_info = web.Substring(loc1 + 1, loc2 - loc1 - 1); } splitter.Clear(); splitter.Add(" x "); string[] parts = bid_info.Split(splitter.ToArray(), StringSplitOptions.None); ToReturn.BidPrice = System.Convert.ToSingle(parts[0]); ToReturn.BidQuantity = System.Convert.ToInt32(parts[1]); } catch { ToReturn.BidPrice = 0; ToReturn.BidQuantity = 0; } //Get ask informmation try { loc1 = 0; loc2 = 0; loc1 = web.IndexOf("ASK-value"); loc1 = web.IndexOf(">", loc1 + 1); loc2 = web.IndexOf("<", loc1 + 1); string ask_info = web.Substring(loc1 + 1, loc2 - loc1 - 1); if (ask_info == "") { loc1 = web.IndexOf(">", loc2 + 1); loc2 = web.IndexOf("<", loc1 + 1); ask_info = web.Substring(loc1 + 1, loc2 - loc1 - 1); } splitter.Clear(); splitter.Add(" x "); string[] parts2 = ask_info.Split(splitter.ToArray(), StringSplitOptions.None); ToReturn.AskPrice = System.Convert.ToSingle(parts2[0]); ToReturn.AskQuantity = System.Convert.ToInt32(parts2[1]); } catch { ToReturn.AskPrice = 0; ToReturn.AskQuantity = 0; } //Get Day Range information try { loc1 = web.IndexOf("DAYS_RANGE-value"); loc1 = web.IndexOf(">", loc1 + 1); loc2 = web.IndexOf("<", loc1 + 1); string day_range_info = web.Substring(loc1 + 1, loc2 - loc1 - 1); day_range_info = day_range_info.Replace(" ", ""); splitter.Clear(); splitter.Add("-"); string[] parts3 = day_range_info.Split(splitter.ToArray(), StringSplitOptions.None); ToReturn.DayRangeLow = System.Convert.ToSingle(parts3[0].Trim()); ToReturn.DayRangeHigh = System.Convert.ToSingle(parts3[1].Trim()); } catch { ToReturn.DayRangeLow = 0; ToReturn.DayRangeHigh = 0; } //Get Day Range information try { loc1 = web.IndexOf("FIFTY_TWO_WK_RANGE-value"); loc1 = web.IndexOf(">", loc1 + 1); loc2 = web.IndexOf("<", loc1 + 1); string year_range_info = web.Substring(loc1 + 1, loc2 - loc1 - 1); year_range_info = year_range_info.Replace(" ", ""); splitter.Clear(); splitter.Add("-"); string[] parts4 = year_range_info.Split(splitter.ToArray(), StringSplitOptions.None); ToReturn.YearRangeLow = System.Convert.ToSingle(parts4[0].Trim()); ToReturn.YearRangeHigh = System.Convert.ToSingle(parts4[1].Trim()); } catch { ToReturn.YearRangeLow = 0; ToReturn.YearRangeHigh = 0; } //Get volume try { ToReturn.Volume = System.Convert.ToInt32(ToReturn.GetDataByDataTestName(web, "TD_VOLUME-value").Replace(",", "")); } catch { ToReturn.Volume = 0; } //Get average volume try { ToReturn.AverageVolume = System.Convert.ToInt32(ToReturn.GetDataByDataTestName(web, "AVERAGE_VOLUME_3MONTH-value").Replace(",", "")); } catch { ToReturn.AverageVolume = 0; } //Get market cap try { string market_cap = ToReturn.GetDataByDataTestName(web, "MARKET_CAP-value"); string last_char = market_cap.Substring(market_cap.Length - 1, 1).ToLower(); float mcf = System.Convert.ToSingle(market_cap.Substring(0, market_cap.Length - 1)); if (last_char == "th") { ToReturn.MarketCap = System.Convert.ToDouble(mcf * 1000); } else if (last_char == "m") { ToReturn.MarketCap = System.Convert.ToDouble(mcf * 1000000); } else if (last_char == "b") { ToReturn.MarketCap = System.Convert.ToDouble(mcf * 1000000000); } else if (last_char == "t") { ToReturn.MarketCap = System.Convert.ToDouble(mcf * 1000000000000); } } catch { ToReturn.MarketCap = 0; } //Get beta try { ToReturn.Beta = System.Convert.ToSingle(ToReturn.GetDataByDataTestName(web, "BETA_5Y-value")); } catch { ToReturn.Beta = null; } //Get PE Ratio try { ToReturn.PriceEarningsRatio = System.Convert.ToSingle(ToReturn.GetDataByDataTestName(web, "PE_RATIO-value")); } catch { ToReturn.PriceEarningsRatio = null; } //Get EPS ratio try { ToReturn.EarningsPerShare = System.Convert.ToSingle(ToReturn.GetDataByDataTestName(web, "EPS_RATIO-value")); } catch { ToReturn.EarningsPerShare = 0; } //Get earnings date try { ToReturn.EarningsDate = DateTime.Parse(ToReturn.GetDataByDataTestName(web, "EARNINGS_DATE-value")); } catch { ToReturn.EarningsDate = null; } //Get Forward Dividend Info try { loc1 = web.IndexOf("DIVIDEND_AND_YIELD-value"); loc1 = web.IndexOf(">", loc1 + 1); loc2 = web.IndexOf("<", loc1 + 1); string dividendinfo = web.Substring(loc1 + 1, loc2 - loc1 - 1); if (dividendinfo == "N/A (N/A)") { ToReturn.ForwardDividend = null; ToReturn.ForwardDividendYield = null; } else { splitter.Clear(); splitter.Add(" "); string[] partsfd = dividendinfo.Split(splitter.ToArray(), StringSplitOptions.None); ToReturn.ForwardDividend = System.Convert.ToSingle(partsfd[0]); ToReturn.ForwardDividendYield = System.Convert.ToSingle(partsfd[1].Replace("%", "").Replace("(", "").Replace(")", "")) / 100; } } catch { ToReturn.ForwardDividend = 0; ToReturn.ForwardDividendYield = 0; } //Get ex-dividend date try { ToReturn.ExDividendDate = DateTime.Parse(ToReturn.GetDataByDataTestName(web, "EX_DIVIDEND_DATE-value")); } catch { ToReturn.ExDividendDate = null; } //Get one year targets try { ToReturn.YearTargetEstimate = System.Convert.ToSingle(ToReturn.GetDataByDataTestName(web, "ONE_YEAR_TARGET_PRICE-value")); } catch { ToReturn.YearTargetEstimate = 0; } return(ToReturn); }
private EquitySummaryData[] GetEquitySummariesFromWebData(string web_data) { int loc1 = 0; int loc2 = 0; List <string> Splitter = new List <string>(); loc1 = web_data.IndexOf("<tbody"); loc2 = web_data.IndexOf("</tbody>", loc1 + 1); string table_data = web_data.Substring(loc1 + 1, loc2 - loc1 - 1); //Split into rows Splitter.Clear(); Splitter.Add("<tr class"); string[] rows = table_data.Split(Splitter.ToArray(), StringSplitOptions.None); //Get all data List <EquitySummaryData> ToReturn = new List <EquitySummaryData>(); int r = 0; for (r = 1; r < rows.Length; r++) { EquitySummaryData esd = new EquitySummaryData(); Splitter.Clear(); Splitter.Add("<td "); string[] cols = rows[r].Split(Splitter.ToArray(), StringSplitOptions.None); //Get symbol try { loc1 = cols[1].IndexOf("a href"); loc1 = cols[1].IndexOf(">", loc1 + 1); loc2 = cols[1].IndexOf("<", loc1 + 1); esd.StockSymbol = cols[1].Substring(loc1 + 1, loc2 - loc1 - 1); } catch { esd.StockSymbol = "?"; } //Get name try { loc1 = cols[2].IndexOf("react-text"); loc1 = cols[2].IndexOf(">", loc1 + 1); loc2 = cols[2].IndexOf("<", loc1 + 1); esd.Name = cols[2].Substring(loc1 + 1, loc2 - loc1 - 1); esd.Name = esd.Name.Replace("'", "'"); esd.Name = esd.Name.Replace("&", "&"); } catch { esd.Name = ""; } //Get price try { loc1 = cols[3].IndexOf("span class"); loc1 = cols[3].IndexOf(">", loc1 + 1); loc2 = cols[3].IndexOf("<", loc1 + 1); esd.Price = Convert.ToSingle(cols[3].Substring(loc1 + 1, loc2 - loc1 - 1)); } catch { esd.Price = 0; } //Get dollar change try { loc1 = cols[4].IndexOf("span class"); loc1 = cols[4].IndexOf(">", loc1 + 1); loc2 = cols[4].IndexOf("<", loc1 + 1); esd.DollarChange = Convert.ToSingle(cols[4].Substring(loc1 + 1, loc2 - loc1 - 1).Replace("+", "")); } catch { esd.DollarChange = 0; } //Get Percent Change try { loc1 = cols[5].IndexOf("span class"); loc1 = cols[5].IndexOf(">", loc1 + 1); loc2 = cols[5].IndexOf("<", loc1 + 1); string PercentChange = cols[5].Substring(loc1 + 1, loc2 - loc1 - 1).Replace("+", "").Replace("%", ""); float percent_change_perc = Convert.ToSingle(PercentChange); percent_change_perc = percent_change_perc / 100; esd.PercentChange = percent_change_perc; } catch { esd.PercentChange = 0; } //Get volume try { loc1 = cols[6].IndexOf("span class"); loc1 = cols[6].IndexOf(">", loc1 + 1); loc2 = cols[6].IndexOf("<", loc1 + 1); string vol = cols[6].Substring(loc1 + 1, loc2 - loc1 - 1); esd.Volume = Convert.ToInt32(YahooFinanceToolkit.GetMarketCapFromString(vol)); } catch { esd.Volume = 0; } //Get average volume try { loc1 = cols[7].IndexOf("react-text"); loc1 = cols[7].IndexOf(">", loc1 + 1); loc2 = cols[7].IndexOf("<", loc1 + 1); string avgvol = cols[7].Substring(loc1 + 1, loc2 - loc1 - 1); esd.AverageVolume = Convert.ToInt32(YahooFinanceToolkit.GetMarketCapFromString(avgvol)); } catch { esd.AverageVolume = 0; } //Get market cap try { loc1 = cols[8].IndexOf("span class"); loc1 = cols[8].IndexOf(">", loc1 + 1); loc2 = cols[8].IndexOf("<", loc1 + 1); string marcap = cols[8].Substring(loc1 + 1, loc2 - loc1 - 1); esd.MarketCap = YahooFinanceToolkit.GetMarketCapFromString(marcap); } catch { esd.MarketCap = 0; } //Get price earnings ratio try { loc1 = cols[9].IndexOf("react-text"); loc1 = cols[9].IndexOf(">", loc1 + 1); loc2 = cols[9].IndexOf("<", loc1 + 1); string pestr = cols[9].Substring(loc1 + 1, loc2 - loc1 - 1); esd.PriceEarningsRatio = Convert.ToSingle(cols[9].Substring(loc1 + 1, loc2 - loc1 - 1)); } catch { esd.PriceEarningsRatio = null; } ToReturn.Add(esd); } return(ToReturn.ToArray()); }