public static List <StockSummary> GetStockHistoryFromQuandl(string symbol, DateTime startDate, DateTime endDate, string interval)
        {
            List <StockSummary> list = new List <StockSummary>();

            var fmt = "https://www.quandl.com/api/v3/datasets/WIKI/{0}.csv?auth_token={1}&start_date={2}&end_date={3}";
            // 0: stock symbol
            // auth_token 1: token
            // start_date 2: date yyyy-MM-dd
            // auth_token 3: date yyyy-MM-dd
            var token = "n5zwD2oCokRjh96x_yxV";
            var url   = string.Format(fmt, symbol, token, startDate.ToString("yyyy-MM-dd"), endDate.ToString("yyyy-MM-dd"));

            // get content
            var sb = new StringBuilder();
            var wc = new WebClient();

            IWebProxy defaultProxy = WebRequest.DefaultWebProxy;

            if (defaultProxy != null)
            {
                defaultProxy.Credentials = CredentialCache.DefaultCredentials;
                wc.Proxy = defaultProxy;
            }

            using (var sr = new StreamReader(wc.OpenRead(url)))
            {
                // skip headers
                sr.ReadLine();

                int i = 0;
                // read each line
                for (var line = sr.ReadLine(); line != null; line = sr.ReadLine())
                {
                    var items = line.Split(',');

                    var stock = new StockDetails();
                    stock.Open       = float.Parse(items[1], CultureInfo.InvariantCulture);
                    stock.Close      = float.Parse(items[4], CultureInfo.InvariantCulture);
                    stock.DayHigh    = float.Parse(items[2], CultureInfo.InvariantCulture);
                    stock.DayLow     = float.Parse(items[3], CultureInfo.InvariantCulture);
                    stock.Volume     = double.Parse(items[5], CultureInfo.InvariantCulture);
                    stock.Valid      = true;
                    stock.Symbol     = symbol;
                    stock.DateString = DateTime.Parse(items[0], CultureInfo.InvariantCulture).ToString(@"MM'/'dd'/'yyyy");

                    list.Add(stock);
                }
            }

            return(list);
        }
        public static StockSummary GetStockFromBarchart(string symbol)
        {
            StockDetails stock  = new StockDetails();
            var          fmt    = "https://marketdata.websol.barchart.com/getQuote.csv?apikey={0}&symbols={1}&fields={2}&mode=I&jerq=false";
            var          token  = "a12e94cc748160856f9039fcc6f6177b";
            var          fields = "fiftyTwoWkHigh,fiftyTwoWkLow,settlement,previousSettlement,ask,askSize,bid,bidSize,avgVolume";
            // api key 0: the api key from https://www.barchart.com/ondemand
            // symbols 1:A symbol or code that identifies a financial instrument. Multiple symbols separated by a comma may be used.
            // fields 2: the fields requested
            var url = string.Format(fmt, token, symbol, fields);

            // get content
            var sb = new StringBuilder();
            var wc = new WebClient();

            IWebProxy defaultProxy = WebRequest.DefaultWebProxy;

            if (defaultProxy != null)
            {
                defaultProxy.Credentials = CredentialCache.DefaultCredentials;
                wc.Proxy = defaultProxy;
            }

            using (var sr = new StreamReader(wc.OpenRead(url)))
            {
                // skip headers
                var header  = sr.ReadLine();
                var headers = new List <string>(header.Split(','));

                var line = sr.ReadLine();
                if (line == null)
                {
                    stock.Valid = false;
                }
                else
                {
                    var items = line.Split(',').Select(item => item.Trim('"')).ToArray();
                    stock.Open     = ParseFloat(items[headers.IndexOf("open")]);
                    stock.Close    = ParseFloat(items[headers.IndexOf("close")]);
                    stock.DayHigh  = ParseFloat(items[headers.IndexOf("high")]);
                    stock.DayLow   = ParseFloat(items[headers.IndexOf("low")]);
                    stock.YearHigh = ParseFloat(items[headers.IndexOf("fiftyTwoWkHigh")]); // as requested
                    stock.YearLow  = ParseFloat(items[headers.IndexOf("fiftyTwoWkLow")]);  // as requested
                    stock.Volume   = ParseDouble(items[headers.IndexOf("volume")]);
                    //stock.PreviousVolume = ParseDouble(items[headers.IndexOf("previousVolume")]);
                    stock.Settlement         = ParseDouble(items[headers.IndexOf("settlement")]);         // as requested
                    stock.PreviousSettlement = ParseDouble(items[headers.IndexOf("previousSettlement")]); // as requested
                    stock.Symbol             = items[headers.IndexOf("symbol")];
                    stock.Name               = items[headers.IndexOf("name")];
                    stock.Change             = ParseFloat(items[headers.IndexOf("netChange")]);
                    stock.ChangePercent      = items[headers.IndexOf("percentChange")];
                    stock.Ask                = ParseFloat(items[headers.IndexOf("ask")]);      // as requested
                    stock.Bid                = ParseFloat(items[headers.IndexOf("bid")]);      // as requested
                    stock.AskSize            = ParseInt(items[headers.IndexOf("askSize")]);    // as requested
                    stock.BidSize            = ParseInt(items[headers.IndexOf("bidSize")]);    // as requested
                    stock.AverageDailyVolume = ParseLong(items[headers.IndexOf("avgVolume")]); // as requested
                    stock.LastSale           = ParseFloat(items[headers.IndexOf("lastPrice")]);
                }
            }

            stock.DateString = DateTime.Now.Date.ToString();
            return(stock);
        }