Click here to Skip to main content
Licence Apache
First Posted 23 Sep 2009
Views 135,894
Downloads 4,790
Bookmarked 186 times

Yahoo! Finance Managed

By MaasOne | 26 Nov 2010
Download stock quotes, historic data, rates of exchanges and technical analysis charts from Yahoo! Finance

1

2

3
4 votes, 10.3%
4
35 votes, 89.7%
5
4.89/5 - 39 votes
μ 4.89, σa 0.99 [?]
Release

Introduction

The service that Yahoo! Finance provides to download financial data is nice, but you have to know the right tags and symbols and how to build the URL to use it. This library will undertake this annoying task for you and returns the received string data in managed data classes.

Background

I was working on a Stock Trader application, and used the Yahoo! Finance service as a database. In order to focus on programming this application, I thought it would be better if the receiving of data is a closed unit and if I can control it easily. A strong typed handling of the code is also an objective. So I started creating this library just for downloading finance data and chart images.

Using the Code

This article provides the basic understanding and appliance of the library with the aid of some examples. For the full documentation with object browser, etc. look at the project homepage.

Every example or description needs the following imports:

Imports YahooManaged
Imports YahooManaged.Finance

Download Classes

Here, you can see the main functionalities and download classes you will need to receive the managed data from Yahoo!. You've also different namespaces for these classes to differ the functionalities. At first, you have Finance.API namespace. That is the main namespace for download classes in this project. The containing classes use the official Yahoo! API to receive the data. In contrast to that, you have the Finance.NonAPI namespace. In that namespace, the classes don't use the API. Instead, they are parsing the HTML source of some pages. (It's not the objective of this project to parse HTML source, but the functionalities of these classes are too important). Finance.Support is not really necessary or doesn't provide additional data. The advantage of the classes in this namespace are the more managed result data objects (e.g. you're also able to use API.QuotesDownload to get exchange rates data). RSS namespace has directly nothing to do with Yahoo! Finance, but Yahoo! provides RSS news feeds for some stocks or indices. This namespace just contains a normal RSS 2.0 reader.

  • Finance.API
    • IDSearchDownload: Search for valid Yahoo! Finance IDs by keyword.
    • QuotesBaseDownload: Download base quotes (10 properties).
    • QuotesDownload: Download quotes (up to 85 properties) with different server locations.
    • HistQuotesDownload: Download historic quotes.
    • ChartDownload: Download technical analyzing charts.
    • MarketDownload: Download market overview with sectors, industries and containing companies.
    • MarketQuotesDownload: Download the market quotes of a sector, industry or containing company.
    • CompanyInfoDownload: Download the base information of companies.
  • Finance.NonAPI
    • IDSearchDownload: Search for valid Yahoo! Finance IDs by keyword and other options (including ISIN search).
    • IDListDownload: Download an alphabetical list/tree-structure of countries and their companies with different servers.
    • CompanyStatisticsDownload: Download main and financial statistics of companies.
  • Finance.Support
    • ExchangeRateDownload: Download exchange rates by YCurrencyID.
    • ExchangeRateCalculator: Download exchange rates in relation to a base currency. Provides currency converter.
  • RSS
    • FeedDownload: Download RSS feeds.

Each class inherits from Base.Download (exceptional ExchangeRateCalculator).

Base.Download

The Base.Download class is the base for every download class in this project. In general, it affords the download of the needed data. This class provides a Timeout property, which controls the timeout of the next started download in milliseconds. An alteration of this property has no effect on already started downloads. Furthermore, you have the Proxy property, if you need to set your own proxy credentials. In addition, there is also Base.IStringDownload interface. It provides a TextEncoding property, because this class loads strings without specified encoding and e.g. it's an important issue for names like "Düsseldorf" in search results.
You're not able to use the Base.Download class directly for downloading, because the constructor is protected. Instead if you have to use a specialized download class, e.g. API.QuotesDownload. This is necessary because of different parameters and results (e.g. historic quotes or ID search results).

The Download function of each of these specialized download classes returns a response class that inherits from Base.Response. It generally provides information about the connection and eventual errors and also the result as Object.
Every Download function has an equivalent sub method called DownloadAsync. This sub provides multiple asynchronous download processes, which returns the results back into GUI thread. You are able to pass a user argument as parameter, when starting the download to identify the instance. Because of this functionality to start multiple processes, you have different properties and functions to control these processes. AsyncDownloadCount shows you the number of currently running downloads. Contains proves how many async download sessions own the passed user argument (parameter when you start the download; optional in VB.NET). With the same user argument, you are able to stop one or all downloads with CancelAsync function. The end of the download will be indicated by AsyncDownloadCompleted event that provides the response, user args and other parameters. It'll be raised in every case of completing the download (regular end, cancel, timeout, error).

The download structure of Base.Download and Base.Response provides a reliable, save and standardized method to download the needed data.

Servers

You're able to choose between different servers where you can download quote data, etc. For this, you have the Server enum with the different locations of servers. You can't download all data from every server, because not every server has all data or can get them. In my experience, the European and US servers have been relatively more reliable. Also, you have the option to choose the YQL server. This server is different from all other servers in the list. YQL is the latest Web Service of Yahoo!, that concentrates all Yahoo! Web Services in one API, the "Yahoo Query Language". It's similar to SQL syntax, and you're receiving XML data instead of CSV, but this issue doesn't matter to the appliance of the library. If you're using the Compact Framework version (and developing for mobile devices), the download traffic can be an important issue and XML needs more text for the same data than CSV. The YQL server has the same location and same data like USA server. In many cases, YQL is just a "SQL syntax/XML-JSON result wrapper" for USA server. If a name of a company is too long, Yahoo will truncate it, if you're using American servers like USA, YQL, Canada or Argentina. European servers like Germany, France, Italy or Spain have not a problem with that. Also a problem with American servers is the result count of maximum 51 at downloading quotes of components of indices (e.g. "@^IXIC").

IID

The IID Interface will be accepted as parameter for downloading with the most download classes that need Yahoo! Finance IDs. These classes are QuotesBaseDownload, QuotesDownload, HistQuotesDownload, ChartDownload,QuoteOptionsDownload and MarketDownload. The Interface has just the readonly ID property that returns a valid Yahoo! Finance ID. Instead of passing IIDs for downloading, you're additionally able to pass simple Strings. With some classes, you're able to set the ID with SetID sub. These classes implement the Interface ISettableID, which inherits from IID.
The classes which implement the IID interface are YID, YIndexID, YCurrencyID, IDSearchResult, QuoteBaseData, QuoteData, HistQuoteDataChain, QuoteOptionDataChain and CompanyData. Certainly, you're free to implement this interface in your own classes.

IDSearch

Before you start downloading quotes, you have to have the correct Yahoo! Finance ID of the stock or index, etc. To get these IDs, you can use the IDSearchDownload classes in the namespaces API and NonAPI. The API.IDSearchDownload is very simple, because you are only able to search for a keyword (with using two different servers). You will get back an IDSearchResponse and an array of IDSearchResults where the results are saved.

Dim sdl As New API.IDSearchDownload
'sdl.Server = IDSearchServer.SpanishUS
Dim resp As API.IDSearchResponse = sdl.Download("dow jones")
For Each res As IDSearchResult In resp.Result
    Debug.Write(res.ID)
    Debug.Write(" - ")
    Debug.WriteLine(res.Name)
Next

The NonAPI.IDSearchDownload is more complex and you have the additional property Option where you can set filters like market, type, ranking or maximum results. After setting the options (or let it by default) you're able to start the download. At this time, it's only possible to start an async download, but in future I will revise this class, so that you will have a normal Download-function.

The problem with this class is the relatively high traffic and the bad performance, because this class downloads raw HTML from Yahoo! and analyses it with RegEx. It's also possible that Yahoo! changes the source of their pages, so if you're using the NonAPI.IDSearchDownload, you always should use the latest version of this library. But, in a lot of cases, with this class you will also get some results when the API.IDSearch doesn't find anything.

If you want to search for or with ISINs, use the NonAPI.IDSearchDownload class and set the ISINIncluded property in the IDSearchOptions True. Then the downloader uses a European server. The default US server will not find any ISINs, except the ISIN is part of the ID.

For an example with NonAPI.IDSearchDownload, please take a look to AsyncDownload section of this article. I'm using this class to show how async downloading is possible.

QuotesBaseDownload

The first quote download class I want to show is API.QuotesBaseDownload class. With this class, you're able to download basic quotes data of one or more IDs. (It's also possible to download currency exchanges with this class, but I recommend using the Support.ExchangeRateDownload class for this issue). You'll get back an array of QuoteBaseData class and it has 8 fixed properties like ID and price, and the two calculated properties PreviewClose and ChangeInPercent.

Before you start downloading, you will need the IDs.

Dim symbols() As String = {"ABBN.VX", "AA", "BAS.DE", "MMM"}
'or with managed YIDs
'Dim symbols() As Support.YID = {New Support.YID("ABBN.VX"), New Support.YID("AA")}
'and from IDSearchResult/YID
'Dim symbols() As Support.YID = (From res As IDSearchResult _
	In results Select New Support.YID(res)).ToArray

QuotesBaseDownload and other download classes that accept IEnumerable(Of IID) as download parameter have a problem to accept, i.e. List(Of Support.YID), although it implements IID and List(Of T) implements IEnumerable(Of T). There is no problem with an Array of Support.YID, because a list also provides incoming data. That's not a problem of the library or the code I wrote. It's a logic failure in managed .NET code and it's called the "Co- and Contravariance" problem, that was solved only on .NET Framework 4.0. On version 2.0, 3.0 and 3.5, you have to use the .ToArray function of the List(Of T), because an Array of YID will be accepted as IEnumerable(Of IID).

For downloading quotes with QuotesBaseDownload, you just have to declare the downloader class and call the Download function with one or more IDs as parameter.

Dim qbdl As New API.QuotesBaseDownload
Dim resp As API.QuotesBaseResponse = qbdl.Download(symbols)
For Each qd As QuoteBaseData In resp.Result
    Debug.Write(qd.ID & ";")
    Debug.WriteLine(qd.LastTradePriceOnly.ToString)
Next

QuotesDownload

For downloading some quotes with API.QuotesDownload class, the Download function needs the symbols/IDs and additionally requires the properties you want to get and the server you want to use.

Dim properties() As QuoteProperty = New QuoteProperty() {QuoteProperty.Name, _
                                        QuoteProperty.Symbol, _
                                        QuoteProperty.LastTradePriceOnly, _
                                        QuoteProperty.ChangeinPercent}

If you pass Nothing for the properties parameter, LastTradePrizeOnly will be set automatically. Then, create a new QuotesDownload class and start class and start the download.

Dim qdl As New API.QuotesDownload
Dim resp As API.QuotesResponse = qdl.Download(symbols, properties, Server.YQL)
For Each qd As QuoteData In resp.Result
    Debug.Write(qd(QuoteProperty.Name).ToString & ";")
    Debug.WriteLine(qd(QuoteProperty.LastTradePriceOnly).ToString)
Next

Downloading with stock index information is nearly the same. You can declare YIndexIDs, instead of YIDs or raw stock symbol strings. You can use every IEnumerable(Of IID) for downloading quotes.

Dim index As New Support.YIndexID("^GDAXI", True)
'Dim index As Support.YIndexID = Support.WorldMarket.AllIndices(0)
'index.DownloadComponents = True

Dim qdl As New API.QuotesDownload
Dim resp As API.QuotesResponse = qdl.Download(index, properties, Server.YQL)
Dim resp2 As API.QuotesResponse = qdl.Download_
	(Support.WorldMarket.AllFinanceIndices, properties, Server.YQL)

HistQuotesDownload

With API.HistQuotesDownload class, you're able to download the historic quotes of one or more Yahoo! Finance IDs. As a result, you will get an array of HistQuoteDataChains that stores the values of the trading periods. Each chain represents the results of each passed ID. HistQuoteDataChain inherits from List(Of HistQuoteData). Each instance of the chain is one trading period. You can get data from 1990 (I think so) until today. Just create a new instance, and start the download with the required parameters (ID; start date; end date; interval).

Dim hqdl As New API.HistQuotesDownload
Dim resp As API.HistQuotesResponse = _
	hqdl.Download("BAS.DE", #1/1/2000#, Date.Today, HistQuotesInterval.Weekly)
For Each hqdc As HistQuotesDataChain In resp.Result
    For Each hqd As HistQuoteData In hqdc
        Debug.Write(hqd.TradingDate.ToShortDateString & ";")
        Debug.Write(hqd.Open.ToString("n") & ";")
        Debug.Write(hqd.Close.ToString("n") & ";")
        Debug.WriteLine(hqd.CloseAdjusted.ToString("n"))
    Next
Next

Downloading historic quotes of currency exchanges is not possible in most cases. I don't know why it's not full available, as Yahoo! must have the data, because you're able to download the (historic) image, and for that, they need the data.

ChartDownload

Now, we will have a look at the API.ChartDownload class. This download class also has the Option property to set properties like image size, time span, chart type, indicators, server, etc. In case you don't set France, Germany, Italy, Spain or UK as server, the image downloader will automatically use USA server.

Dim cdl As New API.ChartDownload
With cdl.Options
    .ImageSize = ChartImageSize.Middle
    .TimeSpan = ChartTimeSpan.c3M
    .Scale = ChartScale.Logarithmic
    .Server = Server.USA
    .Culture = Culture.DefaultCultures.Germany
    .Type = ChartType.Line
    .MovingAverages.Add(MovingAverageInterval.m20)
    .TechnicalIndicators.Add(TechnicalIndicator.Bollinger_Bands)
    .ComparingIDs.Add("GOOG")
End With
Dim resp As Base.StreamResponse = cdl.Download("MSFT")
Dim img As Image = Image.FromStream(resp.Result)

In this example, it's the image of BASF in middle size with a 3 month period, and the indicator moving average for a 5 days average period. If you choose, e.g., a 1 day period, the moving average has a period of 5 minutes. So it's always a much smaller unit. Also you will get with that setting a scale description of German culture. With US server, you're able to set a culture of your choice that will influence the scale description (or sometimes only the copyright symbol, e.g. with New Zealand). For that, I created the Culture class with Region and Language information.This class also contains the sub class DefaultCultures where you have a choice of all Yahoo! supported cultures. That doesn't mean that every culture will have an effect on Yahoo! Finance chart download. These cultures are generally valid for Yahoo! APIs.
The result of the download is a IO.MemoryStream, because I'm using this library for a WPF project, but you should also be able to use it in WinForms. So, a stream is the logical compromise.

Now, I could go on listing the examples, but there is no big difference between the single download classes. The principle is everytime the same, just the parameters and results are changing. If you are looking for more examples of other download classes, use the console test application of this article or explore the wiki of the project homepage.
I will show you now how to start and handle an async download in general.

Async Download

For every Download function in every download class, there is an AsyncDownload method. This method requires the same parameters like Download function and additionally an (optional) user argument. Also every download class provides an AsyncDownloadCompleted event that indicates the end of download process. This event always has the parameters sender and e. sender is the event raising instance as Base.Download and e is a specialised event argument that always inherits from Base.DownloadCompletedEventArgs. This base class provides the result of the download as Object and provides the ConnectionInfo of download process. This class provides information like success, errors, user cancellation or received data size.

Here an example with API.QuotesBaseDownload:

Private Sub StartAsyncDownload()
    Dim userArgs As New IO.FileInfo("c:\data.txt")
    Dim ids() As String = New String() {"msft", "goog"}

    Dim dl As New API.QuotesBaseDownload
    AddHandler dl.AsyncDownloadCompleted, AddressOf Me.AsyncDownload_Completed
    dl.DownloadAsync(ids, userArgs)
End Sub

At first, I declared the user argument and the ids for downloading. You're free to take a user argument of your choice. The parameter is of type System.Object and in this example I chose a System.IO.FileInfo. The ids are from Microsoft and Google. After that, you have to declare the downloader instance and set the delegate for AsyncDownloadCompleted event. In Visual Basic, you're also able to declare a global WithEvents variable and to use the Handles clause.
Then you need to create a second sub method for getting the data via event raising.

Private Sub AsyncDownload_Completed(ByVal sender As Base.Download, _
	ByVal e As API.QuotesBaseDownloadCompletedEventArgs)
    RemoveHandler DirectCast(sender, API.QuotesBaseDownload).AsyncDownloadCompleted, _
	AddressOf Me.AsyncDownload_Completed

    Dim ids() As String = e.IDs

    Dim userArgs As Object = e.UserArgs
    Dim myUserArgs As IO.FileInfo = DirectCast(userArgs, IO.FileInfo)

    Dim bResp As Base.Response = DirectCast(e.Response, Base.Response)
    Dim mngResp As API.QuotesBaseResponse = e.Response

    Dim conn As Base.ConnectionInfo = bResp.Connection
    Dim success As Boolean = conn.Success

    Dim bResult As Object = bResp.Result
    Dim mngResult() As QuoteBaseData = DirectCast(bResult, QuoteBaseData())
    Dim mngResult2() As QuoteBaseData = mngResp.Result

    For Each q As QuoteBaseData In e.Response.Result
        '...
    Next
End Sub

Now you have the parameters sender and e. With sender, you can remove the delegate and with e you're able to get the response, user argument (FileInfo) and the passed parameters (IDs), when you started the download process. The Response is the same one like you would get with Download function.

Async Download of NonAPI.IDsearch

NonAPI.IDSearch class is a little bit special, because there you have additionally the AsyncDownloadChanged event. This class needs one download session to get 20 or 50 (with ISINIncluded) results. If a download session finished but the maximum number of results is not reached, the AsyncDownloadChanged event will be raised. The last download session raises the AsyncDownloadCompleted event. It will have maximum 4 parallel download processes.

Public Sub StartAsyncIDSearch()
    Dim keyword As String = "dow jones"
    
    Dim dl As New YahooManaged.Finance.NonAPI.IDSearchDownload
    With dl.Options
        .Start = 0
        .Count = 100
        .Type = YahooManaged.Finance.FinancialSecurityType.Any
        .RankedBy = YahooManaged.Finance.FinancialProperty.Name
        .RankingDirection = ComponentModel.ListSortDirection.Ascending
        .Markets = YahooManaged.Finance.FinancialMarket.AllMarkets
        .ISINIncluded = False
    End With
    
    AddHandler dl.AsyncDownloadChanged, AddressOf Me.AsyncIDSearchDownload_Changed
    AddHandler dl.AsyncDownloadCompleted, AddressOf Me.AsyncIDSearchDownload_Completed
    dl.DownloadAsync(keyword)
End Sub

Private Sub AsyncIDSearchDownload_Changed(ByVal sender As YahooManaged.Base.Download, _
ByVal e As YahooManaged.Finance.NonAPI.IDSearchDownloadChangedEventArgs)
    If e.Response.Connection.State = YahooManaged.Base.ConnectionState.Success Then
        Dim maxAvailable As Integer = e.MaximumresultsAvailable
        Dim maxReceivedCount As Integer = e.MaximumResultsCount
        Dim receivedCount As Integer = e.ReceivedResultsCount
        Dim percent As Double = e.Percentage
        Dim newResults() As IDSearchResult = e.NewResults
        
        For Each res As YahooManaged.Finance.IDSearchResult In e.Response.Result
            Dim id As String = res.ID
            '...
        Next
    End If
End Sub

Private Sub AsyncIDSearchDownload_Completed(ByVal sender As YahooManaged.Base.Download, _
ByVal e As YahooManaged.Finance.NonAPI.IDSearchDownloadCompletedEventArgs)
    If e.Response.Connection.State = YahooManaged.Base.ConnectionState.Success Then
        For Each res As YahooManaged.Finance.IDSearchResult In e.Response.Result
            Dim id As String = res.ID
            '...
        Next
    End If
End Sub

Support-Namespace

Support namespace provides a lot of classes that are not directly necessary for getting the data. This namespace is just for handling with these data easier. For that, you have different data classes.
The Support.YID class manages all information that are connecting to the Yahoo! Finance ID. Such an ID is constructed relatively structured. For getting data of the Apple stock, which is traded at XETRA stock exchange, you need the ID "AAPL.DE". The stock that is traded at NYSE has just the ID "AAPL". That shows that in most cases, you can deduce the stock exchange from the ID suffix (but there is more than one US American stock exchange, that has no suffix). For that issue, the YID class provides the StockExchange property for storing information like name, ID or trading time. You can prove if trading is active at a specific time in the machine's local timezone or UTC timezone. You can create a new instance of YID with an IDSearchResult. In most cases, the search result provides a known stock exchange and the YID constructor will manage the result data automatically.
The Support.WorldMarket class manages all known, Yahoo! supported stock exchanges and a collection of some indices. You have a structure of continents, countries and indices to reflect the world market situation (provided by Yahoo!). A stock index will be represented by the YIndexID class that inherits from YID. Here you have the additional property DownloadComponents, which indicates if the downloader will load the data of the index itself or of the stocks of the index. Another IID class is YCurrencyID. This class represents currency relations of a base currency and a dependent currency. For that, there are the Currency properties BaseCurrency and DepCurrency. The result (QuotesDownload -> LastTradePriceOnly) you will download has the format 1 BaseCurrency : X DepCurrency.

Data import/export

It's possible to export or import all QuoteData and HistQuoteData from and to XML, CSV, or System.Data.DataTable. For that issue, use the methods of XML, CSV or DataTable class in ImportExport namespace. Personally, I don't like methods that can't be used dynamically. That's the reason why these methods don't write files directly, because I don't know if you would want to write a file at all.
Here are some examples with HistQuotesData:

Dim dl As New API.HistQuotesDownload
Dim resp = dl.Download("MSFT", #1/1/2008#, Date.Today, HistQuotesInterval.Weekly)
Dim result As HistQuotesDataChain = resp.Result(0)

Dim culture As New Globalization.CultureInfo("de-DE")

'Convert to and from CSV
Dim csvConverter As New ImportExport.CSV
Dim csvText As String = csvConverter.FromHistQuotesData(result, ";"c, culture)
Dim csvConvertedBack As HistQuoteData() = _
	csvConverter.ToHistQuotesData(csvText, ";"c, culture)

'Convert to and from System.Data.DataTable
Dim tableConverter As New ImportExport.DataTable
Dim table As System.Data.DataTable = tableConverter.FromHistQuotesData(result)
Dim tableConvertedBack As HistQuoteData() = tableConverter.ToHistQuotesData(table)

'Convert from and to XML
Dim xmlConverter As New ImportExport.XML
Dim writer As New Xml.XmlTextWriter("histquotes.xml", System.Text.Encoding.UTF8)
With writer
    .Formatting = Xml.Formatting.Indented
    .Indentation = 4
    .WriteStartDocument()
    .WriteStartElement("HistQuotes")
    .WriteAttributeString("ID", result.ID)
    For Each hqd As HistQuoteData In result
        xmlConverter.FromHistQuoteData(writer, hqd, culture)
    Next
    .WriteEndElement()
    .Close()
End With

Dim doc As New Xml.XmlDocument()
doc.Load("histquotes.xml")
Dim id As String = doc.SelectSingleNode("//HistQuotes").Attributes("ID").Value
Dim nodes As Xml.XmlNodeList = doc.SelectNodes("//HistQuotes/HistQuote")
Dim chain As New HistQuotesDataChain(id)
For Each node As Xml.XmlNode In nodes
    Dim hqd As HistQuoteData = xmlConverter.ToHistQuoteData(node)
    If hqd IsNot Nothing Then chain.Add(hqd)
Next

It's possible to pass a culture that's used for formatting/converting the dates and numbers. This parameter is optional in VB.NET. If you pass Nothing/null (or don't use it in VB.NET), it will use the current culture of the machine.

Participate in YahooManaged Project

If you're interested in new functions and opportunities of the YahooManaged project and if you have some time to spend, then you can support this project with your ideas and work.

The market.xml is the base for Support.WorldMarket class and all of its provided indices and stock exchanges. If you have more information about indices or stock exchanges, just send me the data, so I'm able to implement it into the project.

Thanks to

  • Zvonimir Digas for the stock exchanges timetable
  • Alain Dionne for Canadian indices information

History

  • 26th November, 2010
    • Version 0.7.8
      • QuotesDownload internally changed
      • HistQuoteData changed
  • 12th November, 2010
    • Version 0.7.7
      • Minor changes
      • Internal optimization
      • Miscellaneous bug fixes
      • Version for CF 3.5
  • 15th September, 2010
    • Version 0.7.6
      • Culture class added
      • Language enum added
      • Region enum added
      • Base.Download fixed
      • Support.YID changed
      • ChartDownload extended
      • FeedDownload extended
      • KeyStatisticsDownload fixed
      • Internal optimization
      • Miscellaneous bug fixes
      • market.xml update
  • 22nd July, 2010
    • Version 0.7.5
      • Country enum changed
      • WorldMarket changed
      • CountryInfo changed
      • ContinentInfo changed
      • NonAPI.IDSearchDownload changed
      • Miscellaneous bug fixes
      • market.xml update
  • 21st July, 2010
    • Version 0.7.4
      • HistQuotesDownload extended
      • HistQuotesDataChain added
      • CompanyStatisticsDownload fixed
      • Base.Download methods now Protected instead of Friend
      • QuoteData.Values changed
      • Internal optimization
      • Miscellaneous bug fixes
  • 20th July, 2010
    • Version 0.7.3
      • IDSearchDownloadChangedEventArgs changed
      • FinancialSecurityType changed
      • Feed and FeedDownload changed
      • Base.Download methods now Protected instead of Friend
      • XML auto text encoding
      • Internal download structure changed
      • Internal optimization
      • Miscellaneous bug fixes
  • 14th July, 2010
    • Version 0.7.2
      • API.IDSearch changed
      • Base.ConnectionInfo changed
      • Miscellaneous bug fixes
  • 29th June, 2010
    • Version 0.7.1
      • RSS.Feed changed
      • Miscellaneous bug fixes
      • Internal optimization
      • market.xml update
  • 24th June, 2010
    • Version 0.7
      • Download structure changed
      • Threadsave download
      • Base.Response added
      • Base.ConnectionInfo added
      • CompanyStatisticsDownload added
      • Namespace structure changed (subordination of Finance project)
      • MarketDownload changed
      • Miscellaneous bug fixes
      • Internal optimization
  • 18th April, 2010
    • Version 0.6
      • QuotesBaseData added
      • QuotesBaseDownload added
      • QuoteOption added
      • QuoteOptionsDownload added
      • Data import/export changed
      • StockExchange changed
      • MarketDownload optimized
      • Miscellaneous bug fixes
      • Internal optimization
      • market.xml update
  • 24th March, 2010
    • Version 0.5
      • Namespace structure changed
      • Version for Compact Framework 2.0
      • ID Search implemented
      • Alphabetical ID List download implemented
      • ISIN class added
      • Correction of DownloadFailure args (obsolete)
      • Data import/export changed
      • Minor bug fixes
      • Internal optimization
      • market.xml update
  • 14th January, 2010
    • Version 0.4.3
      • YQL URL alteration
  • 6th January, 2010
    • Version 0.4.2
      • Proxy support added
  • 14th December, 2009
    • Version 0.4.1
      • Commodities added
      • Special currencies added
  • 10th December, 2009
    • Version 0.4
      • YQL implementation
      • Data import/export
      • StockExchange added
      • IID interface added
      • MarketDownload added
      • Minor bug fixes
      • market.xml update
  • 22nd November, 2009
    • Version 0.3
      • Currency exchange structure changed
      • YID added
      • Stock exchanges added
      • Downloader bug fix
      • Servers completed
  • 27th October, 2009
    • Version 0.2
      • CSV reader bug fix
      • Clean disposing of download objects
      • QuoteData modified
      • Quote download of several indices
      • Indices added
      • Currencies completed
      • Enum description
  • 26th September, 2009
    • Version 0.1
      • Base.Download added
      • Servers added
  • 24th September, 2009
    • Updated source code
  • 23rd September, 2009
    • Initial post

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0

About the Author

MaasOne



Germany Germany

Member


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralRe: Exchanges PinmemberMaasOne22:27 13 Mar '10  
GeneralRe: Exchanges PinmemberAECAEC6:14 16 Mar '10  
GeneralRe: Exchanges PinmemberMaasOne7:14 16 Mar '10  
GeneralMap ISIN to ticker symbol PinmemberTorsten Tiedt11:09 5 Mar '10  
GeneralRe: Map ISIN to ticker symbol PinmemberMaasOne11:39 6 Mar '10  
GeneralRe: Map ISIN to ticker symbol PinmemberTorsten Tiedt23:56 7 Mar '10  
GeneralRe: Map ISIN to ticker symbol PinmemberMaasOne7:12 9 Mar '10  
Hi Torsten,
 
I investigated a little bit and my old solution is not save or stable enough.
I allready had implemented the non-API ID search with US server. But this symbol lookup doesn't realy support ISINs. But the german server support it. Other european servers also support this issue, but it's always the same result. Maybe they have the same database.
So, implementation of the german server wasn't realy a problem, but I will not implement the other european servers, just in case of big differences in results, but I didn't noticed this.
But you have to accept, that this is not the real API of Yahoo. It's just HTML parsing (personally I hate this) and this parsing could bring a lot of problems with the time, when they are changing the source. This issue requires a continious support and updates in case of changing the source.
 
the ticker symbol with the highest volume - This issue is too individual.
 
"simply" all available ticker symbols - It's already done.
 

Maas
GeneralRe: Map ISIN to ticker symbol PinmemberTorsten Tiedt7:23 12 Apr '10  
GeneralRe: Map ISIN to ticker symbol Pinmembersteackbrit2:22 21 Apr '10  
GeneralRe: Map ISIN to ticker symbol PinmemberMaasOne2:50 21 Apr '10  
GeneralRe: Map ISIN to ticker symbol Pinmembersteackbrit16:04 21 Apr '10  
GeneralRe: Map ISIN to ticker symbol PinmemberMaasOne1:17 22 Apr '10  
GeneralRe: Map ISIN to ticker symbol PinmemberBrit the Brut13:49 26 Apr '10  
GeneralAlso see... PinmemberRavi Bhavnani8:11 14 Jan '10  
GeneralRe: Also see... PinmemberMaasOne6:35 15 Jan '10  
GeneralRe: Also see... PinmemberRavi Bhavnani6:58 15 Jan '10  
GeneralHallo aus Deutschland PinmemberEDVBS1:00 7 Jan '10  
GeneralRe: Hallo aus Deutschland PinmemberMaasOne3:07 7 Jan '10  
GeneralRe: Hallo aus Deutschland PinmemberEDVBS5:41 7 Jan '10  
GeneralI wish I could write an article like this PinmemberMarcelo Ricardo de Oliveira11:28 6 Jan '10  
GeneralRe: I wish I could write an article like this PinmemberMaasOne14:38 6 Jan '10  
News1.4 Changes PinmemberMaasOne3:22 14 Dec '09  
Generalnon async not working PinmemberZvonimir788:24 21 Nov '09  
GeneralRe: non async not working PinmemberMaasOne15:07 21 Nov '09  
GeneralRe: non async not working PinmemberZvonimir780:10 25 Nov '09  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120210.1 | Last Updated 26 Nov 2010
Article Copyright 2009 by MaasOne
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid