0

I'm creating a realtime stock quotes application that uses the IEX API (https://iextrading.com/developer/docs/) to get real time infomration. I'm wondering if there is a better way to poll this URL than what I currently have.

string[] Symbols = { "AAPL", "AMD" };

var Url = string.Format("https://api.iextrading.com/1.0/stock/market/batch?symbols={0}&types=quote", string.Join(",", Symbols));

        using (var client = new HttpClient())
        {
            while (true)
            {
                using (var request = new HttpRequestMessage(HttpMethod.Get, Url))
                {

                    using (var response = await client.SendAsync(request))
                    {
                        var stream = await response.Content.ReadAsStringAsync();

                        if (response.IsSuccessStatusCode)
                        {
                            var r = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Quote>>>(stream);
                            Console.WriteLine(JsonConvert.SerializeObject(r[Symbols[0]]["quote"].latestPrice));

                        }
                    }
                }
            }
        }

What I currently have works fine, I'm just wondering if there is a better/more effecient way to do this.

My Quote Class

public class Quote
{
    public string symbol { get; set; }
    public string companyName { get; set; }
    public string primaryExchange { get; set; }
    public string sector { get; set; }
    public string calculationPrice { get; set; }
    public decimal? open { get; set; }
    public decimal? openTime { get; set; }
    public decimal? close { get; set; }
    public decimal? closeTime { get; set; }
    public decimal? high { get; set; }
    public decimal? low { get; set; }
    public decimal? latestPrice { get; set; }
    public string latestSource { get; set; }
    public string latestTime { get; set; }
    public decimal? latestUpdate { get; set; }
    public decimal? latestVolume { get; set; }
    public decimal? iexRealtimePrice { get; set; }
    public decimal? iexRealtimeSize { get; set; }
    public decimal? iexLastUpdated { get; set; }
    public decimal? delayedPrice { get; set; }
    public decimal? delayedPriceTime { get; set; }
    public decimal? extendedPrice { get; set; }
    public decimal? extendedChange { get; set; }
    public decimal? extendedChangePercent { get; set; }
    public decimal? extendedPriceTime { get; set; }
    public decimal? previousClose { get; set; }
    public decimal? change { get; set; }
    public decimal? changePercent { get; set; }
    public decimal? iexMarketPercent { get; set; }
    public decimal? iexVolume { get; set; }
    public decimal? avgTotalVolume { get; set; }
    public decimal? iexBidPrice { get; set; }
    public decimal? iexBidSize { get; set; }
    public decimal? iexAskPrice { get; set; }
    public decimal? iexAskSize { get; set; }
    public decimal? marketCap { get; set; }
    public decimal? peRatio { get; set; }
    public decimal? week52High { get; set; }
    public decimal? week52Low { get; set; }
    public decimal? ytdChange { get; set; }
}
BeLEEver
  • 251
  • 4
  • 11
  • 4
    This isn't really the exact kind of question SO is for. But one thing I'd like to point out is this is a real good way to flood your network with traffic and piss off the API host. You don't have any delay in between requests so you are going to be plastering this thing pretty good. Probably want to put in at least a couple second delay between requests. – Matti Price Nov 13 '18 at 19:57

1 Answers1

1

You might want to see if they have a live quote feed you can just subscribe to and watch.

It's astonishingly inefficient to keep asking for quotes for specific stocks when you don't know if anything has actually changed.

You'll be asking when nothing has changed and delaying unnecessarily when things have changed.

Terry Carmen
  • 3,720
  • 1
  • 16
  • 32