Finance-Quote-1.38/000755 000765 000024 00000000000 12566055631 013646 5ustar00ecstaff000000 000000 Finance-Quote-1.38/ChangeLog.1000644 000765 000024 00000052536 12566055631 015572 0ustar00ecstaff000000 000000 2000-04-06 Paul Fenwick * CVSTAG: finance_quote_0_16 * Initial public release. 2000-04-08 Paul Fenwick * Integrated TIAA-CREF changes from Brent Neal. * Changes to Makefile.PL to check dependancies, etc. * Updated Examples/Quote_example.pl to include TIAA-CREF examples. * CVSTAG: finance_quote_0_17 2000-04-10 Paul Fenwick * Changed Examples/chkshares.pl to print a pretty table. * Incorporated Cooper Vertz's patch to add high, low and net change to quotes obtained from Yahoo! 2000-04-13 Paul Fenwick * Fidelity private functions renamed to indicate they are private. * Small optimisations in fidelity functions to avoid spurious warnings and un-needed processing of non-useful lines. * Functions now quickly return undef when not passed a list of stocks. Previously they would waste time looking up nothing. * Documentation additions and corrections. * Added test files (Use.t, asx.t, yahoo.t, fidelity.t) * Added experimental function (currency) to look-up conversion rates between currencies. * Added an example script (currency-lookup.pl) to test said currency conversion. 2000-04-14 Paul Fenwick * Added TIAA-CREF testing script. * Added troweprice testing script. 2000-04-16 Paul Fenwick * Added yahoo_europe test script. * Removed depreciated vanguard function. 2000-04-18 Paul Fenwick * Added fetch() function to provide a cleaner interface to fetching quotes from a variety of sources. * Added tests for fetch() to the asx.t test script. 2000-04-20 Paul Fenwick * Removed misleading comments from Finance::Quote.pm 2000-04-21 Paul Fenwick * Added extra methods to fetch (nasdaq, nyse) which act as aliases to yahoo. * Added stockdump.pl example script, which is handy in debugging. * fetch is now an exportable function. * yahoo() function no longer returns entries for fields that used to be returned as 'N/A'. * yahoo() now supports the $stocks{$sym,'success'} notation. 2000-04-21 Brent Neal * Added checking for bogus symbols in tiaacref * Added checking of the LWP::UserAgent->is_success method * tiaacref() now supports $stocks{$sym,'success'} notation. * Updated t/tiaacref.t and Examples/Quote_example.pl for the changes 2000-04-23 Paul Fenwick * Added success/fail tests to asx, fidelity, troweprice, yahoo and yahoo_europe. * Updated appropriate testing functions. * Updated documentation to include fetch and list of known bugs. * Updated yahoo_europe to return undef's instead of N/As. * Removed HTML from returns from yahoo_europe. * Fixed logic bug in process yahoo_* N/As into undefs. 2000-04-24 Paul Fenwick * Updated in-line code regarding checking for Yahoo! successes. * Added meaningful error-messages to Yahoo! when stock lookups fail. 2000-04-24 Brent Neal * Finished updating error-checking for tiaacref. The tiaacref function now returns a success/failure flag for every symbol passed to it. It also checks that the data is valid. Returns meaningful error messages for these failures. 2000-04-25 Paul Fenwick * Rolled changes together when CVS got a little out-of-whack. :) * Return many new fields from yahoo() which we previously fetched but did not use. These include avg_vol, day_range, year_range, div_date, div, and div_yield. * Fixed typo in docs s/yeild/yield/; * Added ex_div for Ex-Divident Date in yahoo(). 2000-04-30 Paul Fenwick * Updated POD. * Improved returned error messages. * Updated the README file. * Updated the INSTALL file. * Tagged files as finance_quote_0_18 for release. 2000-05-13 Paul Fenwick * Added Documentation/FAQ file. 2000-05-14 Paul Fenwick * Huge re-write and change of everything so that it should be easy to plug in new modules without changing any existing code. 2000-05-27 Paul Fenwick * Added Documentation/Hackers-Guide. * Tweaked Quote.pm to provide an AUTOLOAD method for those people who don't want to go through the fetch() methods. 2000-05-31 Paul Fenwick * Added Documentation/TODO. 2000-06-03 Paul Fenwick * Revived dead vanguard method by rolling it through Yahoo. * Added labels method to everything. * Added price labels to everything. * Updated Quote.pm to query new labels methods. * Provided a failover method for fidelity via Yahoo. * Added failover functionality. 2000-06-03 Jacinta Richardson * Changed modules so they return undef in scalar context, empty list in list context, on failure. * Changed modules so they return a hashref when in scalar context, and a hash in list context. * Reviewed/corrected hackers guide. * Added currency tags to existing modules to signal currency type (AUD, EUR, USD) * Added tests to check currency tags. 2000-06-16 Paul Fenwick * Added webpage to CVS repository. 2000-06-17 Paul Fenwick * Re-added currency lookups to Quote.pm * Added regression testing script for currency. * Added automatic currency conversion stub. * Removed TODO file as we now keep track of outstanding jobs in SourceForge. 2000-06-21 Paul Fenwick * Rolled all the Yahoo functions into a base pseudo-class. * Fixed bug whereby large lookups in the yahoo functions would overflow the maximum URL length of some proxies/servers. * Expanded the number of fields available via Yahoo::Europe. 2000-06-22 Paul Fenwick * Added sections on currency conversion to the hacker's guide. Now I just need to write the code. :) # Added currency conversion code, but haven't tested it yet. 2000-06-23 Paul Fenwick * Cleaned up the hacker's guide. * Updated Examples/stockdump.pl to allow currency to be specified. * Automatic currency conversion now works. * Updated ASX and Yahoo::USA to not tag indexes with currency labels. * Updated Yahoo::Base to automatically accomodate suffixes for when we wish to add them automatically. * Added Yahoo::Australia to look up Australian stocks. * Tested failover of Yahoo::Australia to Yahoo::ASX. 2000-06-24 Paul Fenwick * Updated currency regression testing script. * Updated currency fetching routines to handle different date formats returned by Yahoo! * Updated automatic currency conversion routines to avoid spurious warnings. 2000-06-25 Paul Fenwick * Documented many of the new 0.19 functions in the Finance::Quote POD. 2000-07-02 Paul Fenwick * Many more documentation improvements in both the Finance::Quote POD and the sub-modules. 2000-07-08 Paul Fenwick * Added POD for TIAA-CREF and T. Rowe Price sub-modules. 2000-07-13 Paul Fenwick * Improved fidelity module such that it doesn't return information about stocks we did not request. 2000-07-15 Paul Fenwick * Wrote documentation for Yahoo::Europe (incomplete) and Yahoo::USA. Changed modules to require perl 5.005 because we make use of some of its features (like hash slices). * Improved labels documentation in Finance::Quote. * Added exchange and method information (where possible) to the various sub-modules. * Improved chkshares example script to check for errors. * Removed bad test in currency.t and replaced it with a better one. 2000-07-16 Paul Fenwick * Documented the list of possible markets in Yahoo::Europe. * Many many small syntax fixes in documentation. * Expanded and improved webpage. * Updated revision to 1.00 * Updated INSTALL documentation. * CVSTAG: finance_quote_1_00 2000-07-25 Paul Fenwick * Finance::Quote::Yahoo::Base now removes more HTML-ish guff that Yahoo tries to place in CSVs. * Updated yahoo_europe.t to check that stocks from London are in GBP. * Finance::Quote::Yahoo::Europe now returns London stocks in GBP. Previously it was incorrectly returning them in pence and calling it Euros. * Finance::Quote has a new scale_field() function that is used in currency conversion and by some sub-modules (Yahoo::Europe). This may be useful for future module writers. * CVSTAG: finance_quote_1_01 2000-07-31 Paul Fenwick * The currency function no longer makes an expensive HTTP request if both the to and from currencies are identical. 2000-08-04 Paul Fenwick * Patched Yahoo::Base to no longer return spurious percentage signs. 2000-08-06 Paul Fenwick * Updated regression testing scripts to make sure that spurious percentage signs are no longer returned. 2000-08-14 Paul Fenwick * Updated chkshares script so that it can deal with any market, not just the ASX. 2000-08-16 Paul Fenwick * Added DWS.pm module to the CVS repository, courtesy of Volker Stuerzl. This module fetches information from the Deutsche Bank Gruppe. * Updated asx.t script because it really hurts the entire "make test" thing when ASX is unhappy. Now it still hurts (because the ASX module sucks), but less. 2000-08-21 Paul Fenwick * Improved documentation in the yahoo_europe test script. 2000-08-22 Volker Stuerzl * Added DWS test script. 2000-08-29 Paul Fenwick * Rejiggered ASX module to try and make it work again after an ASX site rewrite. * Updated Quote.pm so that if a method was called directly (old-style) not through fetch, then it would do the right thing if called via an object. This means that things like $q->asx(@stocks) work correctly again. * Updated fetch() method so that it returns the empty list rather than undef when called in an array context. * fetch() now returns a hashref if called in a scalar context. 2000-08-31 Paul Fenwick * Added Keith Refson's Trustnet module. * Added .cvsignore file to reduce spam for developers using CVS. * Updated Yahoo/USA.pm to provide more compatible returns when called as a fidelity failover. * Tweaked DWS.t testing script so that it loads the module correctly. 2000-09-01 Paul Fenwick * Tweaked ASX.pm to avoid divide-by-zero errors and dodgy bogus-looking label values. 2000-09-04 Paul Fenwick * Keith Refson's patch to Trustnet to avoid premature returns in case of a bad symbol. 2000-09-12 Paul Fenwick * Mention of Bill Bell's java library in the FAQ. 2000-09-16 Paul Fenwick * Added Volker's VWD module and testing script. * Updated Makefile to check for HTML::TableExtract. * Updated INSTALL file to provide infomation on how to install modules that F::Q depends upon. * Updated Quote.pm to load VWD, DWS and Trustnet by default. * Updated README file to mention the webpage. * Added Trustnet regression testing program. * CVSTAG: finance_quote_1_02 2000-09-27 Paul Fenwick * Updated Trustnet module with patch from Keith Refson. 2000-10-20 Paul Fenwick * Much better discovery of non-existant stocks in ASX.pm. * Checks for possible divide-by-zero problems in ASX.pm. Thanks to Stephen Stebbing for catching this. * Updated ASX testing. * Updated all test scripts to remove spurious warnings under Perl 5.6. * Updated ASX module to deal with stocks when they have market announcements. Previously this would result in garbage being returned for that stock. * Updated VWD module so it can parse information from the new VWD site. * Updated F::Q version to 1.03. * CVSTAG: finance_quote_1_03 2000-10-27 Paul Fenwick * Updated yahoo_europe test suite as one of the symbols we were using for testing has since dissapeared. (Bankrupt? Merged?) 2000-10-29 Paul Fenwick * F::Q now makes use of a custom F::Q::UserAgent to fetch information. This is capable of doing proxy authentication and other arbitary http-headers. 2000-11-05 Paul Fenwick * BUG 121557: Fixed bug where the 40th symbol in a Yahoo lookup would fail. * F::Q::UserAgent is now ready for release, but is still considered experimental. Users must explicitly turn it on by setting $Finance::Quote::USE_EXPERIMENTAL_UA = 1; * Updated the FAQ. * Added MANIFEST file. * CVSTAG: finance_quote_1_04 2000-11-21 Paul Fenwick * Extra code to ensure that currency-fields returned by a Quotelet are unique. This prevents the potential bug of a field undergoing currency conversion multiple times and hence being quite off-track. 2000-11-29 Paul Fenwick * Updated the URL we obtain currency information to http://uk.finance.yahoo.com/m5?" * Updated docs in Yahoo/Europe.pm to note the Xtera exchange moving from FX to DE. * Thanks to Jan Willamowius for the above two changes. 2001-12-05 Paul Fenwick * Updated the Yahoo::USA source to finance.yahoo.com as the quote.yahoo.com may become depreciated in the future. Thanks to Iain Lea for spotting this. 2001-01-22 Paul Fenwick * Updated to respect the FQ_LOAD_QUOTELET environment variable to auto-load custom Quotelet. 2001-02-16 Paul Fenwick * Updated to repsect formatting changes in data fed to the currency function. * Updated Quote.pm to include updated information on FQ_LOAD_QUOTELET * CVSTAG: finance_quote_1_05 2001-04-05 Paul Fenwick * Updated ASX.pm module to reflect changed location of information on the ASX's website. (Still doesn't help when the ASX site is totally broken, as is too often the case.) * Updated Trustnet.pm module to reflect changes to the Trustnet site. 2001-05-08 Paul Fenwick * Applied Leigh Wedding's patch to ASX.pm, after ASX changed their website yet again! All is working happily once more. Thanks Leigh. * Added Tobias Vancura's F::Q::Fool module. * Added Fool as a automatically loaded loaded module from F::Quote.pm. 2001-05-09 Paul Fenwick * Fixed strange behaviour which could occur when using FQ_LOAD_QUOTELET environment variable. This now works as intened. * Added Jasmin Bertovic's Cdnfundlibrary module. 2001-05-10 Volker Stuerzl * Updated VWD.pm to account for changes in VWD website. 2001-05-11 Paul Fenwick * Tweaked VWD.pm to strip whitespace from currency and remove asterisks from names. 2001-06-04 Brent Neal * Fixed Tiaacref.pm to reflect new CGIs at www.tiaa-cref.org New symbols available for the module - check the POD documentation for more info. 2001-06-25 Linas Vepstas * Added Tdwaterhouse module from James A. Treacy. 2001-06-26 Paul Fenwick * Added AEX module courtesy of Rob Sessink. * Updated ASX module to use the new (again!) ASX website. * Updated ASX module to use HTML::TableExtract. Code is much simplier now. * Updated Fidelity module to make use of the new fidelity website. * Updated the Fidelity test to always test the fidelity_direct method. * Bumped version number on F::Q to 1.06. * Updated Trustnet module to assume GBP if no currency explicitly shown. * Updated Trustnet test because one of the funds we were looking for had changed its name, causing the test to fail. * Added AEX test suite to repository. * Removed failover into Fool.pm support, as I'd like to do more testing before it enters the failover system. * Updated the FAQ. * Updated the INSTALL file. * Moved regression tests from /t to /test. Updated MANIFEST file accordingly. This means that autoamtic installs from CPAN won't run the regression tests, which was causing installation to fail on some systems. * Updated lists of copyright holders, SEE ALSO sections in man-pages. * CVSTAG: finance_quote_1_06 2001-07-04 Paul Fenwick * Confirmed debian packages release with Ross Peachey. * Moved cvs tags in debian/* so that finance_quote_1_06 point to the files used in building 1.06, not those building 1.05. 2001-07-23 Paul Fenwick * Updated Yahoo::Europe.pm so that stocks fetched from the Stockholm exhcnage (.ST) are correctly listed as being in Swedish Krona (SEK). 2001-12-19 Paul Fenwick * Added Finance::Quote::Yahoo::Asia to provide lookup of Asian stock quotes (not including Japan). Many thanks to M.R.Muthu Kumar for this patch. 2002-04-18 Paul Fenwick * Patched Quote.pm after currency conversion started to fail. Many thanks to Sean Wenzel for the fix. * Updated documentation in ASX.pm and Trustnet.pm to note their current functional unhappiness. * CVSTAG: finance_quote_1_07 2002-06-25 Paul Fenwick * Added ZI.pm and Union.pm modules. Thanks to Rainer Dorsch for providing these. 2003-02-04 Paul Fenwick * Fixed VWD problem whereby no symbol was being returned. Many thanks to Joachim Breitner for this fix. (#600698) * Updated TrustNet documentation, thanks to David Hampton. (#666349) 2003-07-04 Paul Fenwick * Fixed currency conversion problems. (#232075) * Fixed ASX problems whereby quotes were not being obtained. Thanks to Rik Harris for bringing this issue to light, and providing a correct URL. (#653025) * Fixed problem where no symbol tag was being defined in ASX. Thanks again to Rik Harris. (#653035) * Fixed problem where undefined currencies would be returned as zero, and not undefined as occured in previous versions. * Fixed tests in currency.t which assumed that conversion could be done between EUR and former European currencies. These are no longer supported due to a change in the lookups provided by Yahoo. * Updated Fidelity.pm to indicate its current non-working status. * Added T. Rowe Price patches by David Hampton, which provide a troweprice_direct method. (#666351) * As above, for the Fidelity module. (#666353) * Accepted David Hampton's patch to Yahoo currencies. The correct currency will now be flagged on stocks regardless of the module used to grab them. (#666361) * Added Keith Refson's module to obtain quotes from First Trust Portfolios L.P. Thanks to David Hampton (again!) for supplying this. (#670202) * Added Ganesan Rajagopal's excellent IndiaMutal module. (#720896) * Fixed Cdnfundlibrary to correctly set the success flag when successful. Thanks to Robert Clark for finding this bug. (#752395) * Updated Tdwaterhouse.pm with Robert Clark's changes to work with the new TD Waterhouse website. Many thanks to Robert Clark again. (#750843) * Added the BM Nesbitt Burns module provided by Robert Clark, including test cases. (#752423). * Updated BMONesbittBurns module to provide better date handling, screening out of high-ascii characters from fields, and removal of spurious debug output. * CVSTAG: finance_quote_1_08 2003-07-06 Pawel Konieczny * Update of F::Q::AEX module: added a remap functionality which translates the official stock ticker to AEX CGI symbol * Update of F::Q::AEX module: Distiguishing indices and stocks: indices will have "currency" label undefined, stocks will have value "EUR". This fixes the currency conversion problem for indices. * Update of F::Q::AEX module: Cleanup of labels: "offer" renamed to "ask" ("ask" is more common, besides, it can be currency-converted). Label "offer" stays for backward compatibility. * Update of F::Q::AEX module: Cleanup of garbage in some fields. (Ocassionally, the http fetch & parse will return garbage for some values). 2003-07-07 Pawel Konieczny * AEX module: added label 'symbol' 2003-08-27 Pawel Konieczny * AEX module: following a suffestion of Paul Fenwick, value 'undef' is returned if no valid data could be dowloaded (previously it was returning empty strings in such cases). 2003-08-31 Pawel Konieczny * AEX module: major update: fetching of stock and index options implemented. POD and test script updated as well. 2003-08-31 David Hampton * Yahoo/Base.pm: Added entry for the Lisbon Portugal stock exchange. 2003-09-12 David Hampton * Yahoo/Base.pm: Added suffixes for 1) the US Options, 2) US exchanges when using a non-US Yahoo site, and 3) the Zurich exchange. 2003-09-15 Pawel Konieczny * AEX module: major update: additional labels for options available: volume, oi, and other. Subframes cache implemented, resulting in substantial speedup for repeating (intraday) requests of individual options. 2003-09-20 Pawel Konieczny * AEX module: major update: fetching of futures quotes implemented. POD and test script updated as well. 2004-02-08 David Hampton * Yahoo/Base.pm: Added suffixes for the Brussels and Dublin exchanges. 2004-07-02 Paul Fenwick * Added Finance/Quote/Tdefunds.pm thanks to David Grant. * Added t/tdefunds.t basic regression test (3 tests). * Fixed bug #916966, TASE prices were 100 times their true price. Thanks to Eldad Zack for the patch. Finance-Quote-1.38/Changes000644 000765 000024 00000054670 12566055631 015155 0ustar00ecstaff000000 000000 1.38 2015-08-22 13:22:56+02:00 Europe/Brussels * module updates: tiaacref, yahooJSON, FTfunds, MStaruk, USFedBonds, GoldMoney * new modules: fidelityfixed (Peter Ratzlaff), yahooYQL * removed modules: MTGox * more tests: yahoo_speed.t, tiaacref.t 1.37 2015-02-01 20:24:32+01:00 Europe/Brussels * modified 00-use.t to show more info * Remove Crypt::SSLeay dependency in favor of LWP::Protocol::https (Geert Janssens) * Updated HU.pm and test file to current website (Kristof Marussy) 1.36 2015-01-31 * MorningstarJP : changed dependency from Date::Calc to DateTime 1.35 2014-06-17 08:06:14+02:00 Europe/Brussels * BUGFIX: VWD - currency returned. 1.34 2014-06-15 21:30:03+02:00 Europe/Brussels * VWD adapted to recent website change. 1.33 2014-06-01 11:24:24+02:00 Europe/Brussels * BUGFIX: yahoo_json never returns currency. so don't set a default. yahoo_json returned current timestamp instead of quote date. 1.32 2014-05-18 21:55:12+02:00 Europe/Brussels * return "symbol" for yahoo_json module * allow to retrieve ISIN codes with VWD module 1.31 2014-05-04 22:56:45+02:00 Europe/Brussels * Case mismatch in ZA_UnitTrusts pod 1.30 2014-05-04 21:56:34+02:00 Europe/Brussels * Bourso.pm works on current website changes. Thanks to Guillaume * New module CSE.pm by Hiranya Samarasekera. Covers Colombo Stock Exchange (CSE) in Sri Lanka. 1.29 2014-04-08 08:28:25+02:00 Europe/Brussels * New module za_unittrusts. kudos to Rolf Endres. * Indiamutual patched to current website. kudos to Vinay S Shastry. 1.28 2014-03-16 12:05:19+01:00 Europe/Brussels * Removed some unnecessary dependencies 1.27 2014-03-05 15:04:22+01:00 Europe/Brussels * New module YahooJSON added (Abhijit Kshirsagar) * mtgox.t should not create errors when ONLINE_TEST is not defined 1.26 2014-03-03 22:24:58+01:00 Europe/Brussels * VWD adapted to current website (skaringa) * Boursorama module mostly fixed (Arnaud Gardelein) 1.25 2014-03-02 23:18:23+01:00 Europe/Brussels * AEX.pm : Some checking added. Not working yet * Quote.pm : readded sub parse_csv_semicolon. 1.24 2014-03-02 21:39:00+01:00 Europe/Brussels * Added module Citywire.pm written by Martin Sadler * Added module FTfunds.pm written by Martin Sadler * Added module MStaruk.pm written by Martin Sadler * Added module TNetuk.pm written by Martin Sadler * Data::Dumper is no more required to build 1.23_02 2014-03-02 14:46:41+01:00 Europe/Brussels (TRIAL RELEASE) TEST RELEASE 1.22 2014-03-02 10:38:18+01:00 Europe/Brussels (TRIAL RELEASE) TEST RELEASE 1.21 2014-03-02 09:56:38+01:00 Europe/Brussels (TRIAL RELEASE) * ASX.pm now supports querying more than 10 symbols (goodvibes2) * Travis config added for automated test build * BUILD: Updated to use Dist::Zilla 2014-02-17 Erik Colson * INSTALLATION FIX: Install Date::Calc as dependency 2014-02-16 Erik Colson * MtGox support added by Sam Morris * MorningstarJP support added by Christopher Hill * Yahoo modules changed due to site change 2010-02-16 Erik Colson * TSP.pm updated. Patch from Kevin Ryde. * YAHOO/Base.pm added conversion from 'B' billions to numbers. Patch from Kevin Ryde. * Billions support moved to Quote.pm 2009-10-05 Erik Colson * Lots of tests added 2009-10-04 Erik Colson * IndiaMutual.t tests added * Yahoo_europe: Bug 44245 solved. Wrong fields returned. * Documentation: Bug 48818 corrected. 2009-10-03 Erik Colson * yahoo_europe.t tests corrected 2009-09-30 Erik Colson * Bourso.t tests corrected 2009-09-29 Erik Colson * AEX.pm removed code for options and futures. (didn't work) 2009-07-19 Erik Colson * Bug in Yahoo::Base corrected. Sometimes year range is wrongly returned. 2009-07-19 Giles Robertson * Bug in Yahoo::Base corrected. GBp wrongly interpreted. 2009-07-19 Stephan Ebelt * Goldmoney.pm patched. support for platinum added. 2009-07-18 Zoltan Levardy * New module HU.pm (Hungarian stocks) 2009-06-14 Divakar Ramachandran * Bug RT 46155 solved by modifying link in IndiaMutual.pm 2009-06-14 Stephan Ebelt * Cominvest URL modified 2009-06-14 Erik Colson * currencies adapted to yahoo denomination 2009-06-13 Sattvik * currency retrieval updated (yahoo website changed) 2009-04-27 Bradley Dean * ASX.pm updated due to website change 2009-04-13 Erik Colson * Release 1.16 2009-04-12 Erik Colson * BUGFIX: Bourso.pm allmost completely rewritten due to website change. * BUGFIX: Morningstar.pm patched by Fredrik Persson. * BUGFIX: AEX.pm patched by Herman van Rink. 2009-03-19 Erik Colson * BUGFIX: 12:XXpm formatted time handling. 2009-03-04 Erik Colson * RENAMED ITE is now RZR 2009-03-02 Erik Colson * BUGFIX: ZA.pm patched. 2009-03-01 Erik Colson * BUGFIX: Stephen Ebelt patch applied for goldmoney.pm * BUGFIX: Encoding problem solved by Ashwin 2009-02-16 Bradley Dean * NEW: Function fetch_live_currencies. 2009-02-15 Bradley Dean * NEW: Module Finance::Quote::Currencies created for use in currency_lookup. 2008-12-05 Erik Colson * Finanzpartner module adapted to site updated. By Jan Wilamowius. * Morningstar patched by Fredrik Persson. 2008-11-09 Erik Colson * Bourso.pm updated due to website update. By Bernard Fuentes 2008-10-26 Erik Colson * BUG correction : IndiaMutual.pm: symbol not set it module. * Release 1.15 2008-10-21 Erik Colson * BUG correction : function isoTime - make sure $hours and $mins are treated as numbers * use sprintf in isoTime 2008-10-15 Erik Colson * Release 1.14 2008-10-13 Erik Colson * Finanzpartner.pm added by Jan Willamowius 2008-10-12 Erik Colson * isoTime function added * added quote.t * yahoo time is now format using isoTime 2008-10-11 Erik Colson * added prerequisite for HTML::TreeBuilder * union.t from todo 2008-10-10 Paul Fenwick * TEST: Ensure Data::Dumper is not accidently left in F::Q code. 2008-10-07 Erik Colson * Root README added * BUGFIX: asx.t 2008-10-05 Erik Colson * Added Cominvest module from Stephan Ebelt 2008-10-04 Erik Colson * Failing tests moved to todo-state for trustnet, usfedbonds, bourso, deka, union * BUGFIX: currency.t * BUGFIX: lerevenu.t - index ID corrected 2008-10-02 Erik Colson * Failing tests moved to todo-state for ftportfolios, aiahk, nzx, maninvestments. 2008-09-30 Paul Fenwick * BUGFIX: Applied patch from Bill Carlson to fix Tiaacref.pm. Thanks Bill, you rock! 2008-09-28 Erik Colson * StockHouseCanada.pm updated to new site layout * DWS.pm updated 2008-09-27 Erik Colson * VWD.pm updated to new site layout * TSX.pm added 2008-09-27 Paul Fenwick * DOCUMENTATION: Fixed malformed formatting in authors email addresses in Fiannce/Quote.pm. 2008-09-26 Erik Colson * AEX.pm updated to new site layout (comma used in numbers) 2008-09-22 Paul Fenwick * BUILD: Module::Install 0.77 is now used for building and installation. (PJF) * TESTING: Finance::Quote's test system has been restructured. Tests are now run during installation, but online and author tests are skipped by default. (PJF) 2008-09-21 Erik Colson * lib/Finance/Quote/Yahoo/Brasil.pm: Enable semicolon. 2007-05-13 David Hampton * lib/Finance/Quote/SEB.pm: Patch from Henrik Riomar to fix a problem finding quotes for funds with the Swedish chars åäö in the name. * lib/Finance/Quote/IndiaMutual.pm: Patch from Devendra Gera to remove white space when splitting the results in the AMFI data file. 2007-01-07 David Hampton * CVSTAG: finance_quote_1_13 * lib/Finance/Quote.pm: Update version to 1.13. * lib/Finance/Quote.pm: Update the store_date() function for the case when the year isn't explicitly stated. If the specified month would put the quote in the future, then consider this a quite from last year. manly intended to handle the rollover from December to January on web sites that don't specify the year. Suggestion from Christian Lupien. * lib/Finance/Quote/BMONesbittBurns.pm: Enhance module to support mutual fund quotes (which have less data than stock quotes). Correct date format parsing. Fix from Christian Lupien . * lib/Finance/Quote/StockHouseCanada.pm: The fund name seems to be a moving target. Search all tables of depth one looking for it. 2007-01-01 David Hampton * lib/Finance/Quote/FTPortfolios.pm: Rewrite this module for the new web site design. * lib/Finance/Quote/TSP.pm: Strip spaces around the dollar values. * lib/Finance/Quote/FinanceCanada.pm: Rewrite this module for the new web site design. * test/*.t: Some restructuring of tests. Add a couple more tests on dates. Replace a couple of test stocks that are no longer valid. * test/*.t: Accept last year as a valid date. Comes in hand when testing modules at the start of the new year. * lib/Finance/Quote/ZA.pm: Update for changes in the display of the web site. 2006-12-31 David Hampton * lib/Finance/Quote/StockHouseCanada.pm: * test/stockhousecanada.t: New module for getting Canadian Mutual fund quotes from Chris Carton . * lib/Finance/Quote/Deka.pm: Update for changes in the display of the web site. Now uses an https url. * lib/Finance/Quote/LeRevenu.pm: Updates from Dominique Corbex for changes in the display of the web site. * lib/Finance/Quote/Trustnet.pm: Update for changes in the display of the web site. 2006-09-11 David Hampton * Move AIA.pm to AIAHK.pm since AIA has sites in multiple countries. 2006-09-10 David Hampton * lib/Finance/Quote/AIA.pm: * test/aia.pm: New module to access American International Assurance fund information. Based on perl script from Wouter van Marle . * lib/Finance/Quote/Bourso.pm: Update the URL to track changes on the web site. 2006-07-10 David Hampton * lib/Finance/Quote.pm: Update version to 1.12. * CVSTAG: finance_quote_1_12 2006-06-27 David Hampton * Makefile.PL: State the dependency on Crypt::SSLeay that several modules now have. * lib/Finance/Quote/Yahoo/Base.pm: Don't set fields that are defined but are empty.. * test/yahoo_brasil.t: Update the test module to have more cases and use better stocks. * lib/Finance/Quote/Yahoo/Brasil.pm: Update for the change of the data separator from a semicolon to a comma. * test/financecanada.t: * test/hex.t: Add new test cases to cover the last untested modules. All modules are now tested. * lib/Finance/Quote/FinanceCanada.pm: Don't set the success flag if the lookup failed. * lib/Finance/Quote/Platinum.pm: Use the new url of the pricing information. * lib/Finance/Quote/ManInvestments.pm: Update for the new table format on the web site. * test/indiamutual.t: * test/aex.t: Update the test cases to use currently listed funds. * lib/Finance/Quote/ManInvestments.pm: The url for updating quotes has changed, as has the table header. * lib/Finance/Quote/Bourso.pm: * lib/Finance/Quote/LeRevenu.pm: * test/bourso.t: * test/lerevenu.t: Updated modules from Dominique Corbex . The name field now returns the real name and not ticker symbols, and other small fixes. 2006-04-08 David Hampton * lib/Finance/Quote/Trustnet.pm: Work around the fact that gnucash escapes the ampersand character when passing stock names to F::Q. * lib/Finance/Quote/DWS.pm: Updated module from Klaus Dahlke to retrieve quotes from the new DWS web page. * lib/Finance/Quote/Tiaacref.pm: Explicitly state in the code that this module requires ssl support (it uses an https:// url). This prevents perl from trying to run the code when ssl support isn't present. * lib/Finance/Quote.pm: * lib/Finance/Quote/HEX.pm: * test/hex.t: New module from Mika Laari to fetch quote information from the Helsinki stock exchange. * Documentation/Hackers-Guide: Add a section on the q->store_date() function. All modules should use this function to set the 'date' and 'isodate' fields based on the retrieved textual date (or lack thereof). * test/lerevenu.t: Test the right module. 2006-04-07 David Hampton * lib/Finance/Quote.pm: * lib/Finance/Quote/LeRevenu.pm: * test/lefrevenu.t: New module from Dominique Corbex to fetch information from the LeRevenu.com site in France. * t/yahoo_europe.t: New test cases for non-GBP London exchange stocks. Use new stock for test of the XETRA exchange. (Can't find a non-Euro stock there, so remove those tests.) * lib/Finance/Quote/Yahoo/Base.pm: Patch from p1n0@sourceforge.net to only divide London exchange values by 100 if they are denominated in pence. 2006-04-06 David Hampton * lib/Finance/Quote.pm: * lib/Finance/Quote/Bourso.pm: * test/bourso.t: New module from Dominique Corbex to fetch information from the "Paris Stock Exchange", http://www.boursorama.com. * lib/Finance/Quote/VWD.pm: Updated module from Jörg Sommer that is more tolerant of the advertising added to the web page. 2006-01-11 David Hampton * CVSTAG: finance_quote_1_11 * lib/Finance/Quote.pm: Updated $VERSION to 1.01 2006-01-10 David Hampton * test/dws.t: * test/maninvestments.t: * test/yahoo_brasil.t: Accept dates in both the previous and current year as valid responses. * test/aex.t: Change test currency to one still on the exchange. * lib/Finance/Quote/VWD.pm: Jörg Sommer's patch to work better with invalid WKNs and to extract the exchange information from its new location. 2005-11-18 David Hampton * lib/Finance/Quote/AEX.pm: Use the store_date function. * lib/Finance/Quote/ASX.pm: * lib/Finance/Quote/Cdnfundlibrary.pm: * lib/Finance/Quote/Platinum.pm: * lib/Finance/Quote/Trustnet.pm: * lib/Finance/Quote/Yahoo/Base.pm: Add code to protect against empty tables, data fields, etc. * test/aex.t: Correct the number of test cases. Changed test stock to one that is still on the exchange. Site no longer provides time (date only) so remove tests for time of quote. Futures quotes don't always have bid/ask values so comment out those tests. * test/indiamutual.t: * test/trustnet.t: * test/union.t: * test/yahoo.t: Changed test stock to one that is still on the exchange. * test/yahoo_brasil.t: All returned prices (for all stocks I tried) return a price of zero, so comment out the test for non-zero. 2005-10-23 David Hampton * lib/Finance/Quote/VWD.pm: Put back the call to the HTML::TableExtract first_table_state_found() function for now. At some point this should be removed and the 2.0 version of HTML::TableExtract required. * lib/Finance/Quote.pm: Make note of an alternate yahoo URL that can be used to obtain currency quotes. From Gerry Barksdale . 2005-10-22 David Hampton * lib/Finance/Quote/Tiaacref.pm: * test/tiaacref.t: Add Support for TIAA-CREF mutual funds from Brandon . * lib/Finance/Quote/VWD.pm: Remove the thousands separator character from quote values. * lib/Finance/Quote/TSP.pm: * test/tsp.t: Frank Mori Hess's change to add support for the TSP lifecycle L funds. * ChangeLog: Archive pre-2005 data into a separate file. * lib/Finance/Quote/Deka.pm: Add a new module to retrieve German investment fund prices from Deka. Module from Knut Franke * lib/Finance/Quote/USFedBonds.pm: * test/usfedbonds.t: Add a new US Federal Bonds stock quote module from Stephen Langenhoven . 2005-10-21 David Hampton * lib/Finance/Quote.pm: Updated to work with new Yahoo currency conversion pages. * lib/Finance/Quote/Tiaacref.pm: New URL from Kevin Foss. Uses https, so the Crypt::SSLeay module is now required for TIAA-CREF quotes. * lib/Finance/Quote/ZI.pm: Zürich Invest has been purchased by Deutsche Bank and integrated into DWS. The DWS.pm module should now be used in place of the ZI.pm module. * lib/Finance/Quote/VWD.pm: Patch from Rainer Dorsch to return the current price as 'last'. The HTML::TableExtract first_table_state_found() function has been deprecated. Accept both the old and new values as correct answers. * lib/Finance/Quote/ZA.pm: * test/za.t: Add a new South African stock quote module from Stephen Langenhoven . 2005-08-10 David Hampton * lib/Finance/Quote/VWD.pm: Handle invalid ISINs better. VWD delivers a 404 error instead of a blank page. Fix suggested by Uwe Simon 2005-07-04 Paul Fenwick * lib/Finance/Quote.pm: Bumped $VERSION to 1.10, primarily to work around a problem with CPAN distributions. * CVSTAG: finance_quote_1_10 2005-06-29 David Hampton * lib/Finance/Quote/VWD.pm: Updated module from Jörg Sommer . * lib/Finance/Quote/cdnfundlibrary.pm: Changes inspired by kalaleq@users.sourceforge.net allow retrieval of more data. * lib/Finance/Quote.pm: * lib/Finance/Quote/Yahoo/NZ.pm: New module from Stephen Judd . * lib/Finance/Quote/NZX.pm: Tweak to allow both NZX and Yahoo:NZ to get quotes for New Zealand Stocks (use method nz). * CVSTAG: finance_quote_1_09 2005-05-30 Paul Fenwick * MANIFEST: Updated with files intended for distribution. * lib/Finance/Quote.pm: Updated $VERSION to 1.09 * CVSTAG: Updated finance_quote_1_09 tag on MANIFEST and lib/Finace/Quote.pm * Released updated version 1.09 with new MANIFEST and Quote.pm to Sourceforge. * lib/Finance/Quote/VWD.pm: Re-enabled $VERSION and bumped to 1.01 to allow correct indexing on CPAN, however the older version currently remains in the 1.09 release. 2005-05-04 David Hampton * lib/Finance/Quote/FTPortfolios.pm: Update for changes in the website. * t/ftportfolios.t: New test module. * TSP.pm: Replace core parsing with tighter code. Support the symbols used by both Frank Mori Hess' and Trent Piepho's TSP modules. Make the symbols case insensitive. * lib/Finance/Quote/Cdnfundlibrary.pm: Find table by headers instead of by index. * test/asegr.t: New module * lib/Finance/Quote/ASEGR.pm: New module * lib/Finance/Quote/ASX.pm: Skip any blank lines in the table. Pass an extra parameter to TableExtract to keep it from doing unnecessary work that produces warnings. 2005-03-19 David Hampton * lib/Finance/Quote/Trustnet.pm: Encode the '&' character before calling the user agent GET function. Fixes bug 747080. 2005-03-19 David Hampton * almost all files: Collapsed all date parsing code into a single function. This function handles the date formats provided by all current quote sources and converts them all into the F::Q standard of a US date format. It also adds an ISO format date to all quotes in the new isodate field. Added lots of test functions to check date formats. 2005-03-19 David Hampton * lib/Finance/Quote/AEX.pm: Spelling correcting from Frank Mori Hess. * lib/Finance/Quote.pm: Documentation correction from Trent Piepho. * lib/Finance/Quote/Yahoo/Base.pm (yahoo_request): Fix an undefined reference when Yahoo ocassionally returns an empty field. 2005-03-01 David Hampton * lib/Finance/Quote.pm: New modules. New function to parse files separated by semicolons instead of commas. * lib/Finance/Quote/AEX.pm: Worked over modules from Johan van Oostrum. Most of the old AEX data has migrated elsewhere. * lib/Finance/Quote/ASX.pm: * lib/Finance/Quote/Trustnet.pm: Got the modules working again. * lib/Finance/Quote/ManInvestments.pm: * lib/Finance/Quote/Platinum.pm: New modules for Australian investment price sources from Ian Dall . * lib/Finance/Quote/NZX.pm: New modules for fetching quotes the from the New Zealand stock exchange. Provided by Michael Curtis. * lib/Finance/Quote/SEB.pm: New modules for fetching quotes from the Swedish Bank. Submitted by Tomas Carlsson. * lib/Finance/Quote/TSP.pm: New modules for fetching quotes from the US Govt. Thrift Service Plan. Submitted by Frank Mori Hess. * lib/Finance/Quote/Yahoo/Base.pm: Corrected currency tags for Vienna and Valence. * lib/Finance/Quote/Yahoo/Brasil.pm: Add new Yahoo Brasil module from Ismael Orenstein . * t/*: Various new test modules. 2005-02-09 David Hampton * lib/Finance/Quote/Fidelity.pm: * lib/Finance/Quote/Union.pm: Got the modules working again. * lib/Finance/Quote/Yahoo/Base.pm: Extract the currency directly from Yahoo, instead of looking it up in an exchange/currency mapping table. * t/*: Various new test and updated modules. 2005-02-06 David Hampton * lib/Finance/Quote/BMONesbittBurns.pm: Got the modules working again. 2005-01-14 David Hampton * lib/Finance/Quote/Cdnfundlibrary.pm: Got the module working again. Finance-Quote-1.38/debian/000755 000765 000024 00000000000 12566055631 015070 5ustar00ecstaff000000 000000 Finance-Quote-1.38/Documentation/000755 000765 000024 00000000000 12566055631 016457 5ustar00ecstaff000000 000000 Finance-Quote-1.38/Examples/000755 000765 000024 00000000000 12566055631 015424 5ustar00ecstaff000000 000000 Finance-Quote-1.38/GPATH000644 000765 000024 00000100000 12566055631 014423 0ustar00ecstaff000000 000000 b1 X<PTdl xTT@$t<xH4 X L P  0 x h p\<| dXPd|$<tDD|,|,4lTDL|l \ T$ t $ | |$ \  L < 4D4l L4$l4./t/04-critic.t92o91./t/03-kwalitee.to./t/03-kwalitee.t91o90./t/02-pod-coverage.to./t/02-pod-coverage.t90o89./t/01-pod.to ./t/01-pod.t89o88./t/00-use.to ./t/00-use.t88o87./README.mdo ./README.md87o86./lib/Finance/Quote.pm./lib/Finance/Quote.pm86%85./lib/Finance/Quote/ZA_UnitTrusts.pm%./lib/Finance/Quote/ZA_UnitTrusts.pm8584./lib/Finance/Quote/ZA.pm./lib/Finance/Quote/ZA.pm84 83./lib/Finance/Quote/YahooYQL.pm ./lib/Finance/Quote/YahooYQL.pm83!82./lib/Finance/Quote/YahooJSON.pm!./lib/Finance/Quote/YahooJSON.pm82!81./lib/Finance/Quote/Yahoo/USA.pm!./lib/Finance/Quote/Yahoo/USA.pm81 80./lib/Finance/Quote/Yahoo/NZ.pm ./lib/Finance/Quote/Yahoo/NZ.pm80$79./lib/Finance/Quote/Yahoo/Europe.pm$./lib/Finance/Quote/Yahoo/Europe.pm79$78./lib/Finance/Quote/Yahoo/Brasil.pm$./lib/Finance/Quote/Yahoo/Brasil.pm78"77./lib/Finance/Quote/Yahoo/Base.pm"./lib/Finance/Quote/Yahoo/Base.pm77'76./lib/Finance/Quote/Yahoo/Australia.pm'./lib/Finance/Quote/Yahoo/Australia.pm76"75./lib/Finance/Quote/Yahoo/Asia.pm"./lib/Finance/Quote/Yahoo/Asia.pm7574./lib/Finance/Quote/VWD.pm./lib/Finance/Quote/VWD.pm74"73./lib/Finance/Quote/USFedBonds.pm"./lib/Finance/Quote/USFedBonds.pm73!72./lib/Finance/Quote/UserAgent.pm!./lib/Finance/Quote/UserAgent.pm7271./lib/Finance/Quote/Union.pm./lib/Finance/Quote/Union.pm7170./lib/Finance/Quote/TSX.pm./lib/Finance/Quote/TSX.pm7069./lib/Finance/Quote/TSP.pm./lib/Finance/Quote/TSP.pm69 68./lib/Finance/Quote/Trustnet.pm ./lib/Finance/Quote/Trustnet.pm68"67./lib/Finance/Quote/Troweprice.pm"./lib/Finance/Quote/Troweprice.pm6766./lib/Finance/Quote/TNetuk.pm./lib/Finance/Quote/TNetuk.pm66 65./lib/Finance/Quote/Tiaacref.pm ./lib/Finance/Quote/Tiaacref.pm65$64./lib/Finance/Quote/Tdwaterhouse.pm$./lib/Finance/Quote/Tdwaterhouse.pm64 63./lib/Finance/Quote/Tdefunds.pm ./lib/Finance/Quote/Tdefunds.pm63(62./lib/Finance/Quote/StockHouseCanada.pm(./lib/Finance/Quote/StockHouseCanada.pm62!61./lib/Finance/Quote/SIXshares.pm!./lib/Finance/Quote/SIXshares.pm61 60./lib/Finance/Quote/SIXfunds.pm ./lib/Finance/Quote/SIXfunds.pm6059./lib/Finance/Quote/SEB.pm./lib/Finance/Quote/SEB.pm59 58./lib/Finance/Quote/Platinum.pm ./lib/Finance/Quote/Platinum.pm5857./lib/Finance/Quote/NZX.pm./lib/Finance/Quote/NZX.pm5756./lib/Finance/Quote/MtGox.pm./lib/Finance/Quote/MtGox.pm5655./lib/Finance/Quote/MStaruk.pm./lib/Finance/Quote/MStaruk.pm55%54./lib/Finance/Quote/MorningstarJP.pm%./lib/Finance/Quote/MorningstarJP.pm54#53./lib/Finance/Quote/Morningstar.pm#./lib/Finance/Quote/Morningstar.pm53&52./lib/Finance/Quote/ManInvestments.pm&./lib/Finance/Quote/ManInvestments.pm52 51./lib/Finance/Quote/LeRevenu.pm ./lib/Finance/Quote/LeRevenu.pm51#50./lib/Finance/Quote/IndiaMutual.pm#./lib/Finance/Quote/IndiaMutual.pm5049./lib/Finance/Quote/HU.pm./lib/Finance/Quote/HU.pm4948./lib/Finance/Quote/HEX.pm./lib/Finance/Quote/HEX.pm48!47./lib/Finance/Quote/GoldMoney.pm!./lib/Finance/Quote/GoldMoney.pm47$46./lib/Finance/Quote/FTPortfolios.pm$./lib/Finance/Quote/FTPortfolios.pm4645./lib/Finance/Quote/FTfunds.pm./lib/Finance/Quote/FTfunds.pm4544./lib/Finance/Quote/Fool.pm./lib/Finance/Quote/Fool.pm44%43./lib/Finance/Quote/Finanzpartner.pm%./lib/Finance/Quote/Finanzpartner.pm43%42./lib/Finance/Quote/FinanceCanada.pm%./lib/Finance/Quote/FinanceCanada.pm42%41./lib/Finance/Quote/FidelityFixed.pm%./lib/Finance/Quote/FidelityFixed.pm41 40./lib/Finance/Quote/Fidelity.pm ./lib/Finance/Quote/Fidelity.pm4039./lib/Finance/Quote/DWS.pm./lib/Finance/Quote/DWS.pm3938./lib/Finance/Quote/Deka.pm./lib/Finance/Quote/Deka.pm38"37./lib/Finance/Quote/Currencies.pm"./lib/Finance/Quote/Currencies.pm3736./lib/Finance/Quote/CSE.pm./lib/Finance/Quote/CSE.pm36!35./lib/Finance/Quote/Cominvest.pm!./lib/Finance/Quote/Cominvest.pm35 34./lib/Finance/Quote/Citywire.pm ./lib/Finance/Quote/Citywire.pm34&33./lib/Finance/Quote/Cdnfundlibrary.pm&./lib/Finance/Quote/Cdnfundlibrary.pm3332./lib/Finance/Quote/BSERO.pm./lib/Finance/Quote/BSERO.pm3231./lib/Finance/Quote/Bourso.pm./lib/Finance/Quote/Bourso.pm31'30./lib/Finance/Quote/BMONesbittBurns.pm'./lib/Finance/Quote/BMONesbittBurns.pm3029./lib/Finance/Quote/ASX.pm./lib/Finance/Quote/ASX.pm2928./lib/Finance/Quote/ASEGR.pm./lib/Finance/Quote/ASEGR.pm2827./lib/Finance/Quote/AIAHK.pm./lib/Finance/Quote/AIAHK.pm2726./lib/Finance/Quote/AEX.pm./lib/Finance/Quote/AEX.pm26!25./htdocs/tpj/finance-quote.txto./htdocs/tpj/finance-quote.txt25o%24./htdocs/tpj/finance-quote-sidebaro#./htdocs/tpj/finance-quote-sidebar24o%23./htdocs/tpj/finance-quote-exampleo#./htdocs/tpj/finance-quote-example23o22./htdocs/Stylesheet.csso./htdocs/Stylesheet.css22o21./htdocs/index.htmlo./htdocs/index.html21o20./htdocs/download.htmlo./htdocs/download.html20o19./htdocs/documentation.htmlo./htdocs/documentation.html19o18./htdocs/discussion.htmlo./htdocs/discussion.html18o17./htdocs/developer.htmlo./htdocs/developer.html17o16./Examples/stockdump.pl./Examples/stockdump.pl1615./Examples/Quote_example.pl./Examples/Quote_example.pl1514./Examples/currency-lookup.pl./Examples/currency-lookup.pl1413./Examples/chkshares.pl./Examples/chkshares.pl1312./Documentation/READMEo./Documentation/README12o11./Documentation/Licenseo./Documentation/License11o 10./Documentation/Hackers-Guideo./Documentation/Hackers-Guide10o9./Documentation/FAQo./Documentation/FAQ9o 8./dist.inio ./dist.ini8o7./DEV-RELEASE-INFO.orgo./DEV-RELEASE-INFO.org7o6./debian/ruleso./debian/rules6o5./debian/copyrighto./debian/copyright5o4./debian/controlo./debian/control4o3./debian/changelogo./debian/changelog3o 2./Changeso ./Changes2o1./ChangeLog.1o./ChangeLog.11o  __1_2N`4 lH, pH t@lD\0P$\4X,h@\0X(pHT(t@$hL0xX<|X4 x T 4  p P 4  l L 0  | \ <  t T 0    __.NEXTKEY156./t/za_unittrusts.t155o ./t/za.t154o./t/yahoojson.t153o./t/yahoo_speed.t152o./t/yahoo_nz.t151o./t/yahoo_europe.t150o./t/yahoo_brasil.t149o./t/yahoo_australia.t148o./t/yahoo_asia.t147o ./t/yahoo.t146o ./t/vwd.t145o./t/vanguard.t144o./t/usfedbonds.t143o ./t/union.t142o./t/ukfunds.t141o ./t/tsx.t140o ./t/tsp.t139o./t/trustnet.t138o./t/troweprice.t137o ./t/tnetuk.t136o./t/tiaacref.t135o./t/tdwaterhouse.t134o./t/tdefunds.t133o./t/stockhousecanada.t132o./t/sixshares.t131o./t/sixfunds.t130o ./t/seb.t129o ./t/quote.t128o./t/platinum.t127o ./t/nzx.t126o ./t/mtgox.t125o./t/mstaruk.t124o./t/morningstarJP.t123o./t/morningstar.t122o./t/maninvestments.t121o./t/lerevenu.t120o./t/indiamutual.t119o ./t/hu.t118o ./t/hex.t117o./t/goldmoney.t116o./t/ftportfolios.t115o./t/ftfunds.t114o./t/finanzpartner.t113o./t/financecanada.t112o./t/fidelityfixed.t111o./t/fidelity.t110o ./t/dws.t109o ./t/deka.t108o./t/currency_lookup.t107o./t/currency.t106o./t/currencies.t105o ./t/cse.t104o./t/cominvest.t103o./t/citywire.t102o./t/cdnfundlibrary.t101o ./t/bsero.t100o ./t/bourso.t99o./t/bmonesbittburns.t98o ./t/asx.t97o ./t/asegr.t96o ./t/aiahk.t95o ./t/aex.t94o./t/05-data-dumper.t93o./t/04-critic.t92o./t/03-kwalitee.t91o./t/02-pod-coverage.t90o ./t/01-pod.t89o ./t/00-use.t88o%./lib/Finance/Quote/ZA_UnitTrusts.pm85./lib/Finance/Quote/ZA.pm84 ./lib/Finance/Quote/YahooYQL.pm83!./lib/Finance/Quote/YahooJSON.pm82!./lib/Finance/Quote/Yahoo/USA.pm81 ./lib/Finance/Quote/Yahoo/NZ.pm80$./lib/Finance/Quote/Yahoo/Europe.pm79$./lib/Finance/Quote/Yahoo/Brasil.pm78"./lib/Finance/Quote/Yahoo/Base.pm77'./lib/Finance/Quote/Yahoo/Australia.pm76"./lib/Finance/Quote/Yahoo/Asia.pm75./lib/Finance/Quote/VWD.pm74!./lib/Finance/Quote/UserAgent.pm72./lib/Finance/Quote/Union.pm71"./lib/Finance/Quote/USFedBonds.pm73 ./lib/Finance/Quote/Trustnet.pm68"./lib/Finance/Quote/Troweprice.pm67 ./lib/Finance/Quote/Tiaacref.pm65$./lib/Finance/Quote/Tdwaterhouse.pm64 ./lib/Finance/Quote/Tdefunds.pm63./lib/Finance/Quote/TSX.pm70./lib/Finance/Quote/TSP.pm69./lib/Finance/Quote/TNetuk.pm66(./lib/Finance/Quote/StockHouseCanada.pm62!./lib/Finance/Quote/SIXshares.pm61 ./lib/Finance/Quote/SIXfunds.pm60./lib/Finance/Quote/SEB.pm59 ./lib/Finance/Quote/Platinum.pm58./lib/Finance/Quote/NZX.pm57./lib/Finance/Quote/MtGox.pm56%./lib/Finance/Quote/MorningstarJP.pm54#./lib/Finance/Quote/Morningstar.pm53&./lib/Finance/Quote/ManInvestments.pm52./lib/Finance/Quote/MStaruk.pm55 ./lib/Finance/Quote/LeRevenu.pm51#./lib/Finance/Quote/IndiaMutual.pm50./lib/Finance/Quote/HU.pm49./lib/Finance/Quote/HEX.pm48!./lib/Finance/Quote/GoldMoney.pm47./lib/Finance/Quote/Fool.pm44%./lib/Finance/Quote/Finanzpartner.pm43%./lib/Finance/Quote/FinanceCanada.pm42%./lib/Finance/Quote/FidelityFixed.pm41 ./lib/Finance/Quote/Fidelity.pm40./lib/Finance/Quote/FTfunds.pm45$./lib/Finance/Quote/FTPortfolios.pm46./lib/Finance/Quote/Deka.pm38./lib/Finance/Quote/DWS.pm39"./lib/Finance/Quote/Currencies.pm37!./lib/Finance/Quote/Cominvest.pm35 ./lib/Finance/Quote/Citywire.pm34&./lib/Finance/Quote/Cdnfundlibrary.pm33./lib/Finance/Quote/CSE.pm36./lib/Finance/Quote/Bourso.pm31./lib/Finance/Quote/BSERO.pm32'./lib/Finance/Quote/BMONesbittBurns.pm30./lib/Finance/Quote/ASX.pm29./lib/Finance/Quote/ASEGR.pm28./lib/Finance/Quote/AIAHK.pm27./lib/Finance/Quote/AEX.pm26./lib/Finance/Quote.pm86./htdocs/tpj/finance-quote.txt25o#./htdocs/tpj/finance-quote-sidebar24o#./htdocs/tpj/finance-quote-example23o./htdocs/index.html21o./htdocs/download.html20o./htdocs/documentation.html19o./htdocs/discussion.html18o./htdocs/developer.html17o./htdocs/Stylesheet.css22o ./dist.ini8o./debian/rules6o./debian/copyright5o./debian/control4o./debian/changelog3o ./README.md87o./Examples/stockdump.pl16./Examples/currency-lookup.pl14./Examples/chkshares.pl13./Examples/Quote_example.pl15./Documentation/README12o./Documentation/License11o./Documentation/Hackers-Guide10o./Documentation/FAQ9o./DEV-RELEASE-INFO.org7o ./Changes2o./ChangeLog.11o  __.VERSION __.VERSION 2J|`@ |X4 x hX 4  t X < D p T 4   ` D (   x T 4  |P8\,d0xH T d4d8tH T l<p@T$P$lP,pT<155./t/za_unittrusts.to 154./t/za.to153./t/yahoojson.to152./t/yahoo_speed.to151./t/yahoo_nz.to150./t/yahoo_europe.to149./t/yahoo_brasil.to148./t/yahoo_australia.to147./t/yahoo_asia.to146./t/yahoo.to 145./t/vwd.to144./t/vanguard.to143./t/usfedbonds.to142./t/union.to141./t/ukfunds.to 140./t/tsx.to 139./t/tsp.to138./t/trustnet.to137./t/troweprice.to136./t/tnetuk.to135./t/tiaacref.to134./t/tdwaterhouse.to133./t/tdefunds.to132./t/stockhousecanada.to131./t/sixshares.to130./t/sixfunds.to 129./t/seb.to128./t/quote.to127./t/platinum.to 126./t/nzx.to125./t/mtgox.to124./t/mstaruk.to123./t/morningstarJP.to122./t/morningstar.to121./t/maninvestments.to120./t/lerevenu.to119./t/indiamutual.to 118./t/hu.to 117./t/hex.to116./t/goldmoney.to115./t/ftportfolios.to114./t/ftfunds.to113./t/finanzpartner.to112./t/financecanada.to111./t/fidelityfixed.to110./t/fidelity.to 109./t/dws.to 108./t/deka.to107./t/currency_lookup.to106./t/currency.to105./t/currencies.to 104./t/cse.to103./t/cominvest.to102./t/citywire.to101./t/cdnfundlibrary.to100./t/bsero.to99./t/bourso.to98./t/bmonesbittburns.to 97./t/asx.to96./t/asegr.to95./t/aiahk.to 94./t/aex.to93./t/05-data-dumper.to92./t/04-critic.to91./t/03-kwalitee.to90./t/02-pod-coverage.to9./Documentation/FAQo89./t/01-pod.to88./t/00-use.to87./README.mdo86./lib/Finance/Quote.pm%85./lib/Finance/Quote/ZA_UnitTrusts.pm84./lib/Finance/Quote/ZA.pm 83./lib/Finance/Quote/YahooYQL.pm!82./lib/Finance/Quote/YahooJSON.pm!81./lib/Finance/Quote/Yahoo/USA.pm 80./lib/Finance/Quote/Yahoo/NZ.pm 8./dist.inio$79./lib/Finance/Quote/Yahoo/Europe.pm$78./lib/Finance/Quote/Yahoo/Brasil.pm"77./lib/Finance/Quote/Yahoo/Base.pm'76./lib/Finance/Quote/Yahoo/Australia.pm"75./lib/Finance/Quote/Yahoo/Asia.pm74./lib/Finance/Quote/VWD.pm"73./lib/Finance/Quote/USFedBonds.pm!72./lib/Finance/Quote/UserAgent.pm71./lib/Finance/Quote/Union.pm70./lib/Finance/Quote/TSX.pm7./DEV-RELEASE-INFO.orgo69./lib/Finance/Quote/TSP.pm 68./lib/Finance/Quote/Trustnet.pm"67./lib/Finance/Quote/Troweprice.pm66./lib/Finance/Quote/TNetuk.pm 65./lib/Finance/Quote/Tiaacref.pm$64./lib/Finance/Quote/Tdwaterhouse.pm 63./lib/Finance/Quote/Tdefunds.pm(62./lib/Finance/Quote/StockHouseCanada.pm!61./lib/Finance/Quote/SIXshares.pm 60./lib/Finance/Quote/SIXfunds.pm6./debian/ruleso59./lib/Finance/Quote/SEB.pm 58./lib/Finance/Quote/Platinum.pm57./lib/Finance/Quote/NZX.pm56./lib/Finance/Quote/MtGox.pm55./lib/Finance/Quote/MStaruk.pm%54./lib/Finance/Quote/MorningstarJP.pm#53./lib/Finance/Quote/Morningstar.pm&52./lib/Finance/Quote/ManInvestments.pm 51./lib/Finance/Quote/LeRevenu.pm#50./lib/Finance/Quote/IndiaMutual.pm5./debian/copyrighto49./lib/Finance/Quote/HU.pm48./lib/Finance/Quote/HEX.pm!47./lib/Finance/Quote/GoldMoney.pm$46./lib/Finance/Quote/FTPortfolios.pm45./lib/Finance/Quote/FTfunds.pm44./lib/Finance/Quote/Fool.pm%43./lib/Finance/Quote/Finanzpartner.pm%42./lib/Finance/Quote/FinanceCanada.pm%41./lib/Finance/Quote/FidelityFixed.pm 40./lib/Finance/Quote/Fidelity.pm4./debian/controlo39./lib/Finance/Quote/DWS.pm38./lib/Finance/Quote/Deka.pm"37./lib/Finance/Quote/Currencies.pm36./lib/Finance/Quote/CSE.pm!35./lib/Finance/Quote/Cominvest.pm 34./lib/Finance/Quote/Citywire.pm&33./lib/Finance/Quote/Cdnfundlibrary.pm32./lib/Finance/Quote/BSERO.pm31./lib/Finance/Quote/Bourso.pm'30./lib/Finance/Quote/BMONesbittBurns.pm3./debian/changelogo29./lib/Finance/Quote/ASX.pm28./lib/Finance/Quote/ASEGR.pm27./lib/Finance/Quote/AIAHK.pm26./lib/Finance/Quote/AEX.pm!25./htdocs/tpj/finance-quote.txto%24./htdocs/tpj/finance-quote-sidebaro%23./htdocs/tpj/finance-quote-exampleo22./htdocs/Stylesheet.csso21./htdocs/index.htmlo20./htdocs/download.htmlo 2./Changeso19./htdocs/documentation.htmlo18./htdocs/discussion.htmlo17./htdocs/developer.htmlo16./Examples/stockdump.pl15./Examples/Quote_example.pl14./Examples/currency-lookup.pl13./Examples/chkshares.pl12./Documentation/READMEo11./Documentation/Licenseo 10./Documentation/Hackers-Guideo1./ChangeLog.1oFinance-Quote-1.38/GRTAGS000644 000765 000024 00000760000 12566055631 014563 0ustar00ecstaff000000 000000 b1 N<L|p`T\D4(p< H 8 ,$ 4, <t \ x  < \,DtXx\dHt8\,<8x,|,PLL0t%81 @n 75,17,11,11,6-1 %80 @n 61,7-1 %79 @n 80,7-1 %78 @n 61,7-1%77 @n 78,82,67,88,12-1 %76 @n 64,7-1 %75 @n 64,7-1%74 @n 89,59,7,58 %73 @n 44,120%71 @n 62,35,8,18%70 @n 81,23,11%69 @n 52,12,31,7,12,28,6-1%68 @n 67,2,2,89,2,9-1%67 @n 62,19,10-1%66 @n 76,215,5,53"%65 @n 276,198,202,200-1,85,23,7-1%64 @n 44,47,30,10-1%63 @n 44,47,31,10-1%62 @n 69,133-1%61 @n 26,24,15%60 @n 26,24,15%59 @n 54,10,12,18-1%58 @n 64,11,15,8,26,10-1%57 @n 60,30,8,18%56 @n 37,8,4,6,9,106,14-1%55 @n 70,116,5,51%54 @n 46,54,24%53 @n 28,13,24,16-1%52 @n 65,12,22,27,22,17-1%51 @n 62,69,62,53,51,61,49-1%50 @n 51,15,35,8!%49 @n 61,3,2,4,2,8,6,53,5,6,33,5%48 @n 71,12,16,4,43,10-1 %47 @n 59,48-1,2,27,18,25,12,8,7%46 @n 66,2,2,72,5,5-1%45 @n 91,215,5,8%44 @n 81,33-1%43 @n 52,22,9%42 @n 41,74,26,14 %41 @n 49,144%40 @n 62,5-1,31,4-1!%39 @n 90,46-1,3,18-1,59,13,7,8,7%38 @n 55,22,12%37 @n 46,162,28,19,60%36 @n 56,59,19-1%35 @n 70,4-1,33,21%34 @n 76,160,33,5,53%33 @n 55,47,16-1%32 @n 53,75,9-1%31 @n 109,51,68,18,31,41-1%30 @n 53,86,4,26-1%29 @n 71,13,17,81-1%28 @n 53,45,9-1%27 @n 53,12,15,12,18,26%26 @n 72,72,20-1 $^W86 @n 259,12 $@86 @n 86,28 $@56 @n 93,40 $+86 @n 639,23 $$69 @n 139,3$$68 @n 107-1,13,20,2,4,3 $$62 @n 152-1 $$53 @n 53,11$$48 @n 109,11,3,4-3,2,4 $$38 @n 74-4$$33 @n 96-4,2,6$$27 @n 101,6,3-2,2,2 $#44 @n 98 $#39 @n 157 $#31 @n 183,27 $#30 @n 125{$86 @n 52,10,6-1,8,11,11-1,7-2,6,4-1,5,3,6,2-3,15-1,2-1,7-1,7,13,2-2,2,9,2,29-1,2-1,2-1,4-1,2,2,3-1,2,9,3,3,3,2,3,19-1,3,2-2,2,3,3,3,2,3,2-1,2,2,2,2,2,2-1,4,10,2-1,3,19-1,2-1,2,26-4,3,2-1,3,3,4-2,5-2,13-1,2,4,13,2-1,2-2,13-1,5-1,9-3,16,2,12,3,2-1,12,2,2,3,12-2,2,2-2,3-1,2,19,2,2,2-1,2,3-1,2,2,10-1,3,7,12-1,3,7,33-3,2,12-4,3-4,4-3,4-3,4-3,2-2,2,2-1,4-9,3,20,2-1,2,11,5,2,3,2,4-19$85 @n 24-2,14,3,5,2-1,3,4-2,4,2,4,3-1,5-4,3-22,5-4,5-1,2Y$84 @n 33-1,13,3,5,2-1,3,4-2,4-1,4,3-1,21-1,2-2,3-3,3,3,4-1,5-1,8,3,3,5-2,3-2,3-2,3-1,3-1:$83 @n 37,3,17,2-4,2,2-5,8,2,3,4,2-2,7-7,2-9,2,2-3,3-1,7-1E$82 @n 38-1,18,2-3,2,2-1,2-3,8,2,3,5,2-2,6-2,4-12,2-1,2-5,2-2,3-1,7-1$81 @n 44,41,7,2-3,2,10,5,2-2$80 @n 41,12,8,2-3$79 @n 43,27,10,2-2$78 @n 42,14,5,2-3f$77 @n 53,98-1,6,3,4,2,7-4,5,2-2,3,7,4,5-1,10-2,3,5,2,4,5-2,3,2,6-2,6-2,2-5,3-4,7,3,3,7-1,2,2,2,13,6-3$76 @n 42,14,8,2-3$75 @n 45,14,5,2-2q$74 @n 62,4,8,7,4-1,6-1,4-4,2,3-1,3-2,2-1,3-2,2-2,2-2,2-2,2-2,3-1,2,3,3-2,2,3-1,2-2,3-5,3,3-1,3-1,3,2-5,4,3-3,2,9Q$73 @n 26-1,15,8,2,3-3,4-6,3-1,8,6-1,2,2,4,2,2-1,2-1,10,7,3-1,7,3-8,4-2,2-1,2,5-2($72 @n 42-2,5-1,6-2,6-2,10-2,5-2,3,8-3,23$71 @n 58,3-1,3,2,4-1,3,3,4,4-1,2,3-8,5,2,2-1,6,2-1H$70 @n 47,3,27,10,3-1,3-4,6,5-3,14,5-1,2-1,2-1,3-1,4,2-2,5-1,2-2,2,4,2-15$69 @n 46-1,39,10,2-3,3,4,2-1,3-1,6-3,2-2,3-1,2-8,2-1Q$68 @n 46,2,15,4-1,7-1,2-6,2-4,3-2,4-1,2,2-1,3-1,3-2,5-5,4-2,2-1,2,3-14,6,2,2,4-1 $67 @n 45,16-1,3-4,2,3-3,2-5,2-1$66 @n 51-2,18,7-2,4,2-3,4,2-1,4-1,4-1,3-2,3-1,2-1,2,2,5,2-2,2,2-1,2-3,5-1,2,4-1,3,2,2-1,6-1,2,2,4,4-1,3-2,4-1,2,2,5-1,2-1,2-1,2-1,2-4,2,3-1,3,9-1,2-3,2,2-1,2,2-3,2,4,2-1,10,4,2,3-1,2-1,4,2,5,3-1,2-1,4-1,2-1,8,4,2-2,5-4,4,3,2h$65 @n 49,226,2-194,4-194,8-194,7-2,2-1,4,2-3,2-2,2,5-6,2-1,2,2-1,3-1,2,2-4,3-3,4-2,6-18,2-3,2-1,4-2,6-3=$64 @n 42,17,3,3,2,9,2-1,2-1,3,5-1,2-4,2,3-1,2-1,4-1,3-10,2-1=$63 @n 42,17,3,3,2,9,2-1,2-1,3,5-1,2-4,2,3-1,2-1,4-1,3-11,2-1o$62 @n 43-2,17,9,4,3-1,2-2,3,2-1,3,3,2,2-1,3-2,6,2,18-3,3-1,3,3-1,3,2,2-1,7,2-1,3-2,2,2-1,3,3,2,4-1,3,2-1,3-1,3#$61 @n 14,9,3,2-7,3,4-2,2,4,2,4,2,3#$60 @n 14,9,3,2-7,3,4-2,2,4,2,4,2,3$59 @n 39,11,4,2-6,5-1,3-11,5-33$58 @n 46,15,5,2,2-3,5,3,4-3,6-2,11-6,2-1,2-1,3,2-57$57 @n 53-1,3-2,4,2,4-1,3,2,2-1,2-1,2,2-8,5,2,2-1,6,2-1f$56 @n 38-5,7-3,7-1,4-1,4-2,2-1,4-1,3-2,3-1,2-1,2,4-1,6-1,2-1,2-1,8-1,2-3,5-1,3,6-1,4-1,5-4,4-2,2-3,15$55 @n 45-2,18,7-2,4,2-3,4,2-1,4-1,4-1,3-1,4-1,4-1,3-2,3,4-1,3,2,2-1,7,4-1,3-1,7-1,4-3,3,4,2,3,2,4,2,5,3,2-1,4,2-1,8,4,2-2,5-4,4,3,25$54 @n 34,9,3-1,3,5-7,3,3-1,2-5,6-1,10,3,3-10,4-1,5-1($53 @n 13,11,4,2-9,5-1,2-3,4-7,2-3,4,4-37$52 @n 46-1,15,5,2,3-3,5-1,2-1,3,2,5-3,14-1,2,5-4,20-11$51 @n 46,14,2-1,2,2,2,2,4,2,2,2-1,5,2-1,14-2,4,3-2,2-2,3-5,4,4,4,4,4,4,6-2,4,10-2,2-8,3-2,3,4,4,4,4,4,6-2,4,10-12,2-2,3-3,6-2,4,10-2,2-2,3-5,4,4,4,4,4,4,5-2,4,12-2,2-2,3-5,4,4,4,4,4,5-2,4,10-1,7-15$50 @n 21-1,4-1,15,10,2,2,2,3-3,6,7-3,2-1,5-5,2-7,2-1\$49 @n 24-1,2-1,31,4-2,5-1,5-1,7,4,2-3,2-3,4,2-2,5-3,8,7-10,2,7,4,2-3,2-3,4-3,4-10,2,7-4,8-4J$48 @n 46,22,5-1,2,2-3,7,2,4-3,7,3,2-1,3,2,2,3-1,2,2,2-3,2,4-1,3-1,4-1,2-3g$47 @n 54,4,3-1,3-2,5-4,2-5,2,6-2,2-1,3-4,3-1,13,4-1,2,3,2,5-7,6-1,2,2-6,6-1,2,3,2,5-7,12,3-2,8,2,2-3,3H$46 @n 46-1,15,4-1,7-2,3,4-2,4-1,9,3-3,4-1,2-2,3,3-1,3-1,3-3,2,4-5,3,2,2$45 @n 64-2,20,7-2,4,2-3,4,2-1,4-1,6-1,3-2,4-2,2,5,3-2,3-2,4-2,2,3,4-1,3,2,3-1,3,3-1,3,2,2-1,3,2,4-2,3-1,2,4-1,3,4-1,3,2,2,2,4-1,4,3,2-1,6,2-2,5-5,7-1,2,2,3,4-1,5,4-1,3,2,4,2,5,3.$44 @n 45,6,27-1,4,2-1,3,2-2,2-1,3-1,3,2,2-1,2&$43 @n 25,8,4,5,2,5,2,3-5,2-2,2-1,2-11^$42 @n 21-1,17,6,2-1,2-3,3,2,2-1,6-1,10-3,2-1,6,2,13-1,3-1,3,2-3,2-4,2-1,2-3,2,5-1,2,2-1,2-1,3_$41 @n 30-2,15,3,5-1,2-1,2,3-2,4-1,3,2-1,26-2,3-5,3-1,4-8,2,2,3-2,3,3,2-1,4-8,6-4,3-4,2,2,2-2,3$40 @n 41,18,3,6,4-4,2-1,3,2-15]$39 @n 85,4,3-1,26-1,4-1,2-1,2-2,3-1,10,5-2,11-2,5-2,5-2,3-1,3-3,2-2,6,2-1,6-3,4-9,6-3,11,3-2+$38 @n 26,8,4,5,4,5,2,3-1,2-2,3-2,6,2-7,3-1B$37 @n 32,186-2,7-1,11-3,6,2,2,6,2,2,2-2,8,2,2,3,2,2,2,4-2,8,2,2,2=$36 @n 39,13,4-2,2,3,3,2,3,4-3,3,5-1,2,4,2,3-15,2,2-1,6-1,2-1-$35 @n 46,21,3,5,3-1,2-1,3,4-1,8-10,2,4-3,6-2$34 @n 51-2,18,7-2,4,2-3,4,2-1,4-1,4-1,3-2,3-1,2-2,4,2-1,2,2,2-1,5-1,2,4-1,3,2,2-1,6,4-1,3-2,4-2,4-1,2-1,2,2,2-4,2-3,2,3-4,2,2-3,2,4,4-3,2-3,2-1,2,2,2,8-1,4,2,3,2-1,4,2,5,3-1,2-1,4-1,2-1,8,4,2-2,5-4,4,3,2:$33 @n 28,2,16,9-1,2,4-3,4,2,4,2-1,5-1,2,2-4,3-5,2,3,3,3-1S$32 @n 35,16,2-2,2,2,2,2,3,2,2,2-1,4,2,4-1,4-3,4-1,2-1,2-1,2-1,2-1,2-1,5-10,2,2,3-1$31 @n 80,21-2,4,2-1,2,2-3,2,4,3,2,3,3-1,4-2,3,3-1,5-1,3,6-6,7-3,3-3,4-2,2,6-3,4-1,2-6,2,4-1,2,4,4,4-1,3-2,3-2,3,5-1,3-5,2,3,3-6,3-1,3-1,3-1,3-1,3-1,3-1,2,2,5,3-1_$30 @n 41,7,4,3-1,2-1,2,4,3,4-2,5,3-2,7-1,2-2,4-1,2,3,3-1,2-2,2-8,2-2,2-2,4-3,3-2,4-1,3,2,6,4-1symbolCommon eurodate,2require3,2join TableExtract,2usdatets tdefunds_2stock2selquoterparse3nav$2looinfo-3fundr,2 d, code1 ac_ XAU Request::PLNKronorFTFUNDS_LOOK_U_@$%_$_fpx@(,Dd$`pP0` |<@od exchange date isodate time/]) };NL&resultsTitle=Amsterdam+-+Euronext&cha=1800&format=txt&formatDecimal=.&formatDate=dd/MM/yy";x.C.H: :langmap=C#\:.cs: :langmap=Cobol\:.cbl.cob.CBL.COB: :langmap=DosBatch\:.bat.cmd: :langmap=Eiffel\:.e: :langmap=Erlang\:.erl.ERL.hrl.HRL: :langmap=Flex\:.as.mxml: :langmap=Fortran\:.f.for.ftn.f77.f90.f95.F.FOR.FTN.F77.F90.F95: :langmap=HTML\:.htm.html: :langmap=Java\:.java: :langmap=JavaScript\:.js: :langmap=Lisp\:.cl.clisp.el.l.lisp.lsp: :langmap=Lua\:.lua: :langmap=MatLab\:.m: :langmap=OCaml\:.ml.mli: :langmap=Pascal\:.p.pas: :langmap=Perl\:.pl.pm.plx.perl: :langmap=PHP\:.php.php3.phtml: :langmap=Python\:.py.pyx.pxd.pxi.scons: :langmap=REXX\:.cmd.rexx.rx: :langmap=Ruby\:.rb.ruby: :langmap=Scheme\:.SCM.SM.sch.scheme.scm.sm: :langmap=Sh\:.sh.SH.bsh.bash.ksh.zsh: :langmap=SLang\:.sl: :langmap=SML\:.sml.sig: :langmap=SQp=Tcl\:.tcl.tk.wish.itcl: :langmap=Tex\:.tex: :langmap=Vera\:.vr.vri.vrh: :langmap=Verilog\:.v: :langmap=VHDL\:.vhdl.vhd: :langmap=Vim\:.vim: :langmap=YACC\:.y: :gtags_parser=Asm\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=Asp\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=Awk\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=Basic\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=BETA\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=C\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=C++\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=C#\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=Cobol\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=DosBatch\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=Eiffel\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=Erlang\:/usr/local/lib/gtags/exuberant-ctags.la: :gtags_parser=Flex\:/usr/local/lib/gtags/exuberanY(YPX$tus_mHYPX_mbolhY PXyear_specifiedY PXstocksY!PXEXPORT_TAGSYPXmodulesYPXlabelhashL YPXparam_errorsH YPXconversionp YPXavailable YPXFQ_LOAD_QUOTELET Y YPXmodule YPXshift YPXthisre( Y PXpushOXH Y@PXlocalh Y8PXreturned_currencies Y9PXpiecesrefPX Yp;PXvalue Y =PXisodate Y>PXrequiredequire( Y@PXexchange_rateP Y0BPXmatchedp YCPX@PX YEPX1bels Y@GPXyearExt YHPXtextY YJPXexists YPLPXstock0 YNPXfailed_stocksX YOPXinfox Y`QPXsymbol YSPXclass YTPXfrom YpVPX$^W Y XPXmethod YYPXi8 Y[PXscaleX Y0]PXcarpx Y^PXval1 Y`PXundef Y@bPXminsge YcPXindex YePXmnamesaYPgPXmonth8YiPXEXPORT_OKPX`YjPXMODULESY`lPXcurrencylPXYnPXFAILOVERnPXYoPXselfYpqPX_smart_compareY sPXuaY8YtPX$@YXYvPXamount YxY0xPX%YYyPXdefinedY{PXseenY@}PXlengthY~PXreqmodulesX YPXparams@YPPX_dummy`YPXnew_currencyo$62 @n 43-2,17,9,4,3-1,2-2,3,2-1,3,3,2,2-1,3-2,6,2,18-3,3-1,3,3-1,3,2,2-1,7,2-1,3-2,2,2-1,3,3,2,4-1,3,2-1,3-1,3=$64 @n 42,17,3,3,2,9,2-1,2-1,3,5-1,2-4,2,3-1,2-1,4-1,3-10,2-1$66 @n 51-2,18,7-2,4,2-3,4,2-1,4-1,4-1,3-2,3-1,2-1,2,2,5,2-2,2,2-1,2-3,5-1,2,4-1,3,2,2-1,6-1,2,2,4,4-1,3-2,4-1,2,2,5-1,2-1,2-1,2-1,2-4,2,3-1,3,9-1,2-3,2,2-1,2,2-3,2,4,2-1,10,4,2,3-1,2-1,o$62 @n 43-2,17,9,4,3-1,2-2,3,2-1,3,3,2,2-1,3-2,6,2,18-3,3-1,3,3-1,3,2,2-1,7,2-1,3-2,2,2-1,3,3,2,4-1,3,2-1,o$62 @n 43-2,17,9,4,3-1,2-2,3,2-1,3,3,2,2-1,3-2,6,2,18-3,3-1,3,3-1,3,2,o$62 @n 43-2,17,9,4,3-1,2-2,3,2-1,3,3,2,2-1,3-2,6,2,18-3,3-1,3,3-1,3,2,2-1,7,2-1,3-2,2,2-1,3,3,2,4-1,3,2-1,o$62 @n 43-2,17,9,4,3-1,2-2,3,2-1,3,3,2,2-1,3-2,6,2,18-3,3-1,3,3-1,3,2,2-1,7,2-1,3-2,2,2-1,3,3,2,4-1,3,2-1,3-1,3=$64 @n 42,17,3,3,2,9,2-1,2-1,3,5-1,2-4,2,3-1,2-1,4-1,3-10,2-1$66 @n 51-2,18,7-2,4,2-3,4,2-1,4-1,4-1,3-2,3-1,2-1,2,2,5,2-2,2,2-1,2-3,5-1,2,4-1,3,2,2-1,6-1,2,2,4,4-1,3-2,4-1,2,2,5-1,2-1,2-1,2-1,2-4,2,3-1,3,9-1,2-3,2,2-1,2,2-3,2,4,2-1,10,4,2,3-1,2-1,4,2,5,3-1,2-1,4-1,2-1,8,4,2-2,5-4,4,3,2Q$68 @n 46,2,15,4-1,7-1,2-6,2-4,3-2,4-1,2,2-1,3-1,3-2,5-5,4-2,2-1,2,3-14,6,2,2,4-1H$70 @n 47,3,27,10,3-1,3-4,6,5-3,14,5-1,2-1,2-1,3-1,4,2-2,5-1,2-2,2,4,2-1($72 @n 42-2,5-1,6-2,6-2,10-2,5-2,3,8-3,2q$74 @n 62,4,8,7,4-1,6-1,4-4,2,3-1,3-2,2-1,3-2,2-2,2-2,2-2,2-2,3-1,2,3,3-2,2,3-1,2-2,3-5,3,3-1,3-1,3,2-5,4,3-3,2,9$76 @n 42,14,8,2-3$78 @n 42,14,5,2-3$80 @n 41,12,8,2-3Y$84 @n 33-1,13,3,5,2-1,3,4-2,4-1,4,3-1,21-1,2-2,3-3,3,3,4-1,5-1,8,3,3,5-2,3-2,3-2,3-1,3-19$85 @n 24-2,14,3,5,2-1,3,4-2,4,2,4,3-1,5-4,3-22,5-4,5-1,2:$83 @n 37,3,17,2-4,2,2-5,8,2,3,4,2-2,7-7,2-9,2,2-3,3-1,7-1$81 @n 44,41,7,2-3,2,10,5,2-2$79 @n 43,27,10,2-2$75 @n 45,14,5,2-2Q$73 @n 26-1,15,8,2,3-3,4-6,3-1,8,6-1,2,2,4,2,2-1,2-1,10,7,3-1,7,3-8,4-2,2-1,2,5-23$71 @n 58,3-1,3,2,4-1,3,3,4,4-1,2,3-8,5,2,2-1,6,2-15$69 @n 46-1,39,10,2-3,3,4,2-1,3-1,6-3,2-2,3-1,2-8,2-1 $67 @n 45,16-1,3-4,2,3-3,2-5,2-1h$65 @n 49,226,2-194,4-194,8-194,7-2,2-1,4,2-3,2-2,2,5-6,2-1,2,2-1,3-1,2,2-4,3-3,4-2,6-18,2-3,2-1,4-2,6-3=$63 @n 42,17,3,3,2,9,2-1,2-1,3,5-1,2-4,2,3-1,2-1,4-1,3-11,2-1#$61 @n 14,9,3,2-7,3,4-2,2,4,2,4,2,3$59 @n 39,11,4,2-6,5-1,3-11,5-37$57 @n 53-1,3-2,4,2,4-1,3,2,2-1,2-1,2,2-8,5,2,2-1,6,2-1$55 @n 45-2,18,7-2,4,2-3,4,2-1,4-1,4-1,3-1,4-1,4-1,3-2,3,4-1,3,2,2-1,7,4-1,3-1,7-1,4-3,3,4,2,3,2,4,2,5,3,2-1,4,2-1,8,4,2-2,5-4,4,3,2($53 @n 13,11,4,2-9,5-1,2-3,4-7,2-3,4,4-3$51 @n 46,14,2-1,2,2,2,2,4,2,2,2-1,5,2-1,14-2,4,3-2,2-2,3-5,4,4,4,4,4,4,6-2,4,10-2,2-8,3-2,3,4,4,4,4,4,6-2,4,10-12,2-2,3-3,6-2,4,10-2,2-2,3-5,4,4,4,4,4,4,5-2,4,12-2,2-2,3-5,4,4,4,4,4,5-2,4,10-1,7-1\$49 @n 24-1,2-1,31,4-2,5-1,5-1,7,4,2-3,2-3,4,2-2,5-3,8,7-10,2,7,4,2-3,2-3,4-3,4-10,2,7-4,8-4$45 @n 64-2,20,7-2,4,2-3,4,2-1,4-1,6-1,3-2,4-2,2,5,3-2,3-2,4-2,2,3,4-1,3,2,3-1,3,3-1,3,2,2-1,3,2,4-2,3-1,2,4-1,3,4-1,3,2,2,2,4-1,4,3,2-1,6,2-2,5-5,7-1,2,2,3,4-1,5,4-1,3,2,4,2,5,3&$43 @n 25,8,4,5,2,5,2,3-5,2-2,2-1,2-11_$41 @n 30-2,15,3,5-1,2-1,2,3-2,4-1,3,2-1,26-2,3-5,3-1,4-8,2,2,3-2,3,3,2-1,4-8,6-4,3-4,2,2,2-2,3]$39 @n 85,4,3-1,26-1,4-1,2-1,2-2,3-1,10,5-2,11-2,5-2,5-2,3-1,3-3,2-2,6,2-1,6-3,4-9,6-3,11,3-2B$37 @n 32,186-2,7-1,11-3,6,2,2,6,2,2,2-2,8,2,2,3,2,2,2,4-2,8,2,2,2-$35 @n 46,21,3,5,3-1,2-1,3,4-1,8-10,2,4-3,6-2:$33 @n 28,2,16,9-1,2,4-3,4,2,4,2-1,5-1,2,2-4,3-5,2,3,3,3-1$31 @n 80,21-2,4,2-1,2,2-3,2,4,3,2,3,3-1,4-2,3,3-1,5-1,3,6-6,7-3,3-3,4-2,2,6-3,4-1,2-6,2,4-1,2,4,4,4-1,3-2,3-2,3,5-1,3-5,2,3,3-6,3-1,3-1,3-1,3-1,3-1,3-1,2,2,5,3-1  __.VERSION __.VERSION 6 __.COMPNAME __.COMPNAME __.COMPLINE __.COMPLINE __.COMPACT __.COMPACTXpT0X hhP4tX88  |`D(d@\D,pT4`4tX<{tuRrS567mnKDE./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @nl$47 @n 54,4,4,2-2,3-2,5-4,2-1,2-1,2-1,3,6,2-1,2,2,2-1,2,2-2,4,2,8,5,3-5,5,2,2-5,6,5,2-5,12,3-2,8,2,2-1,2-1,3 $^W86 @n 259,12-3 $@86 @n 86,28 $+86 @n 639,23-1,{$86 @n 52,10,6-1,8,11,11-1,7-2,6,4-1,5,3,6,2-3,15-1,2-1,7-1,7,13,2-2,2,9,2,29-1,2-1,2-1,4-1,2,2,3-1,2,9,3,3,3,2,3,19-1,3,2-2,2,3,3,3,2,3,2-1,2,2,2,2,2,2-1,4,10,2-1,3,19-1,2-1,2,26-4,3,2-1,3,3,4-2,5-2,13-1,2,4,13,2-1,2-2,13-1,5-1,9-3,16,2,12,3,2-1,12,2,2,3,12-2,2,2-2,3-1,2,19,2,2,2-1,2,3-1,2,2,10-1,3,7,12-1,3,7,33-3,2,12-4,3-4,4-3,4-3,4-3,2-2,2,2-1,4-9,3,20,2-1,2,11,5,2,3,2,4-1-3I$82 @n 38-1,23,2-3,2,2-1,2-3,8,2,3,5,2-2,5-2,4-14,2-1,2-7,2-2,5-2,3-1,7-1f$77 @n 53,98-1,6,3,4,2,7-4,5,2-2,3,7,4,5-1,10-2,3,5,2,4,5-2,3,2,6-2,6-2,2-5,3-4,7,3,3,7-1,2,2,2,13,6-3%29 @n 71,13,17,81-1%28 @n 53,45,9-1%36 @n 56,59,19-1%35 @n 70,4-1,33,21%34 @n 76,160,33,5,53%33 @n 55,47,16-1%32 @n 53,75,9-1%31 @n 109,51,68,18,31,41-1!%39 @n 90,46-1,3,18-1,59,13,7,8,7%52 @n 65,12,22,27,22,17-1%51 @n 62,69,62,53,51,61,49-1%50 @n 51,15,35,8!%49 @n 61,3,2,4,2,8,6,53,5,6,33,5%48 @n 71,12,16,4,43,10-1%46 @n 66,2,2,72,5,5-1%45 @n 91,215,5,8%44 @n 81,33-1%43 @n 52,22,9%42 @n 41,74,26,14 %41 @n 49,144%40 @n 62,5-1,31,4-1%38 @n 55,22,12%37 @n 46,162,28,19,60%55 @n 70,116,5,51%59 @n 54,10,12,18-1%63 @n 44,47,31,10-1%67 @n 62,19,10-1%71 @n 62,35,8,18 %76 @n 64,7-1 %80 @n 61,7-1%81 @n 75,17,11,11,6-1 %79 @n 80,7-1 %78 @n 61,7-1 %75 @n 64,7-1%74 @n 89,59,7,58 %73 @n 44,120%70 @n 81,23,11%69 @n 52,12,31,7,12,28,6-1%68 @n 67,2,2,89,2,9-1%66 @n 76,215,5,53%83 @n 59,69,15-1%85 @n 42,83,4%84 @n 49,94,31"%65 @n 276,198,202,200-1,85,23,7-1%64 @n 44,47,30,10-1%62 @n 69,133-1%61 @n 26,24,15%60 @n 26,24,15%58 @n 64,11,15,8,26,10-1%57 @n 60,30,8,18%56 @n 37,8,4,6,9,106,14-1%54 @n 46,54,24%53 @n 28,13,24,16-1 $@56 @n 93,40$$27 @n 101,6,3-2,2,2$$33 @n 96-4,2,6$$48 @n 109,11,3,4-3,2,4 $$38 @n 74-4 $$69 @n 139,3$$68 @n 107-1,13,20,2,4,3 $$62 @n 152-1 $$53 @n 53,11 $#30 @n 125 $#31 @n 183,27 $#44 @n 98 $#39 @n 157I$26 @n 51,17,4-2,2,3,3,2,2,4-3,3,6-3,2,2,2,4,2,3-3,2-11,3,3,2,3-1,6-1,2-15$28 @n 35,16,2-1,2,2,2,2,3,3,2,2-1,5,2-1,4-11,2,2,3-1F$29 @n 47,20,6,5-4,5,5,4-3,6-1,3,4,3,2,2,2,3-1,8-2,5,6-2,9,3,2-2,6,2-3@$27 @n 38,13,2-1,2-2,2,2-1,9-1,2-3,9-3,8-3,2-7,2,2-3,2,2-2,6,3-1_$30 @n 41,7,4,3-1,2-1,2,4,3,4-2,5,3-2,7-1,2-2,4-1,2,3,3-1,2-2,2-8,2-2,2-2,4-3,3-2,4-1,3,2,6,4-1S$32 @n 35,16,2-2,2,2,2,2,3,2,2,2-1,4,2,4-1,4-3,4-1,2-1,2-1,2-1,2-1,2-1,5-10,2,2,3-1$34 @n 51-2,18,7-2,4,2-3,4,2-1,4-1,4-1,3-2,3-1,2-2,4,2-1,2,2,2-1,5-1,2,4-1,3,2,2-1,6,4-1,3-2,4-2,4-1,2-1,2,2,2-4,2-3,2,3-4,2,2-3,2,4,4-3,2-3,2-1,2,2,2,8-1,4,2,3,2-1,4,2,5,3-1,2-1,4-1,2-1,8,4,2-2,5-4,4,3,2=$36 @n 39,13,4-2,2,3,3,2,3,4-3,3,5-1,2,4,2,3-15,2,2-1,6-1,2-1+$38 @n 26,8,4,5,4,5,2,3-1,2-2,3-2,6,2-7,3-1$40 @n 41,18,3,6,4-4,2-1,3,2-15^$42 @n 21-1,17,6,2-1,2-3,3,2,2-1,6-1,10-3,2-1,6,2,13-1,3-1,3,2-3,2-4,2-1,2-3,2,5-1,2,2-1,2-1,3.$44 @n 45,6,27-1,4,2-1,3,2-2,2-1,3-1,3,2,2-1,2H$46 @n 46-1,15,4-1,7-2,3,4-2,4-1,9,3-3,4-1,2-2,3,3-1,3-1,3-3,2,4-5,3,2,2J$48 @n 46,22,5-1,2,2-3,7,2,4-3,7,3,2-1,3,2,2,3-1,2,2,2-3,2,4-1,3-1,4-1,2-35$50 @n 21-1,4-1,15,10,2,2,2,3-3,6,7-3,2-1,5-5,2-7,2-17$52 @n 46-1,15,5,2,3-3,5-1,2-1,3,2,5-3,14-1,2,5-4,20-115$54 @n 34,9,3-1,3,5-7,3,3-1,2-5,6-1,10,3,3-10,4-1,5-1f$56 @n 38-5,7-3,7-1,4-1,4-2,2-1,4-1,3-2,3-1,2-1,2,4-1,6-1,2-1,2-1,8-1,2-3,5-1,3,6-1,4-1,5-4,4-2,2-3,153$58 @n 46,15,5,2,2-3,5,3,4-3,6-2,11-6,2-1,2-1,3,2-5#$60 @n 14,9,3,2-7,3,4-2,2,4,2,4,2,3<dhlT<$Lx`04h|dD,t\D,\<<4lDd<lT8 |P,pH( h@ dD t567mnKDE./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use var@47 @@ 55-1,7,13,42-1,65,4,11 %47 @n 63,56,2,2,10,15,18,12,8,7@86 @@ 54-2,2,30,14,5,21,6,3,3,20-1,4-1,2,5-1,2,10,49,66,49,121-1,2,4,11,36-1,14-3,18,14,2-2,2-1,4,4-1,46,2,7,2,12,2,7,2,93,32,16 386 @n 77151, 286 @n 769 @n186 @n 239,530,487%86 @n 119-1,13,3,81,83-1,2,13,4,15,69,135,34,6,7,8,114@82 @@ 51,4,8-1,5 382 @n 147 @@ 282 @n 147 @@182 @n 139-1,746,%82 @n 40,24,86,15-1&@77 @@ 43-2,14,4,8,84,10,2,5,2,10-1,12 @@ 277 @n 240,33 177 @n 239,34%77 @n 78,82,67,88,12-12, @$58 @@$ 95,21 @$53 @@$ 51-1@$52 @@$ 113,7,27-2m@$51 @@$ 120,2-1,8,4,4,4,4,4,9,3,17-1,10,2,4,4,4,4,4,9,3,27,3,11,3,17,2-1,8,4,4,4,4,4,8,3,19,2-1,8,4,4,4,4,8,3 @$49 @@$ 113@26 @@ 57,2-1,9-1,39,2,2,2,39@27 @@ 43,3,6,8,16,10-2,10,2@29 @@ 52,3-1,12-2,7-1,2,15-2,8@28 @@ 42,2-2,6,6,19-1@34 @@ 61,2-1,8,2,8@33 @@ 36,2-1,8,5,4,4,26-1@32 @@ 42,2-2,6-1,6,21,8'@31 @@ 89,4-2,6,7,6,17,2,11,2,36,7,20,3@30 @@ 49-1,8,34,8,59@42 @@ 31-2,7,3,4@45 @@ 76,2-1,8,2,8@44 @@ 53,12,2,4,8-1,5,10,8@43 @@ 50,4,16@41 @@ 40-1,7,3,2,5,52,43@40 @@ 47,3-1,9-2,6,86@39 @@ 86-1,3,2,8,19,16-1,11,4,7,6,7,7,5,5,4,18,2,32,4@38 @@ 53,4,7-1@37 @@ 23,225,26,27@36 @@ 44,2,7-1,33,2,2,2,31@35 @@ 56,2-1,9-2,5,8,11,20,9@50 @@ 33-2,8,5,14,15-1,2,3,5@58 @@ 51,2,9-1,8,13-2,8@66 @@ 61,2-1,8,2,8@72 @@ 35,7,14,2,6,2,10,20,5@71 @@ 59-1,2,3,12,8,31!@70 @@ 52,12-1,13-1,5,3,4,5,13,17@69 @@ 79,2,6,5,26@68 @@ 53,2-1,8,2-1,5,2@67 @@ 51,2-1,8,9@65 @@ 873-2,12-1,4-1,12,42,30 @64 @@ 91,8 @63 @@ 91,8@62 @@ 53-2,8,4,6 @61 @@ 24-1,3 @60 @@ 24-1,3@59 @@ 44,2,5,2,7,13,14@57 @@ 44,2,9-1,4,3,17,29"@56 @@ 30,2,6,3,2,7,2-1,6,3,3,88-2@55 @@ 55,2-1,8,2,8@54 @@ 30,12,5,18,28@53 @@ 18,2,5,2-1,2,7,16,21#@52 @@ 52,2,9-1,9,20-2,11,4-2,2,2,3G@51 @@ 52,2-1,6,4,21-1,18,9,4,40,16,4,11,31,15,2,7,6,14,16,4,39,18,4,35&@49 @@ 42,2,3-7,6,3,22,5,20,3,3,5,28,5@48 @@ 53,3-2,11-1,9,14-2,9,3@46 @@ 52,2-1,8,2-1,5,2,10@74 @@ 87-1,10,41@78 @@ 48,2-1,6-1,3,2@85 @@ 33,2,6,3,2,4,38,27,8@84 @@ 41,2,5,3,2,4,54,12@83 @@ 47,4,7-1,6@81 @@ 55,2-6,23-1,5,2,16-1,3,2@80 @@ 46,2,6-1,6,2@79 @@ 53,3,5,2,8-1,4-1,3,2@76 @@ 48,2-1,6-1,6,2@75 @@ 50,2,8-1,3,2@73 @@ 35-1,7,5,4,61 641 @n 159,10 441 @n 159,10 455 @n 166 326 @n 144 345 @n 206 362 @n 196 355 @n 119,46 383 @n 123 374 @n 149 226 @n 144 239 @n 210 234 @n 212,2 261 @n 43 260 @n 43 255 @n 118,46245 @n 196,9,21,4,9 274 @n 149 283 @n 122 270 @n 160 266 @n 239-1 262 @n 196 126 @n 144134 @n 87-2,112,12,2,6,14,3 133 @n 84"145 @n 102-2,40,26,16,10,30,4,45,2 141 @n 172-2 139 @n 210166 @n 87-2,49,33,67,7,8162 @n 92,46,43161 @n 42,8,6,5160 @n 42,8,6,5155 @n 81-2,34,46 146 @n 147 170 @n 150,9 183 @n 123 174 @n 149,7168 @n 81,63,16%26 @n 72,72,20-1%27 @n 53,12,15,12,18,26%30 @n 53,86,4,26-1&$@|d@(t\8x`H(pX@ $lL8 lT<$ hP8 lH(t\D,x\< `H0|dD( pL0tX< \x$/usr/local/lib/gtags/pygments-parser.laAsymptote/usr/local/lib/gtags/pygments-parser.laAutoIt/usr/local/lib/gtags/pygments-parser.laAwk/usr/local/lib/gtags/pygments-parser.laBUGS/usr/local/lib/gtags/pygments-parser.laBash/usr/local/lib/gtags/pygments-parser.laBat/usr/local/lib/gtags/pygments-parser.laBlitzMax/usr/local/lib/gtags/pygments-parser.laBoo/usr/local/lib/gtags/pygments-parser.laBro/usr/local/lib/gtags/pygments-parser.laC#/usr/local/lib/gtags/pygments-parser.laC++/usr/local/lib/gtags/pygments-parser.laCOBOLFree/usr/local/lib/gtags/pygments-parser.laCOBOL/usr/local/lib/gtags/pygments-parser.laCUDA/usr/local/lib/gtags/pygments-parser.laC/usr/local/lib/gtags/pygments-parser.laCeylon/usr/local/lib/gtags/pygments-parser.laCfm/usr/local/lib/gtags/pygments-parser.laClojure/usr/local/lib/gtags/pygments-parser.laCoffeeScript/usr/local/lib/gtags/pygments-parser.laCommon-Lisp/usr/local/lib/gtags/pygments-parser.laCoq/usr/local/lib/gtags/pygments-parser.laCroc/usr/local/lib/gtags/pygments-parser.laCsh/usr/local/lib/gtags/pygments-parser.laCython/usr/local/lib/gtags/pygments-parser.laDart/usr/local/lib/gtags/pygments-parser.laDg/usr/local/lib/gtags/pygments-parser.laDuel/usr/local/lib/gtags/pygments-parser.laDylan/usr/local/lib/gtags/pygments-parser.laECL/usr/local/lib/gtags/pygments-parser.laEC/usr/local/lib/gtags/pygments-parser.laERB/usr/local/lib/gtags/pygments-parser.laElixir/usr/local/lib/gtags/pygments-parser.laErlang/usr/local/lib/gtags/pygments-parser.laEvoque/usr/local/lib/gtags/pygments-parser.laFSharp/usr/local/lib/gtags/pygments-parser.laFactor/usr/local/lib/gtags/pygments-parser.laFancy/usr/local/lib/gtags/pygments-parser.laFantom/usr/local/lib/gtags/pygments-parser.laFelix/usr/local/lib/gtags/pygments-parser.laFortran/usr/local/lib/gtags/pygments-parser.laGAS/usr/local/lib/gtags/pygments-parser.laGLSL/usr/local/lib/gtags/pygments-parser.laGenshi/usr/local/lib/gtags/pygments-parser.laGherkin/usr/local/lib/gtags/pygments-parser.laGnuplot/usr/local/lib/gtags/pygments-parser.laGo/usr/local/lib/gtags/pygments-parser.laGoodData-CL/usr/local/lib/gtags/pygments-parser.laGosu/usr/local/lib/gtags/pygments-parser.laGroovy/usr/local/lib/gtags/pygments-parser.laGst/usr/local/lib/gtags/pygments-parser.laHaXe/usr/local/lib/gtags/pygments-parser.laHaml/usr/local/lib/gtags/pygments-parser.laHaskell/usr/local/lib/gtags/pygments-parser.laHxml/usr/local/lib/gtags/pygments-parser.laHybris/usr/local/lib/gtags/pygments-parser.laIDL/usr/local/lib/gtags/pygments-parser.laIo/usr/local/lib/gtags/pygments-parser.laIoke/usr/local/lib/gtags/pygments-parser.laJAGS/usr/local/lib/gtags/pygments-parser.laJade/usr/local/lib/gtags/pygments-parser.laJavaScript/usr/local/lib/gtags/pygments-parser.laJava/usr/local/lib/gtags/pygments-parser.laJsp/usr/local/lib/gtags/pygments-parser.laJulia/usr/local/lib/gtags/pygments-parser.laKoka/usr/local/lib/gtags/pygments-parser.laKotlin/usr/local/lib/gtags/pygments-parser.laLLVM/usr/local/lib/gtags/pygments-parser.laLasso/usr/local/lib/gtags/pygments-parser.laLiterate-Haskell/usr/local/lib/gtags/pygments-parser.laLiveScript/usr/local/lib/gtags/pygments-parser.laLogos/usr/local/lib/gtags/pygments-parser.laLogtalk/usr/local/lib/gtags/pygments-parser.laLua/usr/local/lib/gtags/pygments-parser.laMAQL/usr/local/lib/gtags/pygments-parser.laMOOCode/usr/local/lib/gtags/pygments-parser.laMXML/usr/local/lib/gtags/pygments-parser.laMako/usr/local/lib/gtags/pygments-parser.laMason/usr/local/lib/gtags/pygments-parser.laMatlab/usr/local/lib/gtags/pygments-parser.laMiniD/usr/local/lib/gtags/pygments-parser.laModelica/usr/local/lib/gtags/pygments-parser.laModula2/usr/local/lib/gtags/pygments-parser.laMonkey/usr/local/lib/gtags/pygments-parser.laMoonScript/usr/local/lib/gtags/pygments-parser.laMuPAD/usr/local/lib/gtags/pygments-parser.laMyghty/usr/local/lib/gtags/pygments-parser.laNASM/usr/local/lib/gtags/pygments-parser.la Common82 @n 32/py AUTOLOAD86 @n 68y@$86 @@$ 416,33py Common82 @n 32/py Common75 @n 35315 Common79 @n 33efi Common84 @n 28 77 Common85 @n 21sh  Common81 @n 342,3 Common80 @n 31,6- Common77 @n 37QUO Common78 @n 321,1 Common76 @n 32118 Common74 @n 41arr Common73 @n 21 MA Common71 @n 39F 7 Cominvest35 @n 35 Coles15 @n 72 Citywire34 @n 29Check13 @n 8 Central56 @n 250 Cdnfundlibrary33 @n 13 Canadian56 @n 209 CZK37 @n 81 CVE37 @n 69 CUP37 @n 80 CSE_URL36 @n 39,21 CSE36 @n 28 CREFstok15 @n 82 CREFmony15 @n 82 CREF_URL65 @n 49,833 CREF15 @n 81 CRC37 @n 78 COP37 @n 75 COMINVEST_URL35 @n 46,33 CO77 @n 98QUO CNY37 @n 74 CML13 @n 12 CLP37 @n 73 CL77 @n 111UO CL82 @n 42 CITYWIRE_NEXT_URL34 @n 53CITYWIRE_MAIN_URL34 @n 51,64,49 CITYWIRE_LOOK_UP34 @n 52,53 CHF37 @n 179 CAD37 @n 68 CA65 @n 33 Brasil78 @n 28 Bourso_URL31 @n 80,32 Bourso31 @n 69 Bitcoin56 @n 194,51 Base::79 @n 76-1 Base75 @n 37 Base76 @n 34 Base80 @n 33 Base77 @n 32 Base79 @n 35 Base78 @n 34 Base81 @n 36 Bank56 @n 250 Baht56 @n 237 B_to_billions77 @n 253QUO BZD37 @n 57 BYR37 @n 56 BWP37 @n 61 BTN37 @n 59 BTC:56 @n 194 BSE_URL49 @n 28,67 BSE_MAINURL49 @n 27-1,64 BSERO_URL32 @n 35,22 BSERO32 @n 25 BSD37 @n 52 BRL37 @n 62 BR77 @n 92QUO BOGOname15 @n 82 BOB37 @n 60 BO77 @n 110UO BO82 @n 43/l BND37 @n 64 BMO_URL30 @n 41,15 BMONesbittBurns30 @n 30 BMD37 @n 58 BM77 @n 101AD BK77 @n 137AD BIF37 @n 66 BI77 @n 128AD BHD37 @n 53 BGN37 @n 65 BE77 @n 100AD BDT37 @n 54 BC77 @n 127Q_ BBD37 @n 55 BATCH_SIZE70 @n 50,37 BAMOSZ_URL49 @n 25,134BAMOSZ_MAINURL49 @n 24-1,131 BA77 @n 88 B77 @n 82 Australian14 @n 10 Australian56 @n 207 Australia76 @n 28 Asia75 @n 31 AX77 @n 9086 AWG37 @n 50AUD14 @n 9 AUD37 @n 51 ASX_URL29 @n 47,31 ASX15 @n 72 ASX29 @n 36 ASSIGN:31 @n 232%ASSIGN:51 @n 120,40,31,31,30,14,20,39,22,35QASSIGN51 @n 128,4,4,4,4,4,4,12,30,4,4,4,4,4,12,32,12,24,4,4,4,4,4,4,11,26,4,4,4,4,4,11 ASEGR_URL28 @n 35,21 ASEGR28 @n 25 AS77 @n 122AD ARS37 @n 49 ARGV13 @n 41 ARGV14 @n 12,4,4 ARGV16 @n 15 ANG37 @n 141 AMFI_URL50 @n 22AMFI_NAV_LIST50 @n 27,31,12 AMFI_MAIN_URL50 @n 21,70 ALL37 @n 46 AIAHK_URL27 @n 38,18 AIAHK27 @n 29 AEX_URL26 @n 51,25 AEX26 @n 38 AED37 @n 188A16 @n 8 A77 @n 81,204 A55 @n 160@$26 @@$ 122,6-1,3,2-2,3 @$30 @@$ 85@$29 @@$ 106,16 @$39 @@$ 147@$36 @@$ 98,3-2,3,2-5 @$32 @@$ 80 @$46 @@$ 110<\lL0P4p<x@Tt<l(H X8p$\ XpT(t88t\@(xD,`pX@  $hP8 lT<$ xdL4P4`D( ltT8x\@$L  h 0  L 0  lP\4h L , d H , d d H , |lTd<$ LlTd8 4x`Dco ISA86 @n 5490 HTTP::47 @n 32 GoldMoney47 @n 29 GOLDMONEY_URL47 @n 101,4 GET47 @n 105 Finance::47 @n 29 ISA86 @n 5490 HTTP::86 @n 37 GET86 @n 251 Finance::86 @n 30,6,167,109,30390 JSON::82 @n 90 JSON82 @n 295 HTTP::82 @n 32,43 HTML::82 @n 33 GET82 @n 7285 Finance::82 @n 24 KS77 @n 11715 KQ77 @n 118 5 KL77 @n 119 5 JK77 @n 113 5 ISA77 @n 43 5 IN77 @n 125 5 I77 @n 11486  HTTP::77 @n 37n 5 HK77 @n 109 5 HA77 @n 105 5 H77 @n 104n 5 GET77 @n 1775 Finance::77 @n 32 Krone56 @n 215,10 Kong56 @n 221 KZT37 @n 1154 KYD37 @n 70@n KWD37 @n 118  KRW37 @n 117  KPW37 @n 1468 KMF37 @n 76in KHR37 @n 67 @ KES37 @n 116  JSON::83 @n 8529  JSON83 @n 26@ JPY37 @n 113e JOD37 @n 114y JMD37 @n 112n Investments15 @n 34@n IndiaMutual50 @n 5 @n In56 @n 243a  ITE13 @n 1259 ISK37 @n 1068 ISA72 @n 35-3 IRR37 @n 1093 IQD37 @n 1104 INR37 @n 1073 ILS37 @n 111o IDR37 @n 108n Hong56 @n 221 Headers72 @n 30,13,2- HUF37 @n 1051 HU49 @n 12le_ HTTP::85 @n 217 s HTTP::84 @n 28 @n HTTP::83 @n 70d 8 HTTP::81 @n 34nt  HTTP::80 @n 31re_ HTTP::79 @n 33@n  HTTP::78 @n 32T_M HTTP::76 @n 3272  HTTP::75 @n 35 58 HTTP::74 @n 4124  HTTP::73 @n 211-1 HTTP::72 @n 30,13 HTTP::71 @n 39nta HTTP::69 @n 39ct  HTTP::68 @n 39@n  HTTP::67 @n 38inaHTTP::66 @n 44-1,34bo HTTP::65 @n 4184  HTTP::64 @n 33,11 HTTP::63 @n 334 @ HTTP::62 @n 3884  HTTP::61 @n 10n 5 HTTP::60 @n 10,4  HTTP::59 @n 35ift HTTP::58 @n 38,42 HTTP::57 @n 383,4 HTTP::56 @n 20,5-HTTP::55 @n 40-1,32,2HTTP::53 @n 9 HTTP::52 @n 385 @ HTTP::51 @n 41equ HTTP::50 @n 13-10 HTTP::49 @n 188 r HTTP::48 @n 385 @ HTTP::46 @n 39resHTTP::45 @n 57-1,36n  HTTP::44 @n 37 85 HTTP::42 @n 17QUI HTTP::41 @n 18age HTTP::40 @n 37sto HTTP::39 @n 395 @ HTTP::37 @n 26ls  HTTP::36 @n 33,33 HTTP::35 @n 42 51HTTP::34 @n 44-1,34,6 HTTP::33 @n 21 54 HTTP::32 @n 30eEx HTTP::31 @n 74ess HTTP::30 @n 35 13 HTTP::29 @n 38oda HTTP::28 @n 304,4 HTTP::27 @n 34 @n HTTP::26 @n 43,39 HTML::85 @n 22,42 HTML::84 @n 29,42 HTML::83 @n 293-2HTML::74 @n 42-1,71,20@n  HTML::73 @n 22-1  HTML::70 @n 40,91 HTML::69 @n 40,61 HTML::68 @n 40,35HTML::66 @n 46,81,753 HTML::62 @n 39,1052,2 HTML::58 @n 40,38 HTML::53 @n 10,34HTML::52 @n 40,40,712 HTML::51 @n 42,33 HTML::50 @n 15,10HTML::49 @n 19,84,63, HTML::48 @n 40,48 HTML::46 @n 40,34 HTML::45 @n 59sca HTML::43 @n 21,40HTML::42 @n 18,49,233 HTML::41 @n 19,51 HTML::39 @n 40,90 HTML::38 @n 21,44 HTML::37 @n 28,1928,1 HTML::36 @n 3412,HTML::34 @n 46,77,58, HTML::33 @n 22,43 HTML::32 @n 31,35 HTML::31 @n 75,53 HTML::30 @n 36,29 HTML::29 @n 40,47 HTML::28 @n 31,34 HTML::27 @n 35,37 HTML::26 @n 44 ti HTG37 @n 102x HRK37 @n 7908 HNL37 @n 1036 HKD37 @n 104x HEX_URL48 @n 46,286,3 HEX48 @n 36 8 Grab15 @n 72sGox56 @n 177,12,13,46,17@GnuCash15 @n 6ug Getopt16 @n 6 GYD37 @n 101n GTQ37 @n 99@n GNF37 @n 100  GMD37 @n 95nc GIP37 @n 97h  GHC37 @n 96DU GET85 @n 5486 GET84 @n 61 s GET73 @n 95an GET71 @n 7109 GET69 @n 99@n GET68 @n 94al GET67 @n 67av GET65 @n 927,6ren GET64 @n 95-2 GET63 @n 95 4 GET62 @n 79,18 40 GET61 @n 33sp GET60 @n 33,8 GET59 @n 58 $ GET58 @n 68ed GET57 @n 692, GET56 @n 81,436 @ GET53 @n 3516 GET52 @n 69 @ GET51 @n 697, GET49 @n 96,64n 8 GET48 @n 76 @ GET44 @n 8546 GET42 @n 586, GET41 @n 61,72n 7 GET40 @n 73,1 GET39 @n 1256 GET37 @n 219f GET35 @n 79,2 GET33 @n 64on GET32 @n 616  GET31 @n 1191 GET30 @n 5956 GET29 @n 78 m GET28 @n 60 7 GET27 @n 57,6 GBP68 @n 69 F GBP37 @n 6316 Franc56 @n 211ent Fool44 @n 351 Finanzpartner43 @n 18 FinanceCanada42 @n 11 Finance::85 @n 13 Finance::84 @n 22 Finance::83 @n 21 Finance::81 @n 30,6,1 Finance::80 @n 27,6 l Finance::79 @n 29,6,41-1 Finance::78 @n 28,6me Finance::76 @n 28,6nt Finance::75 @n 31,67 Finance::74 @n 36 Finance::73 @n 15 Finance::72 @n 25 Finance::71 @n 34 Finance::70 @n 37 Finance::69 @n 34 Finance::68 @n 31 Finance::67 @n 30 Finance::66 @n 29 Finance::65 @n 30 Finance::64 @n 25 Finance::63 @n 25 Finance::62 @n 30 Finance::61 @n 8u Finance::60 @n 8m Finance::59 @n 27 Finance::58 @n 36 Finance::57 @n 33 Finance::56 @n 16,161,4-1,2-1 Finance::55 @n 29 Finance::54 @n 20 Finance::53 @n 16 Finance::52 @n 36 Finance::51 @n 36 Finance::50 @n 5@ Finance::49 @n 12 Finance::48 @n 36 Finance::46 @n 31 Finance::45 @n 43 Finance::44 @n 35 Finance::43 @n 18 Finance::42 @n 11 Finance::41 @n 12 Finance::40 @n 30 Finance::39 @n 34 Finance::38 @n 18 Finance::37 @n 16 Finance::36 @n 28 Finance::35 @n 35 Finance::34 @n 29 Finance::33 @n 13 Finance::32 @n 25 Finance::31 @n 69 Finance::30 @n 30 Finance::29 @n 36 Finance::28 @n 25 Finance::27 @n 29 Finance::26 @n 38 Finance16 @n 4,13 Finance15 @n 9,2n Finance14 @n 4,3,7@n Finance13 @n 4,13,19  FidelityFixed41 @n 12 Fidelity40 @n 30- Fidelity15 @n 34@ FUNDLIB_URL33 @n 28 7 FUNDLIB_MAIN_URL33 @n 30,60 7 FTfunds45 @n 4310 FTPortfolios46 @n 31, FTPORTFOLIOS_URL46 @n 46  FTPORTFOLIOS_ALL46 @n 47x FTFUNDS_MAIN_URL45 @n 64nFTFUNDS_LOOK_UD45 @n 66,79,148D|d,<$x`H0hP8 Xx`D,hP8 pT< tX<$0x`8x\Dt,\hL( Hx`H0t0dL4\./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars%29 @n 71,13,17,81-1%28 @n @$58 @@$ 95,21 @$53 @@$ 51-1 MODULES86 @n 109,6METHODS86 @n 77,60,80,346,12 LWP::86 @n 617 NS82 @n 41 LWP::82 @n 31 PK77 @n 86n 1 PA77 @n 99n 1 OL77 @n 123 1 OB77 @n 85n 1 O77 @n 84 NZ77 @n 121 NS77 @n 112 N77 @n 83 MX77 @n 120 1 MU77 @n 106 1 MI77 @n 116 1 MF77 @n 129 MC77 @n 130 MAX_REQUEST_SIZE77 @n 53,114  MA77 @n 131 1 LWP::77 @n 36 LM77 @n 124 1 L77 @n 139n 1 PLATINUM_URL58 @n 46,22sk PKR37 @n 150  PHP37 @n 156a PGK37 @n 153 PEN37 @n 155/ PAB37 @n 152R Obtain56 @n 177ISOUT66 @n 121-2,72-2IE OMR37 @n 148A Notes15 @n 24 Norweigan56 @n 225 New56 @n 227P Namecoin56 @n 198 NZX57 @n 33ds NZD37 @n 1433 NZ80 @n 27DEB NPR37 @n 1404 NOTES13 @n 14 NOK37 @n 1472 NMC:56 @n 198 NIO37 @n 1443 NGN37 @n 145O NAV50 @n 70,16/5NAME13 @n 6 NAME56 @n 175 NAD37 @n 139@ Myer15 @n 72  MtGox56 @n 16,161Mt56 @n 177,12,13,46,17LI Mozilla::65 @n 33 MorningstarJP54 @n 20 Morningstar53 @n 1dec ManInvestments52 @n 3626  MYR37 @n 129n MXN37 @n 134@ MWK37 @n 1286 MVR37 @n 130 MUR37 @n 133n MTL37 @n 131e MStaruk55 @n 29rt MSTARUK_NEXT_URL55 @n 47MSTARUK_MAIN_URL55 @n 45,64,37'.. MSTARUK_LOOK_UP55 @n 46,53'.. MRO37 @n 132n MORNINGSTAR_SE_FUNDS_URL53 @n 13,19 MORNINGSTAR_JP_URL54 @n 34,35 MOP37 @n 126u MNT37 @n 136 MMK37 @n 138  MKD37 @n 127 MDL37 @n 135n MAX_REQUEST_SIZE44 @n 51,28 MANINV_URL52 @n 46-1,22tp MAD37 @n 137g Litecoin56 @n 196 LeRevenu51 @n 36w LYD37 @n 124o LWP::26 @n 42,37 LWP::27 @n 33 LWP::30 @n 34 LWP::29 @n 39 LWP::28 @n 29 LWP::33 @n 20 LWP::37 @n 27,191 LWP::40 @n 36 LWP::39 @n 36,2,3 LWP::38 @n 23 LWP::36 @n 32,31e LWP::35 @n 41 LWP::34 @n 42-1@n LWP::32 @n 29 LWP::31 @n 73 LWP::41 @n 17 LWP::44 @n 38 LWP::46 @n 38 LWP::49 @n 17 LWP::51 @n 40LWP::53 @n 8= LWP::56 @n 22 LWP::58 @n 39 LWP::62 @n 37 LWP::64 @n 32 LWP::66 @n 42-15 LWP::68 @n 38 LWP::70 @n 39 LWP::72 @n 29,13  LWP::74 @n 40 LWP::76 @n 33 LWP::78 @n 33 LWP::80 @n 32 LWP::84 @n 27 LWP::85 @n 20 LWP::83 @n 28 LWP::81 @n 35 LWP::79 @n 34 LWP::75 @n 36 LWP::73 @n 20 LWP::71 @n 38 LWP::69 @n 38 LWP::67 @n 37 LWP::65 @n 32,8R} LWP::63 @n 32 LWP::59 @n 34 LWP::57 @n 37 LWP::55 @n 38-1_U LWP::52 @n 39 LWP::50 @n 12 LWP::48 @n 39 LWP::45 @n 56 LWP::42 @n 16 LVL37 @n 120 LTL37 @n 125 LTC:56 @n 196 LSL37 @n 122 LR_URL51 @n 46 LRD37 @n 123LOG74 @n 94,14,35,40,7,9,12 LKR37 @n 175 LBP37 @n 121 LAST13 @n 27 LAK37 @n 119LABELS70 @n 52,12-1 Kronor56 @n 233 |lL4dL,|`D( |`D( dH,hL( dH,0|hL0lP,tX< x\@$|`D( dH,hL |dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars%29 @n 71,13,17,81-1%28 @n @$58 @@$ 95,21 @$53 @@$ 51-1 Request::34 @n 44 REQUIRED86 @n 190, Quote::77 @n 3 REQUIRED86 @n 190, Quote::47 @n 290, REQUIRED86 @n 190,336,15Quote::86 @n 36,276,303 Quote86 @n 30,173 Quote::82 @n 24 Piece82 @n 34 Quote::77 @n 320, Request::34 @n 44 Request::33 @n 21 Request::42 @n 17 Request::60 @n 10 Request::62 @n 38 Request::61 @n 10 Request::59 @n 35 Request::58 @n 38 Request::57 @n 38 Request::56 @n 20 Request::55 @n 40 Request::53 @n 9 Request::52 @n 38 Request::51 @n 41 Request::50 @n 13 Request::49 @n 18 Request::48 @n 38 Request::46 @n 39 Request::45 @n 57 Request::44 @n 37 Request::75 @n 35 Request::79 @n 33 Request::84 @n 28 Request::85 @n 21 Request::81 @n 34 Request::80 @n 31 Request::78 @n 32 Request::76 @n 32 Request::74 @n 41 Request::73 @n 21 Request::68 @n 39 Request::71 @n 39 Request::69 @n 39 Request::67 @n 38 Request::66 @n 44 Request::65 @n 41 Request::64 @n 33 Request::63 @n 33 Request26 @n 82 Request36 @n 66 Renminbi56 @n 213 RWF37 @n 162 RUB37 @n 161 RON37 @n 160 REPORT13 @n 25 RC_NOT_MODIFIED50 @n 61 Quote::26 @n 3828 Quote::27 @n 29 Quote::30 @n 30 Quote::29 @n 36 Quote::28 @n 25 Quote::36 @n 28 Quote::35 @n 35 Quote::34 @n 29 Quote::33 @n 13 Quote::32 @n 25 Quote::31 @n 69 Quote::49 @n 12 Quote::48 @n 36 Quote::46 @n 31 Quote::45 @n 43 Quote::44 @n 35 Quote::43 @n 18 Quote::42 @n 11 Quote::41 @n 12 Quote::40 @n 30 Quote::39 @n 34 Quote::38 @n 18 Quote::37 @n 16 Quote::55 @n 29 Quote::63 @n 25 Quote::71 @n 34Quote::79 @n 29,6,41-1 Quote::81 @n 30,6 Quote::80 @n 27,6 Quote::78 @n 28,6 Quote::76 @n 28,6 Quote::75 @n 31,6 Quote::74 @n 36 Quote::73 @n 15 Quote::72 @n 25 Quote::70 @n 37 Quote::69 @n 34 Quote::68 @n 31 Quote::67 @n 30 Quote::66 @n 29 Quote::65 @n 30 Quote::64 @n 25 Quote::62 @n 30Quote::61 @n 8Quote::60 @n 8 Quote::59 @n 27 Quote::58 @n 36 Quote::57 @n 33 Quote::56 @n 16,161 Quote::54 @n 20Quote::53 @n 1 Quote::52 @n 36 Quote::51 @n 36Quote::50 @n 5 Quote::83 @n 21 Quote::85 @n 13 Quote::84 @n 22Quote13 @n 4,13,19w[0 Quote14 @n 4,3,7SQuote56 @n 181-1,2-1o Quote16 @n 4,13 Quote15 @n 3,6,2 QueryParam70 @n 42 38 QAR37 @n 159{ Protocol::38 @n 2356 Protocol::39 @n 36@$r Protocol::83 @n 28 @n Protocol::65 @n 32 Price15 @n 58 Pound56 @n 21956 Platinum58 @n 36 Piece83 @n 30 Parser37 @n 28,192 m  Parser73 @n 23DIN PYG37 @n 1541 POST46 @n 84R POSIX26 @n 89 POSIX36 @n 74 PLN37 @n 158n $tX<l |`DT<,$xP, |dL4hP( lP0hT4|x\@( hdP$lL, tX8lH$L4`<ash.ebuild.eclass,Bat:.bat.cmd,BlitzMax:.bmx,Boo:.boo,Bro:.bro,C#:.cs,C++:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.C.H,COBOLFree:.cbl.CBL,COBOL:.cob.COB.cpy.CPY,CUDA:.cu.cuh,C:.c.h,Ceylon:.ceylon,Cfm:.cfm.cfml.cfc,Clojure:.clj,CoffeeScript:.coffee,Common-Lisp:.cl.lisp.el,Coq:.v,Croc:.croc,Csh:.tcsh.csh,Cython:.pyx.pxd.pxi,Dart:.dart,Dg:.dg,Duel:.duel.jbst,Dylan:.dylan.dyl.intr,ECL:.ecl,EC:.ec.eh,ERB:.erb,Elixir:.ex.exs,Erlang:.erl.hrl.es.escript,Evoque:.evoque,FSharp:.fs.fsi,Factor:.factor,Fancy:.fy.fancypack,Fantom:.fan,Felix:.flx.flxh,Fortran:.f.f90.F.F90,GAS:.s.S,GLSL:.vert.frag.geo,Genshi:.kid,Gherkin:.feature,Gnuplot:.plot.plt,Go:.go,GoodData-CL:.gdc,Gosu:.gs.gsx.gsp.vark,Groovy:.groovy,Gst:.gst,HaXe:.hx,Haml:.haml,Haskell:.hs,Hxml:.hxml,Hybris:.hy.hyb,IDL:.pro,Io:.io,Ioke:.ik,JAGS:.jag.bug,Jade:.jade,JavaScript:.js,Java:.java,Jsp:.jsp,Julia:.jl,Koka:.kk.kki,Kotlin:.kt,LLVM:.ll,Lasso:.lasso,Literate-Haskell:.lhs,LiveScript:.ls,Logos:.x.xi.xm.xmi,Logtalk:.lgt,Lua:.lua.wlua,MOOCode:.moo,MXML:.mxml,Mako:.mao,Mason:.m.mhtml.mc.mi,Matlab:.m,Modelica:.mo,Modula2:.mod,Monkey:.monkey,MoonScript:.moon,MuPAD:.mu,Myghty:.myt,NASM:.asm.ASM,NSIS:.nsi.nsh,Nemerle:.n,NewLisp:.lsp.nl,Newspeak:.ns2,Nimrod:.nim.nimrod,OCaml:.ml.mli.mll.mly,Objective-C++:.mm.hh,Objective-C:.m.h,Objective-J:.j,Octave:.m,Ooc:.ooc,Opa:.opa,OpenEdge:.p.cls,PHP:.php.php3.phtml,Pascal:.pas,Perl:.pl.pm,PostScript:.ps.eps,PowerShell:.ps1,Prolog:.prolog.pro.pl,Python:.py.pyw.sc.tac.sage,QML:.qml,REBOL:.r.r3,RHTML:.rhtml,Racket:.rkt.rktl,Ragel:.rl,Redcode:.cw,RobotFramework:.robot,Ruby:.rb.rbw.rake.gemspec.rbx.duby,Rust:.rs.rc,S:.S.R,Scala:.scala,Scaml:.scaml,Scheme:.scm.ss,Scilab:.sci.sce.tst,Smalltalk:.st,Smarty:.tpl,Sml:.sml.sig.fun,Snobol:.snobol,SourcePawn:.sp,Spitfire:.spt,Ssp:.ssp,Stan:.stan,SystemVerilog:.sv.svh,Tcl:.tcl,TeX:.tex.aux.toc,Tea:.tea,Treetop:.treetop.tt,TypeScript:.ts,UrbiScript:.u,VB.net:.vb.bas,VGL:.rpf,Vala:.vala.vapi,Velocity:.vm.fhtml,Verilog:.v,Vhdl:.vhdl.vhd,Vim:.vim,XBase:.PRG.prg,XQuery:.xqy.xquery.xq.xql.xqm,XSLT:.xsl.xslt.xpl,Xtend:.xtendlib/gtags/pygments-parser.laANTLR/usr/local/lib/gtags/pygments-parser.laActionScript3/usr/local/lib/gtags/pygments-parser.laAda/usr/local/lib/gtags/pygments-parser.laAppleScript/usr/local/lib/gtags/pygments-parser.laAspectJ/usr/local/lib/gtags/pygments-parser.laAspx-cs/usr/local/lib/gtags/pygments-parser.laAsymptote/usr/local/lib/gtags/pygments-parser.laAutoIt/usr/local/lib/gtags/pygments-parser.laAwk/usr/local/lib/gtags/pygments-parser.laBUGS/usr/local/lib/gtags/pygments-parser.laBash/usr/local/lib/gtags/pygments-parser.laBat/usr/local/lib/gtags/pygments-parser.laBlitzMax/usr/local/lib/gtags/pygments-parser.laBoo/usr/local/lib/gtags/pygments-parser.laBro/usr/local/lib/gtags/pygments-parser.laC#/usr/local/lib/gtags/pygments-parser.laC++/usr/local/lib/gtags/pygments-parser.laCOBOLFree/usr/local/lib/gtags/pygments-parser.laCOBOL/usr/local/lib/gtags/pygments-parser.laCUDA/usr/local/lib/gtags/pygments-parser.laC/usr/local/lib/gtags/pygments-parser.laCeylon/usr/local/lib/gtags/pygments-parser.laCfm/usr/local/lib/gtags/pygments-parser.laClojure/usr/local/lib/gtags/pygments-parser.laCoffeeScript/usr/local/lib/gtags/pygments-parser.laCommon-Lisp/usr/local/lib/gtags/pygments-parser.laCoq/usr/local/lib/gtags/pygments-parser.laCroc/usr/local/lib/gtags/pygments-parser.laCsh/usr/local/lib/gtags/pygments-parser.laCython/usr/local/lib/gtags/pygments-parser.laDart/usr/local/lib/gtags/pygments-parser.laDg/usr/local/lib/gtags/pygments-parser.laDuel/usr/local/lib/gtags/pygments-parser.laDylan/usr/local/lib/gtags/pygments-parser.laECL/usr/local/lib/gtags/pygments-parser.laEC/usr/local/lib/gtags/py Request::47 @n 32TIMEOUT86 @n 188,302,6,124Sta Request::86 @n 37 Status::82 @n 75e Request::82 @n 32 TWO77 @n 136l TW77 @n 1356  TO77 @n 9386  TH77 @n 1386  TA77 @n 1156  SZ77 @n 9786  ST77 @n 1336  SS77 @n 9686  SN77 @n 9586  SI77 @n 1266  SG77 @n 1076  SA77 @n 9186  S77 @n 13486 Request::77 @n 37 TableExtract69 @n 40,61 @ TableExtract68 @n 40,35Ag TableExtract62 @n 39,105P TableExtract58 @n 40,38 TableExtract53 @n 10,34n; TableExtract52 @n 40,40,7 TableExtract51 @n 42,33t TZS37 @n 182 TWD37 @n 181 TTD37 @n 185 TSX_URL70 @n 47,43 TSX70 @n 37 TSP_URL69 @n 46,53 TSP_MAIN_URL69 @n 47,89 TSP_FUND_NAMES69 @n 64,74TSP_FUND_COLUMNS69 @n 52,50,12 TSPSFUND69 @n 61,12 TSPLINCOMEFUND69 @n 57 TSPLINCOME69 @n 69 TSPL2050FUND69 @n 53 TSPL205069 @n 65 TSPL2040FUND69 @n 54 TSPL204069 @n 66 TSPL2030FUND69 @n 55 TSPL203069 @n 67 TSPL2020FUND69 @n 56 TSPL202069 @n 68 TSPIFUND69 @n 62,12 TSPGFUND69 @n 58,12 TSPFFUND69 @n 59,12 TSPCFUND69 @n 60,12 TSP69 @n 34 TRY37 @n 142 TRUSTNET_URL68 @n 46 TRUSTNET_ALL68 @n 48 TROWEPRICE_URL67 @n 45,20 TREASURY_URL73 @n 27,64TREASURY_MAINURL73 @n 26-1,111 TOP37 @n 184 TNetuk66 @n 29 TNETUK_NEXT_URL66 @n 53TNETUK_MAIN_URL66 @n 51,64,66 TNETUK_LOOK_UP66 @n 52,53 TND37 @n 186 TMPDIR50 @n 26 TLS13 @n 12 TICKER13 @n 27 TIAAreal15 @n 82 TIAA_URL65 @n 883 TIAA15 @n 81 THB37 @n 183 TEMP50 @n 26 TD_URL63 @n 42,51 TD_URL64 @n 42,51 TABLE_LOOP:49 @n 111 TABLE_LOOP49 @n 117 T15 @n 58 Swiss56 @n 211 Swedish56 @n 233 StockHouseCanada62 @n 30 Sterling56 @n 219Std16 @n 6 Status::83 @n 70 Status50 @n 14 Singapore56 @n 235 Simple34 @n 42 Simple55 @n 38 Simple39 @n 41 Simple66 @n 42 SZL37 @n 177 SYP37 @n 180 SYNOPSIS56 @n 179 SWITCH:51 @n 110SWITCH51 @n 169,62,44,61,56 SVC37 @n 88SUPER::72 @n 58,8,35 STOCKHOUSE_URL62 @n 44,51 STOCKHOUSE_MAIN_URL62 @n 45,55 STOCKHOUSE_LOOKUP_URL62 @n 43,35 STOCK13 @n 25STDOUT16 @n 9 STD37 @n 164 SPRXX81 @n 79 SPAXX81 @n 80 SOS37 @n 173 SLL37 @n 167 SKK37 @n 170 SIXshares61 @n 8 SIXfunds60 @n 8 SIT37 @n 171 SHP37 @n 176 SHARENET_URL84 @n 34,24SHARENET_MAINURL84 @n 33-1,72 SGD37 @n 169 SEK37 @n 178 SEB_FUNDS_URL59 @n 39,17n SEB59 @n 27ue SDG37 @n 198  SCR37 @n 166e SBD37 @n 172  SAR37 @n 165e Russian56 @n 231 Ruble56 @n 231omm Rowe15 @n 58 Request::26 @n 43 Request::28 @n 30 Request::27 @n 34 Request::32 @n 30 Request::31 @n 74 Request::30 @n 35 Request::29 @n 38 Request::41 @n 18 Request::40 @n 37 Request::39 @n 39 Request::37 @n 26 Request::36 @n 33 Request::35 @n 42   pX4dD,xTxT88hP8 X<(p\D($|hT8|d@(t\H,t`L$\8p`4 T<$ h@D( |dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars%29 @n 71,13,17,81-1%28 @n @$58 @@$ 95,21 @$ _smart_ _want_silver47 @n 70,16,12,48_want_platinum47 @n 71,18,9,63@n _want_gold47 @n 69,14,15,30ve_goldmoney_time47 @n 134,2,13-1,17-1  _goldmoney_error47 @n 119 _47 @n 55 _smart_compare86 @n 325,6 _require_test86 @n 577Yah _load_modules86 @n 186_TA_dummy86 @n 72,161,64,79,182n _convert86 @n 586O_86 @n 88,14,32,31,3,64,3,61,4-1,49,25,3,3,88,2,18-1,35,15,16,5,74,23,106,32,16ah YAHOO_CURRENCY_URL86 @n 52oJS _82 @n 63 YahooJSON82 @n 24 YIND_URL_TAIL82 @n 39,328 YIND_URL_HEAD82 @n 38,33 _77 @n 185re Z77 @n 285omp Yahoo::77 @n 32eaa40 @n 62,22-15,4-1)aa46 @n 66,33,5-1,8-1,3,12-2,2,4-5,5,2,3-1aa64 @n 91,23-2,4-4,2-1,4-1aa63 @n 91,23-3,4-4,2-1,4-1*aa68 @n 67,62-1,3,2,3-4,3-1,2-4,8,2,4-1,4-1aa67 @n 62,14-1,2-5,2-1,4-1a46 @n 110,2,5 a56 @n 248-1 a55 @n 115 a73 @n 64-1a66 @n 169,67,7 _text_handler37 @n 222 _start_handler37 @n 220 _live_currencies37 @n 230 _end_handler37 @n 221 _dwsfunds_error39 @n 136,22 _add_custom_headers72 @n 57,8 _26 @n 69 _28 @n 52 _27 @n 52 _31 @n 101,7 _30 @n 49,111 _29 @n 68 _35 @n 68,7 _40 @n 60,8,8 _39 @n 86_38 @n 34,4,5,4,6_37 @n 248,26,27 _36 @n 53 _34 @n 72,12 _33 @n 47,15 _32 @n 52_43 @n 33,4,5,2,6 _51 @n 61 _55 @n 66,12 _59 @n 51,22 _63 @n 99 _67 @n 71 _70 @n 78,48_69 @n 87,34,11,2-8,2-1 _68 @n 64,12 _66 @n 72,12_65 @n 873,74,30-2 _64 @n 99 _62 @n 63,12 _61 @n 24 _60 @n 24 _58 @n 62_57 @n 55,23,2_56 @n 41,2,16,3 _54 @n 42 _53 @n 25 _52 @n 63 _50 @n 43_49 @n 60,25,28,36 _48 @n 69,35_46 @n 63,12,67 _45 @n 87,12 _44 @n 79,16_42 @n 40,75,27 _41 @n 48,136 _71 @n 59 _73 @n 43 _75 @n 60 _79 @n 71 _81 @n 86,24 _83 @n 58 _85 @n 41 _84 @n 48 _80 @n 54 _78 @n 57 _76 @n 57_74 @n 62,4,8,7,6_72 @n 42,14,8,12,8-1,11,5 Zloty56 @n 229 Zealand56 @n 227 ZWD37 @n 197 ZMK37 @n 196 ZA_UnitTrusts85 @n 13 ZAR37 @n 174 ZA84 @n 22 Z055 @n 115 Z066 @n 169 Z55 @n 160 Z66 @n 236,7 Yuan56 @n 213 Yen56 @n 223 YahooYQL83 @n 21 Yahoo::75 @n 31,6 Yahoo::76 @n 28,6 Yahoo::81 @n 30,6 Yahoo::80 @n 27,6Yahoo::79 @n 29,6,41-1te: Yahoo::78 @n 28,6 YIND_URL_TAIL83 @n 40,27n YIND_URL_HEAD83 @n 37,30: YH_FIELD_ENCODING79 @n 56,210 YH_EUROPE_FIELDS79 @n 53,23e: YER37 @n 195a YAHOO_URL81 @n 44,70: YAHOO_NZ_URL80 @n 41,20 YAHOO_EUROPE_URL79 @n 43,37n  YAHOO_CURRENCY_CONV_URL37 @n 32,187Qu YAHOO_BRASIL_URL78 @n 42,19 YAHOO_AUSTRALIA_URL76 @n 42,22@n; YAHOO_ASIA_URL75 @n 45,19 XPT37 @n 157a XPF37 @n 149e XPD37 @n 151n XOF37 @n 71 XCP37 @n 77nd XCD37 @n 85 XAU37 @n 98e: \x`\H,hH|d, dL, Lt(\D$Td@x\8 lP8 lH0tT8 hP8<hLt4|\@(x<  |TD( |dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars%29 @n 71,13,17,81-1%28 @n @$Icode34 @n 84,3-2,6 chop77 @n 175 class86 @n 99-1,55class86 @n 99-1,55,3 agent47 @n 62class86 @n 99-1,55,3chunks86 @n 472,2-2,2carp86 @n 86,5,23,450 can86 @n 125a bless86 @n 158sna baseclass86 @n 100cla available86 @n 539-1,4sna aug86 @n 709a apr86 @n 708aamount86 @n 239,7,31a all86 @n 58 after86 @n 817,2 classname82 @n 106 cells82 @n 64 ce82 @n 64 body82 @n 77,13 chop77 @n 175 base_url77 @n 152,13,999-Icode34 @n 84,3-2,6-1,4-1,4,4-1,4-1,30,4,4-1,14-1,86,5,7,2,5,6-1,7-1,21-4,7,2Icode55 @n 78,3-2,6-1,4-1,4,4-1,4-1,17,4,4-1,15-1,22,5,6,2,5,5-1,6-1,21-4,7,2 code74 @n 201code83 @n 69-1,12cntt65 @n 879,25,8,20cntc65 @n 879,24,5,18 close26 @n 93 close50 @n 86 close36 @n 78 close74 @n 211 close66 @n 123,74 clone70 @n 90 clone72 @n 78 class70 @n 131 class49 @n 103,63cj34 @n 79-1,39,57 cj55 @n 73-1cj45 @n 94-1,39,23 cj66 @n 79-1 citywire_fund34 @n 57-1 citywire34 @n 57,6 chomp50 @n 75 chomp59 @n 68check65 @n 877,37,43-1,12,15-1cells31 @n 189-2,21,2,3,4-1cells39 @n 92,55,4,6,7,7,7*cells32 @n 53,27,3-1,4,7-1,2-1,2-1,2-1,2-1,2-1 cells83 @n 59 cell43 @n 65,3-1cell49 @n 174-1,3-1,3 cell74 @n 158ce439 @n 92,86-2 ce2239 @n 92ce239 @n 92,79-2ce139 @n 92,72-2ce32 @n 53,35-3ce39 @n 92,59-2 ce83 @n 59 canadamutual33 @n 32,6 canadamutual62 @n 50,5 canada42 @n 25,7 canada81 @n 46,11 canada70 @n 58,7 calcDay54 @n 55-7 cachedir50 @n 26-1 c73 @n 64-1 by56 @n 246 bsero32 @n 38-2,5 bse_info49 @n 64-2bse49 @n 33-2,16,13 brasil78 @n 44,6bourso_to_number31 @n 240,19,23,4,4,4,4 bourso31 @n 83-2,9 body83 @n 72,13 bmonesbittburns30 @n 43-1 between56 @n 249 bet49 @n 35,17 batch70 @n 87,4,5 base_yahoo_labels75 @n 50 base_yahoo_labels76 @n 48 base_yahoo_labels80 @n 46 base_yahoo_labels79 @n 61 base_yahoo_labels78 @n 48 base_yahoo_labels81 @n 55 base_fool_labels44 @n 65Y base37 @n 20 base54 @n 25,52 bamosz_info49 @n 70-2bamosz49 @n 31-1,17,21back56 @n 200,41,32 b46 @n 110< b73 @n 64-1 automap29 @n 88 australia29 @n 49,6 australia76 @n 44,6 attribs49 @n 103,63 attribs70 @n 131attr31 @n 185,29,3attr37 @n 248,4,13 asx29 @n 49,7 asia75 @n 47,5 asegr28 @n 38-2,5as_trimmed_text74 @n 132,8,26,8as_text31 @n 153,37-1,30-1 as_HTML74 @n 135args72 @n 56,2,6,2,30are56 @n 189,54,6 amfiindia50 @n 29-1,5 amalgamated56 @n 249 always56 @n 271 allquotes50 @n 51,27,2,3,12 alllabels49 @n 47,6-1 all_stocks29 @n 68-1,8,3,17 all56 @n 248 aiahk27 @n 41,5 agent26 @n 79 agent36 @n 63 agent43 @n 55 aex26 @n 53-1,6 adig35 @n 51,8 addition56 @n 243 across56 @n 248 h lL0hL,dD hH,hL0dH,`|`@xxX8x`P@$tP(X< <xP0|8 |TD( |dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars%2 currency47 @n 66,34,3,37,14,18enc content47 @n 108ccurrency_fields86 @n 128,6,6 currency86 @n 269,148,3,3,4-2,5,182 curr_fields_func86 @n 125,32 convert_fields86 @n 410,392 conversion86 @n 404,23-1,6,18 content86 @n 251code86 @n 320,5,4,2,5 content82 @n 772code82 @n 74-1,12 currency_tags77 @n 78,218 content77 @n 1836 d85 @n 117d84 @n 115,34,5,5,5,4 d83 @n 118 d73 @n 64-1 d66 @n 169 d62 @n 185,11 cutoff56 @n 120,3 currently56 @n 190DWScurrentSymbol26 @n 120,2-1,2ecurrency_text37 @n 241,25,25-1,15currency_code37 @n 242,23,27 currency14 @n 16e currency34 @n 180,37,4,64-1,15,2,11ag currency31 @n 236,6,13,7@ currency46 @n 66 currency45 @n 234,5,3,9,2,11 currency55 @n 158,6,37,15,2,11kag currency68 @n 67,77Qu currency66 @n 201,25,13-2,66-1,15,2,11:Qu currency64 @n 76,2-1,2-1,3 currency63 @n 76,2-1,2-1,3ack currency62 @n 132,21,17,6 currency56 @n 203,42,3 currencies37 @n 46,1629 u currencies63 @n 44,37-1 currencies56 @n 2454 currencies64 @n 44,37-1in curr_iso46 @n 68 curr_iso68 @n 69,76n  cse36 @n 41,5counter53 @n 47,16,7 count39 @n 130@n  count43 @n 61 count42 @n 67 count74 @n 134@n; count52 @n 84,320 coords52 @n 84ROY cookie_jar34 @n 80 cookie_jar55 @n 74ons cookie_jar45 @n 95G4 cookie_jar66 @n 80 convert_price38 @n 78 convert_price43 @n 75 content_type54 @n 83,26 content_type56 @n 88,38 content_list31 @n 139 content26 @n 92,4 content27 @n 73 content29 @n 92 content28 @n 68 content34 @n 123,58 content33 @n 71,12 content32 @n 68 content31 @n 128 content30 @n 68 content44 @n 89 content43 @n 62 content42 @n 68,24content41 @n 71,70,25 content40 @n 75 content39 @n 128 content38 @n 66 content37 @n 219 content36 @n 77,4 content35 @n 82content45 @n 141,26,16,19,33,38,22 content54 @n 93 content64 @n 97 content73 @n 99focontent74 @n 118,2,3,4 content71 @n 75,7content70 @n 104,22,6 content69 @n 104 content68 @n 99,59 content67 @n 69content66 @n 122,5,69,6 content65 @n 929,6 content63 @n 97content62 @n 86,51,8,34content61 @n 38,8,6,6content60 @n 38,8,6,6 content59 @n 67 content58 @n 81 content57 @n 73 content53 @n 45 content52 @n 81,8 content51 @n 77 content49 @n 104,63L content48 @n 90$ content46 @n 90,55 content83 @n 72 content85 @n 6694 content84 @n 72OA constant34 @n 37 constant45 @n 51 constant66 @n 37 common56 @n 249 cominvest35 @n 50-1,7 code_type34 @n 86-3,4 code_type45 @n 101-3,4 code_type66 @n 86-3,4 code_type55 @n 80-3,4 code13 @n 41Pcode45 @n 99,3-2,6-1,4-1,6,4-1,9,8-1,4-1,9,3,13,4,11-1,21,8,24-1,15-5,19,6,14,2,5,3 code50 @n 61Tcode66 @n 84,3-2,6-1,4-1,4,4-1,4-1,5,33,4,4-1,7,4,12-1,8,68,14,5,8,2,5,6-1,7-1,21-4,7,2 code62 @n 92,3 8pT8x\@lP0t\@|`@X<L`h@$dD lL00lP8P|dL4hLxX<awk,BUGS:.bug,Bash:.sh.ksh.bash.ebuild.eclass,Bat:.bat.cmd,BlitzMax:.bmx,Boo:.boo,Bro:.bro,C#:.cs,C++:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.C.H,COBOLFree:.cbl.CBL,COBOL:.cob.COB.cpy.CPY,CUDA:.cu.cuh,C:.c.h,Ceylon:.ceylon,Cfm:.cfm.cfml.cfc,Clojure:.clj,CoffeeScript:.coffee,Common-Lisp:.cl.lisp.el,Coq:.v,Croc:.croc,Csh:.tcsh.csh,Cython:.pyx.pxd.pxi,Dart:.dart,Dg:.dg,Duel:.duel.jbst,Dylan:.dylan.dyl.intr,ECL:.ecl,EC:.ec.eh,ERB:.erb,Elixir:.ex.exs,Erlang:.erl.hrl.es.escript,Evoque:.evoque,FSharp:.fs.fsi,Factor:.factor,Fancy:.fy.fancypack,Fantom:.fan,Felix:.flx.flxh,Fortran:.f.f90.F.F90,GAS:.s.S,GLSL:.vert.frag.geo,Genshi:.kid,Gherkin:.feature,Gnuplot:.plot.plt,Go:.go,GoodData-CL:.gdc,Gosu:.gs.gsx.gsp.vark,Groovy:.groovy,Gst:.gst,HaXe:.hx,Haml:.haml,Haskell:.hs,Hxml:.hxml,Hybris:.hy.hyb,IDL:.pro,Io:.io,Ioke:.ik,JAGS:.jag.bug,Jade:.jade,JavaScript:.js,Java:.java,Jsp:.jsp,Julia:.jl,Koka:.kk.kki,Kotlin:.kt,LLVM:.ll,Lasso:.lasso,Literate-Haskell:.lhs,LiveScript:.ls,Logos:.x.xi.xm.xmi,Logtalk:.lgt,Lua:.lua.wlua,MOOCode:.moo,MXML:.mxml,Mako:.mao,Mason:.m.mhtml.mc.mi,Matlab:.m,Modelica:.mo,Modula2:.mod,Monkey:.monkey,MoonScript:.moon,MuPAD:.mu,Myghty:.myt,NASM:.asm.ASM,NSIS:.nsi.nsh,Nemerle:.n,NewLisp:.lsp.nl,Newspeak:.ns2,Nimrod:.nim.nimrod,OCaml:.ml.mli.mll.mly,Objective-C++:.mm.hh,Objective-C:.m.h,Objective-J:.j,Octave:.m,Ooc:.ooc,Opa:.opa,OpenEdge:.p.cls,PHP:.php.php3.phtml,Pascal:.pas,Perl:.pl.pm,PostScript:.ps.eps,PowerShell:.ps1,Prolog:.prolog.pro.pl,Python:.py.pyw.sc.tac.sage,QML:.qml,REBOL:.r.r3,RHTML:.rhtml,Racket:.rkt.rktl,Ragel:.rl,Redcode:.cw,RobotFramework:.robot,Ruby:.rb.rbw.rake.gemspec.rbx.duby,Rust:.rs.rc,S:.S.R,Scala:.scala,Scaml:.scaml,Scheme:.scm.ss,Scilab:.sci.sce.tst,Smalltalk:.st,Smarty:.tpl,Sml:.sml.sig.fun,Snobol:.snobol,SourcePawn:.sp,Spitfire:.spt,Ssp:.ssp,Stan:.stan,SystemVerilog:.sv.svh,Tcl:.tcl,TeX:.tex.aux.toc,Tea:.tea,Treetop:.treetop.tt,TypeScript:.ts,UrbiScript:.u,VB.net:.vb.bas,VGL:.rpf,Vala:.vala.vapi,Velocity:.vm.fhtml,Verilog:.v,Vhdl:.vhdl.vhd,Vim:.vim,XBase:.PRG.prg,XQuery:.xqy.xquery.xq.xql.xqm,XSLT:.xsl.xslt.xpl,Xtend:.xtendLWP::UserAgent 82 @n 31 use @n; HTML::TableExtract 82 @n 33 use @n; $YIND_URL_TAIL) 82 @n 30 use vars qw($VERSION $YIND_URL_HEAD @n; Time::Piece 82 @n 34 use @n; Finance::Quote::YahooJSON 82 @n 24 package @n; ) 82 @n 29 use JSON qw( decode_json @n; strict 82 @n 28 use @n; $YIND_URL_TAIL 82 @n 39 my @n = '/quote?format=json'; yahoo_json 82 @n 55 sub @n { $YIND_URL_HEAD 82 @n 38 my @n = 'http://finance.yahoo.com/webservice/v1/symbols/'; HTTP::Request::Common 82 @n 32 use @n; labels 82 @n 49 sub @n { methods 82 @n 41 sub @n {  die47 @n 124 env_proxy86 @n 621 dummy_obj86 @n 201,2s delete86 @n 379ed)defined86 @n 109,79,190,72,57,113,106,8,7,7,5,2 default_currency_fields86 @n 126d decimal_shiftup86 @n 799 dec86 @n 709day86 @n 707,12,8,3,5,7,13,4-1des data86 @n 251-1 d86 @n 765 desc82 @n 75  defined82 @n 135 decode_json82 @n 90 eurodate84 @n 143 eurodate71 @n 974 env_proxy72 @n 101 endtime65 @n 892-4 @nenddate65 @n 892,4,2 end_h37 @n 221te:encoded68 @n 68,20-1n encode_utf837 @n 228 encode59 @n 72te: each56 @n 202 each69 @n 114 e73 @n 64-134 dwsfunds39 @n 48,4ase dws_fund_classifications39 @n 100,88e dutch26 @n 53,6Qu dummy26 @n 102-3_ dtext37 @n 301,6edt30 @n 136-1,5ho done34 @n 183-1cedone66 @n 129,76,9,3,5oo_ directly56 @n 202 digital56 @n 244s die26 @n 91,5 die50 @n 70 s die36 @n 76,5 die69 @n 109  die56 @n 60-1 determined56 @n 245 desirable56 @n 244ina desc83 @n 70n depth27 @n 72 depth39 @n 1307 @ depth30 @n 65 depth52 @n 84,3@n depth43 @n 61 depth42 @n 67 depth74 @n 134ina delete_content74 @n 1318 delete31 @n 311re delete74 @n 193b  deka38 @n 28-1R t defined14 @n 12 defined26 @n 122,33 defined35 @n 89-1defined34 @n 141,10,100,12,15,8 defined31 @n 207defined46 @n 103,9,12-1mydefined45 @n 172,16,20,8,26,38,20defined42 @n 83,26-1,35,2 defined40 @n 82,8-6an defined38 @n 74or defined36 @n 1255defined66 @n 149,10,113,13,15,8Rdefined73 @n 56,7,37,58 defined72 @n 85 s defined71 @n 86 @ defined70 @n 135odefined68 @n 82,20,5 defined64 @n 81,21n 4 defined63 @n 81,21apedefined62 @n 160,10,1970  defined58 @n 96imdefined77 @n 201,42,8,8,12,11,13,268defined55 @n 122,10,37,11,14,7::P defined53 @n 51 default_headers72 @n 77,218 default_currency_fields77 @n 265 decoded_content56 @n 92,40 decoded_content74 @n 112 decode_utf849 @n 104,63 decode_json56 @n 92,40 decode_json83 @n 85 decode29 @n 92 decode65 @n 940 days54 @n 59 day_low42 @n 48 day_high42 @n 48 day26 @n 144 day30 @n 142-1day54 @n 47,11,4,14,23,2 day31 @n 272,4 day74 @n 149datum74 @n 140,5,7dateset53 @n 48,15,3 dateTime26 @n 139,3date34 @n 180,21,61-1,11date39 @n 93,79,46 date46 @n 66date45 @n 294,4,2,11 date59 @n 71,5date55 @n 158,5,17,11date54 @n 46,50,3 date53 @n 64-1 date49 @n 182-1date84 @n 128,12,3 date83 @n 129date66 @n 201,25,19-1,38-1,11 datarow26 @n 73 datarow36 @n 57datarow68 @n 68,46,10,17,2,4,3 datarow46 @n 67 data30 @n 91-1 data37 @n 219,9data54 @n 47,46,3data50 @n 77-1,2,3,12-6 data56 @n 244-1d29 @n 113,12,16u d31 @n 273FTP d30 @n 160cka d58 @n 118 d55 @n 115 d52 @n 150 d48 @n 113,24dDhL4xL xhH,x\@$x`\D lT<$dL@4d0$|\<`@dX0$8pX@(8 |TD( |dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars6info56 @n 64,26info56 index86 @n 356 index86 @n 356i86 @n 474-2,67-1 i77 @n 197,4,5-1i77 @n 197,4,5 index86 @n 356 index86 @n 356 html_string47 @n 64,44,2 goldmoney47 @n 41,4tm gold_oz47 @n 65 gold_gg47 @n 65 index86 @n 356i86 @n 474-2,67-1 hours86 @n 769-4 grep86 @n 134 headers_as_string82 @n 76 headers82 @n 761i77 @n 197,4,5-16info56 @n 64,2,4-2,3,10,4,5,5,7,3,3,40,2-2,4-2,2-3,3,14-1info54 @n 46,54,2-5,6-1,5-1,4 info52 @n 65,9-1,2,19-1,2,46-9,11-1info51 @n 62,19-1,7-1,25,7-5,4,4,4,4,4,4,12,12,5-5,8,4,4,4,4,4,12,13-4,3-2,10,12,12,7-5,4,4,4,4,4,4,11,14,7-5,4,4,4,4,4,11,10-1,7-1,3-19info48 @n 71,9-1,2,13-1,2,18,3-1,2,2,2-3,2,4-1,4,4-1,2-3,5-1info44 @n 81,18-1,5,2-1,2,4-1info43 @n 52,5,2,7,2,3,3-5,47info42 @n 41,9-3,8,19,3-1,31-3,2-4,2-1,2-1,4,5-3,2-1,3,3,43info74 @n 89,10-2,31,16,2,5-1,4,8,3,4,3-1,5-5,7-1,2,14info78 @n 61,3-2,2-1$info85 @n 42,17-1,13-1,5-4,6-19,8-1,8,49info84 @n 49,17-1,12-1,21-1,2-2,6,3,28,5-2,3-2,3-2,3-1,3-1,6$info83 @n 59,21,12-1,16-7,4,4,4,8-1,6-1info81 @n 92,3,2,2,4,11,3-1,2-1info80 @n 61,3-2,2-1info79 @n 80,3-1,3-1info76 @n 64,3-2,2-1info75 @n 64,3-1,3-1%info73 @n 44,13-1,44-1,20-1,7,3-8,16-2,4 indiamutual50 @n 29,5index69 @n 123-1,3in_currency_option37 @n 240,24,21,8,12in_currency_list37 @n 239,19,2,18,3,2,20 in56 @n 202,41 ignored30 @n 91 if15 @n 85 if16 @n 19 i26 @n 121-1i31 @n 183-1,26-1 i69 @n 114-1 i44 @n 91,2i70 @n 146,2,7-1,2,4 hustock49 @n 33,17 hungary49 @n 37,17 hufund49 @n 31,17 hu_decimal49 @n 131-2,2-3,41hu49 @n 36-1,16 https38 @n 23 https65 @n 32 https83 @n 28 https39 @n 36 http_proxy_auth_clear72 @n 97,2 (htmlstream34 @n 123,3,7,48,3,7-1,4-1,7-1,20-1,4-1 htmlstream66 @n 127,4,10,61,3,2-1,7,2,18 html_string39 @n 92,36,3 html74 @n 112,3 hmm59 @n 71@n hex48 @n 50 headers_as_string83 @n 71 headers28 @n 65a headers29 @n 89su headers42 @n 90 s headers38 @n 64-1 headers33 @n 65 headers69 @n 1017 headers68 @n 75 headers62 @n 144 headers58 @n 7955 headers56 @n 88,38del headers52 @n 80 headers83 @n 71 header_template72 @n 77,6 header72 @n 84-1ghead156 @n 175,4,8war grep59 @n 73  greece28 @n 38,6g goto56 @n 41,2 gmtime56 @n 153 u getopts16 @n 1334get_trimmed_text34 @n 133,59,5,8,21,5get_trimmed_text66 @n 141,66,8,20get_tag34 @n 126,58,7,5,8,21,5nfuget_tag66 @n 131,74,3,9 get34 @n 105,59 get43 @n 5673 get38 @n 58ri get45 @n 122,23n get74 @n 110n get83 @n 68 get70 @n 94 8 get66 @n 105,76ne get55 @n 99,47 g73 @n 64-1 { fw26 @n 91-2i fw36 @n 76-2 funds27 @n 52,8,16,12,108funds39 @n 86-1,32,16-1,22,25funds59 @n 54,7-1,2,11-7,6-2,4-1afunds71 @n 59-1,5,51funds74 @n 87-1,10trefunds65 @n 873-1,31,72 funds53 @n 28,10-1,2,13-7,4,10-2,4-1e fundrows69 @n 95,20,16,8,2@n 0h,$\Ltt hd4(tT4tT4pPT, lL, lL, hH(hL00X8t\D tP0dL4\8.ksh.bash.ebuild.eclass,Bat:.bat.cmd,BlitzMax:.bmx,Boo:.boo,Bro:.bro,C#:.cs,C++:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.C.H,COBOLFree:.cbl.CBL,COBOL:.cob.COB.cpy.CPY,CUDA:.cu.cuh,C:.c.h,Ceylon:.ceylon,Cfm:.cfm.cfml.cfc,Clojure:.clj,CoffeeScript:.coffee,Common-Lisp:.cl.lisp.el,Coq:.v,Croc:.croc,Csh:.tcsh.csh,Cython:.pyx.pxd.pxi,Dart:.dart,Dg:.dg,Duel:.duel.jbst,Dylan:.dylan.dyl.intr,ECL:.ecl,EC:.ec.eh,ERB:.erb,Elixir:.ex.exs,Erlang:.erl.hrl.es.escript,Evoque:.evoque,FSharp:.fs.fsi,Factor:.factor,Fancy:.fy.fancypack,Fantom:.fan,Felix:.flx.flxh,Fortran:.f.f90.F.F90,GAS:.s.S,GLSL:.vert.frag.geo,Genshi:.kid,Gherkin:.feature,Gnuplot:.plot.plt,Go:.go,GoodData-CL:.gdc,Gosu:.gs.gsx.gsp.vark,Groovy:.groovy,Gst:.gst,HaXe:.hx,Haml:.haml,Haskell:.hs,Hxml:.hxml,Hybris:.hy.hyb,IDL:.pro,Io:.io,Ioke:.ik,JAGS:.jag.bug,Jade:.jade,JavaScript:.js,Java:.java,Jsp:.jsp,Julia:.jl,Koka:.kk.kki,Kotlin:.kt,LLVM:.ll,Lasso:.lasso,Literate-Haskell:.lhs,LiveScript:.ls,Logos:.x.xi.xm.xmi,Logtalk:.lgt,Lua:.lua.wlua,MOOCode:.moo,MXML:.mxml,Mako:.mao,Mason:.m.mhtml.mc.mi,Matlab:.m,Modelica:.mo,Modula2:.mod,Monkey:.monkey,MoonScript:.moon,MuPAD:.mu,Myghty:.myt,NASM:.asm.ASM,NSIS:.nsi.nsh,Nemerle:.n,NewLisp:.lsp.nl,Newspeak:.ns2,Nimrod:.nim.nimrod,OCaml:.ml.mli.mll.mly,Objective-C++:.mm.hh,Objective-C:.m.h,Objective-J:.j,Octave:.m,Ooc:.ooc,Opa:.opa,OpenEdge:.p.cls,PHP:.php.php3.phtml,Pascal:.pas,Perl:.pl.pm,PostScript:.ps.eps,PowerShell:.ps1,Prolog:.prolog.pro.pl,Python:.py.pyw.sc.tac.sage,QML:.qml,REBOL:.r.r3,RHTML:.rhtml,Racket:.rkt.rktl,Ragel:.rl,Redcode:.cw,RobotFramework:.robot,Ruby:.rb.rbw.rake.gemspec.rbx.duby,Rust:.rs.rc,S:.S.R,Scala:.scala,Scaml:.scaml,Scheme:.scm.ss,Scilab:.sci.sce.tst,Smalltalk:.st,Smarty:.tpl,Sml:.sml.sig.fun,Snobol:.snobol,SourcePawn:.sp,Spitfire:.spt,Ssp:.ssp,Stan:.stan,SystemVerilog:.sv.svh,Tcl:.tcl,TeX:.tex.aux.toc,Tea:.tea,Treetop:.treetop.tt,TypeScript:.ts,UrbiScript:.u,VB.net:.vb.bas,VGL:.rpf,Vala:.vala.vapi,Velocity:.vm.fhtml,Verilog:.v,Vhdl:.vhdl.vhd,Vim:.vim,XBase:.PRG.prg,XQuery:.xqy.xquery.xq.xql.xqm,XSLT:.xsl.xslt.xpl,Xtend:.xtendlib/gtags/pygments-parser.laANTLR/usr/local/lib/gtags/pygments-parser.laActionScript3/usr/local/lib/gtags/pygments-parser.laAda/usr/local/lib/gtags/pygments-parser.laAppleScript/usr/local/lib/gtags/pygments-parser.laAspectJ/usr/local/lib/gtags/pygments-parser.laAspx-cs/usr/local/lib/gtags/pygments-parser.laAsymptote/usr/local/lib/gtags/pygments-parser.laAutoIt/usr/local/lib/gtags/pygments-parser.laAwk/usr/local/lib/gtags/pygments-parser.laBUGS/usr/local/lib/gtags/pygments-parser.laBash/usr/local/lib/gtags/pygments-parser.laBat/usr/local/lib/gtags/pygments-parser.laBlitzMax/usr/local/lib/gtags/pygments-parser.laBoo/usr/local/lib/gtags/pygments-parser.laBro/usr/local/lib/gtags/pygments-parser.laC#/usr/local/lib/gtags/pygments-parser.laC++/usr/local/lib/gtags/pygments-parser.laCOBOLFree/usr/local/lib/gtags/pygments-parser.laCOBOL/usr/local/lib/gtags/pygments-parser.laCUDA/usr/local/lib/gtags/pygments-parser.laC/usr/local/lib/gtags/pygments-parser.laCeylon/usr/local/lib/gtags/pygments-parser.laCfm/usr/local/lib/gtags/pygments-parser.laClojure/usr/local/lib/gtags/pygments-parser.laCoffeeScript/usr/local/lib/gtags/pygments-parser.laCommon-Lisp/usr/local/lib/gtags/pygments-parser.laCoq/usr/local/lib/gtags/pygments-parser.laCroc/usr/local/lib/gtags/pygments-parser.laCsh/usr/local/lib/gtags/pygments-parser.laCython/usr/local/lib/gtags/pygments-parser.laDart/usr/local/lib/gtags/pygments-parser.laDg/usr/local/lib/gtags/pygments-parser.laDuel/usr/local/lib/gtags/pygments-parser.laDylan/uisodate47 @n 134,15,18,17 is_success47 @n 107106info47 @n 63,14-3,12,27,2,2,10,3-5,7,2-5,11,2-5,5,8,3-1,3 jan86 @n 7082 isodate86 @n 726-182 inverse_rate86 @n 269 int86 @n 274finforef86 @n 703,27,29-12info86 @n 408,12,15-1,14,2,42)info82 @n 64,21,13-1,27-1,2-5,2,4,10,8-1,6-1a isoTime77 @n 245y is_success77 @n 178n Minfo77 @n 160,47,10-2,3,5,2,4,5-2,3,2,6-2,8,2,3-2,3-1,2-1,7,3,3,8,4,2,13,6-3,3-1 join31 @n 117 join83 @n 121 join74 @n 183 join70 @n 91 join44 @n 85j31 @n 213,2,6-1b j44 @n 103,27item56 @n 194,2,2,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,28,2,2 re issueyear73 @n 55-1 \ issuemonth73 @n 55-1,64,14@n  isodate53 @n 65 } isodate49 @n 139,44ub isodate68 @n 160  isodate59 @n 7652 isodate57 @n 90\@ isoTime74 @n 150,6isin39 @n 93,87,4 isin49 @n 175-2ub isin55 @n 113,6 is_success26 @n 86 is_success27 @n 58t is_success29 @n 79( is_success28 @n 62 is_success34 @n 106,59 is_success33 @n 69ԀX is_success32 @n 63 is_success31 @n 123d is_success30 @n 61d is_success45 @n 123,23 is_success44 @n 86 is_success43 @n 58 is_success42 @n 60 is_success41 @n 64,72 is_success40 @n 74 is_success39 @n 127 is_success38 @n 61 is_success36 @n 71 is_success35 @n 81 is_success46 @n 85 is_success54 @n 82,26 is_success63 @n 96ice is_success71 @n 72sub is_success74 @n 111> is_success73 @n 97; } is_success70 @n 95, is_success69 @n 100n is_success68 @n 95 is_success67 @n 68@n is_success66 @n 106,76@n is_success65 @n 928,6 is_success64 @n 96qw/ is_success62 @n 81,22,10@ is_success61 @n 34\@@ is_success60 @n 34 55 is_success59 @n 59 \@ is_success58 @n 70 53 is_success57 @n 70=> is_success56 @n 84,41 is_success53 @n 36 da is_success52 @n 72 is_success51 @n 71 re is_success50 @n 61hod is_success49 @n 97,64 is_success48 @n 78 is_success84 @n 65ada is_success85 @n 58ls is_stock48 @n 103-1,11x is_header70 @n 137,4-1 isLineOne57 @n 57,18,2 is56 @n 244-1 into56 @n 249 information56 @n 177,12 infoelem31 @n 176,2-1,3,17,3,4-1,2 infoclass31 @n 163-1 info_row30 @n 100-1,5info26 @n 72,54-10,8,3-1,7,2-1,6-13info27 @n 53,9-1,2,12-1,2,9-1,2,12-6,2,3,2,2,2-2,9-1,3Ainfo30 @n 53,20-1,21-1,7,3,3-1,2-2,2-8,2-2,4,6-1,4-1,5,3,2,6,4-1,4-1:info29 @n 71,10-1,2,14-1,2,17,4,3,9-2,5,7-1,9,3,2-2,6,2-3,6-1#info28 @n 53,19-1,7-1,4-11,2,2,3-1,3-1info38 @n 55,5,2,13-7,3-1,3Ainfo41 @n 49,16-1,10-1,26-2,16-7,9-1,8-1,8,2-2,6,2-2,3-4,2,2,2-2,3,6+info39 @n 90,46-1,3,18-1,44,13-8,9-1,4,8,3-1,3info36 @n 56,43-14,2,2-1,7,2-1,6-1info35 @n 70,28-10,2,5-2,7-1,4 info32 @n 53,19-1,43-10,2,2,3-1,3-1Tinfo31 @n 109,17,8-1,6,6-1,6,3,11-1,72-1,3-2,3,10-1,5,3,6,2-1,3,4,4,4,4,4-1,2,2,8-1,3-1Cinfo49 @n 61,5,6,4-1,3,6,5-2,5,8,16,7-10,2,3,6,5-2,5,7,5,2-2,2-1,2,2,3info69 @n 95,37,2-8,2-1,3-1info71 @n 62,30-8,9-1,8-1,4,info70 @n 81,16-1,6,6-2,3,11,24,5-1,3-1,2,4,2-1(info65 @n 876,40-1,42-6,2-2,3-1,5-1,8-1,4-1)info58 @n 64,8-1,2,12-1,2,22-1,3,2,4,2-5,5-1info57 @n 60,25-8,9-1,8-1,4lT< p4 hL,\ 8xP|T8`D$dD$dD$pL,lPtX48pL4 tP, \@ 8 |TD( |dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars6info56 @n 64,2,4-2,3,10,4,5,5,7,3,3,40,2-2,4-2,2-3,3,1 msg47 @n 185,5 name86 @n 323,2$month86 @n 707,12-1,2,5,3,5,7,11-1,3,2-1modules86 @n 102,5,53,16,10y_ module86 @n 107y_modpath86 @n 108-1,6,4-1,5 mnames86 @n 708,4665mins86 @n 769,3-1 methods86 @n 1198 methodinfo86 @n 575-2,10 methodhash86 @n 119,17,2method86 @n 68-1,8,11,48-3,421,3,12y_ may86 @n 708matched86 @n 322,5,6,2 mar86 @n 708 map86 @n 300 my_volume82 @n 65 my_p_change82 @n 65@n my_open82 @n 66@n my_low82 @n 65 @n my_last82 @n 65@n my_high82 @n 65@nmy_date82 @n 65,80,2,460nav54 @n 46,50,9 nasdaq81 @n 50,11 nameline31 @n 144,2,7name_ok39 @n 187,7,6 name31 @n 153-1name37 @n 46-152,54,40name34 @n 125,8,6,2,5,3name52 @n 120-3,20,3name45 @n 166,4,2,4,3name39 @n 93,72,24,3-1,9,17name59 @n 71-2,2-7name64 @n 59,3,3,2,43,6name63 @n 59,3,3,2,43,7name62 @n 134,4,3name58 @n 95-1,11-3,3 name56 @n 246name55 @n 113,5,4,5,3name53 @n 28,3,2,21-7,4name66 @n 130,11,6,2,5,3,94 n39 @n 192-1n41 @n 111-2,3-1,5-7,36myquote51 @n 235,8-1 mycurrency51 @n 235,9-1 my_volume32 @n 54,48,21 my_volume83 @n 60 my_p_change32 @n 54,45,23 my_p_change83 @n 60my_open32 @n 54,57,15 my_open83 @n 61my_low32 @n 54,54,17 my_low83 @n 60my_last32 @n 54,42,24-1 my_last83 @n 60my_high32 @n 54,51,19 my_high83 @n 60my_date32 @n 54,30,44my_date83 @n 60,64-1,4 my13 @n 21$mutual33 @n 55,7,15-1,6,4-4,4-4,2,3,3,3-1<mutual62 @n 75,3,4-1,5-1,6,4-1,4-1,6,30,21-1,3-2,4-1,3,15-1,3-1,3 multi56 @n 248 mtgox_usd:56 @n 239 mtgox_thb:56 @n 237 mtgox_sgd:56 @n 235 mtgox_sek:56 @n 233 mtgox_rub:56 @n 231 mtgox_pln:56 @n 229 mtgox_nzd:56 @n 227 mtgox_nok:56 @n 225 mtgox_jpy:56 @n 223 mtgox_hkd:56 @n 221 mtgox_gbp:56 @n 219 mtgox_eur:56 @n 217 mtgox_dkk:56 @n 215 mtgox_cny:56 @n 213 mtgox_chf:56 @n 211 mtgox_cad:56 @n 209 mtgox_aud:56 @n 207 mtgox56 @n 41,2 mstaruk_fund55 @n 51-1 mstaruk55 @n 51,6 msg39 @n 245,5 morningstarjp54 @n 37-1 morningstar53 @n 15,5 month26 @n 144 month30 @n 142-1 month74 @n 149month54 @n 47,10,4,14,24,2 month31 @n 272,4 module56 @n 189 mirror50 @n 58methods56 @n 202,41-1 method:56 @n 269 method56 @n 246,23 max_retry74 @n 97,104 matches26 @n 73 matches46 @n 67 matches36 @n 57matches68 @n 68,36,9,6,4,5,4 matched56 @n 249match66 @n 201,3,4,15,32,6markets56 @n 30,8,12,153,45-1,market56 @n 38-1,2,2,7-1,9,45,3,3,36,18,2,29,2,50 map35 @n 75 map40 @n 68 map49 @n 113 map68 @n 72 map58 @n 98,12 map52 @n 126,17 map46 @n 71 maninv52 @n 49,5 m31 @n 273 m83 @n 118 m33 @n 83 looper73 @n 89 &look_down31 @n 131,13,19,3,11,2,3,7,12-1,4,3,3 look_down74 @n 119,4,4,12,25 $X< @P$@pX<$hL0 |`D( dH,h$hL0lP4pT8tX< x\D\(tX@( pX@(pp|dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars6info56 @n 64,2,4-2,3,10,4,5,5,7,3,3,40,2-2,4-2,2-3,3,1nav package82 @n 2params86 @n 301,2, package47 @n 292,now47 @n 199,4,3,params86 @n 301,2,13,7,2,4,2,4 param_errors86 @n 302,4,3 package86 @n 302  oct86 @n 709  nov86 @n 709  no86 @n 8782 new_currency86 @n 411,3,9,4-2,5,18,4new86 @n 637,2,7,2,12,2,7,2ge package82 @n 24 package77 @n 322, orig_symbols77 @n 155,12, parse29 @n 92 parse28 @n 68 parse37 @n 228 parse33 @n 71 parse32 @n 68 parse30 @n 68 parse48 @n 90 parse46 @n 90 parse43 @n 62 parse42 @n 68,24 parse41 @n 71,70 parse39 @n 131 parse38 @n 66 parse74 @n 115,20 parse84 @n 72 parse85 @n 66 parse70 @n 132 parse69 @n 104 parse68 @n 99 parse62 @n 145 parse58 @n 81 parse53 @n 45 parse52 @n 81,8 parse51 @n 77 parse49 @n 104,63 pan45 @n 203 package26 @n 38 package27 @n 29 package30 @n 30 package29 @n 36 package28 @n 25 package36 @n 28 package35 @n 35 package34 @n 29 package33 @n 13 package32 @n 25 package31 @n 69 package48 @n 36 package46 @n 31 package45 @n 43 package44 @n 35 package43 @n 18 package42 @n 11 package41 @n 12 package40 @n 30 package39 @n 34 package38 @n 18 package37 @n 16 package51 @n 36 package59 @n 27 package67 @n 30 package75 @n 31 package80 @n 27 package79 @n 29 package78 @n 28 package76 @n 28 package74 @n 36 package73 @n 15 package72 @n 25 package71 @n 34 package70 @n 37 package69 @n 34 package68 @n 31 package66 @n 29 package65 @n 30 package64 @n 25 package63 @n 25 package62 @n 30package61 @n 8package60 @n 8 package58 @n 36 package57 @n 33 package56 @n 16 package55 @n 29 package54 @n 20package53 @n 1 package52 @n 36package50 @n 5 package49 @n 12 package83 @n 21 package85 @n 13 package84 @n 22 package81 @n 30p37 @n 220,7-1 over56 @n 192,13 outfile66 @n 120,74 other56 @n 243-1 operational56 @n 196,2 operates56 @n 248 operate56 @n 203 open26 @n 91,5 open36 @n 76,5 open66 @n 121,74 open50 @n 70 open74 @n 94 opcvm31 @n 165,2 offers56 @n 248 of56 @n 202 nzxurl57 @n 53,16 nzx57 @n 42,4 nz57 @n 42,4 nz80 @n 43,5 nyse81 @n 49,11 now54 @n 55nexturl34 @n 125-1,6,6,13,9,4nexturl55 @n 113,4,15,10,4nexturl66 @n 130-1,9,6,13,18,4 new_request72 @n 57-1,7-1,12,6-1,3 new_from_content31 @n 128 new13 @n 36 new14 @n 14 new72 @n 42 new15 @n 11net34 @n 297,8,8net55 @n 212,8,8net66 @n 319,8,8net45 @n 200,5,3,5,11,2,29,8 negate34 @n 235,5navdate62 @n 133,48,4-1,3,6-1 nav51 @n 254-3nav62 @n 131,21,8,6-2ttX<\ h@pP4tL$xD`H,pH$t$tT4lL,hH, dD xT8tT(|\8|LlT8lT8  |dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars6info56 @n 64,2,4-2,3,10,4,5,5,7,3,3,40,2-2,4-2,2-3,3,1navpush86 @n 137,445,57,7push86q77 @n 184-2,15,5-17,push86 @n 137,445,57,7,16,7pus q47 @n 63 platinum_pg47 @n 663 platinum_oz47 @n 663push86 @n 137,445,57,7,16,7 piecesref86 @n 705,21-1,7-1,6-1,6-1,4,2q77 @n 184-2,15,5-17, push77 @n 172 parse_csv77 @n 185quoter30 @n 48,7,84,4 quoter29 @n 67,6quoter39 @n 85,4,129quoter38 @n 52,2,23quoter36 @n 52,35,28quoter35 @n 67,11,30quoter34 @n 71,7,191,5quoter33 @n 46,12,44quoter32 @n 51,4,73quoter49 @n 59,5,6,14,4,51,9,4,31quoter54 @n 43,7,46,4quoter53 @n 24,10,31quoter52 @n 62,5,81quoter51 @n 60,3,68,62,53,51,61quoter50 @n 42,12,47quoter48 @n 68,5,73quoter46 @n 62,17,68quoter45 @n 86,7,213,5quoter44 @n 78,5,12quoter43 @n 49,2,23quoter42 @n 39,6,70 quoter41 @n 47,8quoter40 @n 59,13,4,23quoter57 @n 54,4,22,10quoter65 @n 275,650,22,15quoter85 @n 40,8,77quoter84 @n 47,8,88quoter83 @n 57,5,66quoter74 @n 85-1,62,2,5-1quoter81 @n 85,7,17,5 quoter80 @n 53,8 quoter79 @n 70,10 quoter78 @n 56,5 quoter76 @n 56,8 quoter75 @n 59,5 quoter73 @n 42,8quoter71 @n 58,3,36 quoter70 @n 77,17quoter69 @n 86,12,44quoter68 @n 63,30,67,2quoter67 @n 61,5,5,10quoter66 @n 71,7,213,5quoter64 @n 90,4,5,22quoter63 @n 90,4,5,23 quoter62 @n 62,9quoter61 @n 23,6,21quoter60 @n 23,6,21quoter59 @n 50,7,19quoter58 @n 61,5,58quoter56 @n 61,19,44quoter55 @n 65,7,114,5quote_infos_page31 @n 200,2,4 quote43 @n 69-1 query_param70 @n 91 queryUrl31 @n 115,4qdata65 @n 880,43,6,6,4-2q35 @n 70,13,6-1,4,6,2-6 q39 @n 90 q46 @n 66q44 @n 95-1,2,7,5q40 @n 62,14,2,8,3-7,3q63 @n 91,8,3-1,2,13,4,3q61 @n 26,4-2,3,7-2,6,6,5,4q60 @n 26,4-2,3,7-2,6,6,5,4q57 @n 60,20-1,2,2-8 q56 @n 182q64 @n 91,8,3-1,2,12,4,3q71 @n 62,15-1,7-2,2,3-8 q68 @n 67q67 @n 62,9,3,6-1 push46 @n 83 push52 @n 114 proxy_authorization_basic72 @n 98 provided56 @n 243 provide56 @n 202 prices56 @n 202price34 @n 180,32,65-1,19,7,6-2price45 @n 182,4,2,6,2,58,6-2price55 @n 158,7,29,18,7,6-2 price49 @n 179-2 price46 @n 66 price66 @n 201,25,12,3,58-1,19,7,6-2price64 @n 91,26-3price63 @n 91,27-3 price59 @n 71,3,7 price56 @n 267price68 @n 67,76,3-3 post54 @n 68 pool56 @n 249 platinum58 @n 48,5pchange34 @n 180,58,4,8-1,6,3,37pchange45 @n 201,5,10,5,7,2,35pchange66 @n 201,71,6,3-1,37pchange55 @n 158,8,3,6,3,34 passed56 @n 246 part43 @n 70-5parser70 @n 131-1,2 parse_csv_semicolon26 @n 109 parse_csv36 @n 87 parse_csv40 @n 76 parse_csv54 @n 96 parse_csv44 @n 95 parse_csv67 @n 71 parse_csv65 @n 947 parse_csv64 @n 99 parse_csv63 @n 99 parse_csv57 @n 80 parse27 @n 73lL0lX< |X8xT4lL(@ |\@$lL0$lL0hL0lD( dH,hL0lP4pT8H req request47 @n 105tquoter47 @n 54,4,42,33,15,18t request86 @n 251, reqmodules86 @n 161,5,2,5-1,12y8(ref86 @n 100,55,77,64,56,23,94,20,67,79,232  request82 @n 722 reply82 @n 64,8,2,2-1quoter82 @n 62,5,832  require54 @n 21require53 @n 2 require52 @n 32 require51 @n 32require50 @n 6 require77 @n 3386 require49 @n 13 require48 @n 32 require46 @n 32 require45 @n 44 require44 @n 31 require42 @n 12 require41 @n 13 require40 @n 31 require65 @n 31-2 require71 @n 35 require72 @n 26 require76 @n 29 require80 @n 28 require84 @n 23 require85 @n 14 require83 @n 23,5 require81 @n 31 require79 @n 30 require78 @n 29 require75 @n 32 require74 @n 37 require73 @n 16 require70 @n 33 require69 @n 30 require68 @n 32 require67 @n 31 require66 @n 30 require64 @n 26 require63 @n 26 require62 @n 31 require59 @n 28 require58 @n 32 require57 @n 34 requests_redirectable46 @n 83 request26 @n 82,2 request27 @n 57 request30 @n 59 request29 @n 78 request28 @n 60 request36 @n 66,2 request35 @n 79 request33 @n 64 request32 @n 61 request31 @n 119 request52 @n 69 request51 @n 69 request49 @n 96,64 request48 @n 76 request46 @n 84 request44 @n 85 request42 @n 58 request41 @n 61,72 request40 @n 73 request39 @n 125 request37 @n 219 request58 @n 68 request67 @n 67 request77 @n 1776 request85 @n 54 request84 @n 61 request74 @n 103,7 request73 @n 95request72 @n 56-1,7-2,10,2 request71 @n 71 request69 @n 99 request68 @n 94 request65 @n 927,6 request64 @n 95 request63 @n 95 request62 @n 79,18 request61 @n 33 request60 @n 33 request59 @n 58 request57 @n 69 request56 @n 80,44 request53 @n 35reply26 @n 72,12,2,6,4reply27 @n 53,4-1,15reply30 @n 52,7,2,7reply28 @n 53,7,2,6reply35 @n 70,9,2-1,43reply33 @n 56,8,5,2,12reply32 @n 53,8,2,5reply31 @n 109,10,4,5reply51 @n 62,7,2,6reply61 @n 26,7-1,4,8,6,6reply60 @n 26,7-1,4,8,6,6reply59 @n 54,4-1,8reply53 @n 28,7-1,9 reply50 @n 52,6,3reply46 @n 66,18-1,5,55 reply44 @n 89,3reply40 @n 62,11-2reply36 @n 56,12,3,6,4reply65 @n 880,47-2,4-2reply83 @n 59,9-1,2-1reply69 @n 96,3-1,4reply68 @n 67,27-1,4,59 reply67 @n 67-2 reply64 @n 95-2 reply63 @n 95-2reply62 @n 79,2,5,11,6,10,24,8,34redemptionyear73 @n 62-1,2,3,18,53-1redemptionvalues73 @n 99-1,13,7,14redemptionmonth73 @n 62-1,2-2,20,52-1r256 @n 124-2,6r56 @n 79,5,4,4quoter26 @n 68,41,35quoter77 @n 151,10,24,42,18,8,12,3quoter28 @n 51,3,44quoter27 @n 51,3,56quoter31 @n 107,3,136,31 lH$@(pX4hP8 t\D, t\< pX<$\pX@(@lL,tX@(pX8 x\< pP(xhT, |dL(./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars6info56 status_line47 @n 120  sprintf47 @n 203,3n 1 spotPrices47 @n 112-2 spotPrice47 @n 138-1,13-1,17-11 silver_oz47 @n 65shift47 @n 54,130-1,131 sprintf86 @n 730,29-1,13asplit86 @n 166,306Rshift86 @n 99,55,20,58,64,79,32-3,59,26-1,9-1,18,14,18,4,48,27-1,22-1,43-3,107,7,3,2,4 sep86 @n 709@self86 @n 154-1,609,32,3,13ta status_message82 @n 75sta shift82 @n 62 split77 @n 1830,2 splice77 @n 167 7shift77 @n 151-1,3,32stock58 @n 71-2,13-2,22-3,3,2,4,2-5stock52 @n 73-2,20-2,46-11 status_message83 @n 70 status_line34 @n 111,7,52,5 status_line39 @n 136 status_line35 @n 125 status_line66 @n 111,7,69,5 status_line74 @n 197 status_line45 @n 128,5,18,5 starttime65 @n 887-4 startdate65 @n 887,4,7 start_h37 @n 220 ssl_opts41 @n 56 ssl_opts83 @n 63 sprintf29 @n 163 sprintf41 @n 178 sprintf31 @n 275sprintf69 @n 122,4,2 sprintf62 @n 95sprintf56 @n 81,40,46 sprintf83 @n 122-1 sprintf73 @n 67 split15 @n 26 split35 @n 82-1 split43 @n 70 split40 @n 75split39 @n 164,7,7,14 split53 @n 53 split59 @n 67,4 split57 @n 73 split54 @n 93 split51 @n 244 split50 @n 77 split44 @n 92split71 @n 75,2,5,3 split72 @n 99 split67 @n 69 split65 @n 941 split64 @n 97 split63 @n 97 splice29 @n 77 splice44 @n 79 splice70 @n 87 splice52 @n 113 sort15 @n 25 slice_columns33 @n 66 slice_columns38 @n 65 slice_columns42 @n 91 sleep45 @n 315 sleep74 @n 204 sixshares61 @n 16,3 sixfunds60 @n 16,3 simple_request72 @n 58 shift26 @n 68 shift28 @n 51 shift27 @n 51shift29 @n 67,39,16 shift33 @n 46 shift36 @n 52 shift35 @n 67 shift34 @n 71 shift32 @n 51 shift31 @n 101,6 shift30 @n 48 shift38 @n 34,9,9 shift40 @n 59 shift42 @n 39 shift44 @n 78 shift46 @n 62 shift48 @n 68 shift50 @n 42shift52 @n 62,44,5-2 shift54 @n 43 shift56 @n 60-1shift58 @n 61,34,21 shift60 @n 23 shift62 @n 62shift64 @n 59,17,14 shift66 @n 71 shift68 @n 63 shift70 @n 77 shift72 @n 49shift74 @n 62,12,11 shift76 @n 56 shift78 @n 56 shift80 @n 53 shift84 @n 47 shift85 @n 40 shift83 @n 57 shift81 @n 85,24 shift79 @n 70 shift75 @n 59 shift73 @n 42 shift71 @n 58 shift69 @n 86 shift67 @n 61 shift65 @n 275shift63 @n 59,17,14 shift61 @n 23 shift59 @n 50 shift57 @n 54 shift55 @n 65 shift53 @n 24 shift51 @n 60shift49 @n 59,25,64,44,12 shift45 @n 86 shift43 @n 33,9,7 shift41 @n 47shift39 @n 85,159-1 sharenet84 @n 37,6 set_currency16 @n 20series73 @n 55-1,15-1 selectStdYearTo54 @n 74 selectStdYearFrom54 @n 71 selectStdMonthTo54 @n 75 selectStdMonthFrom54 @n 72 selectStdDayTo54 @n 76 selectStdDayFrom54 @n 73h hH \d4|\<|\<|\<|\<lL, hH|, `<xX< d@tH,t\D, lT8tX< lax\@$/usr/local/lib/gtags/pygments-parser.laAsymptote/usr/local/lib/gtags/pygments-parser.laAutoIt/usr/local/lib/gtags/pygments-parser.laAwk/usr/local/lib/gtags/pygments-parser.laBUGS/usr/local/lib/gtags/pygments-parser.laBash/usr/local/lib/gtags/pygments-parser.laBat/usr/local/lib/gtags/pygments-parser.laBlitzMax/usr/local/lib/gtags/pygments-parser.laBoo/usr/local/lib/gtags/pygments-parser.laBro/usr/local/lib/gtags/pygments-parser.laC#/usr/local/lib/gtags/pygments-parser.laC++/usr/local/lib/gtags/pygments-parser.laCOBOLFree/usr/local/lib/gtags/pygments-parser.laCOBOL/usr/local/lib/gtags/pygments-parser.laCUDA/usr/local/lib/gtags/pygments-parser.laC/usr/local/lib/gtags/pygments-parser.laCeylon/usr/local/lib/gtags/pygments-parser.laCfm/usr/local/lib/gtags/pygments-parser.laClojure/usr/local/lib/gtags/pygments-parser.laCoffeeScript/usr/local/lib/gtags/pygments-parser.laCommon-Lisp/usr/local/lib/gtags/pygments-parser.laCoq/usr/local/lib/gtags/pygments-parser.laCroc/usr/local/lib/gtags/pygments-parser.laCsh/usr/local/lib/gtags/pygments-parser.laCython/usr/local/lib/gtags/pygments-parser.laDart/usr/local/lib/gtags/pygments-parser.laDg/usr/local/lib/gtags/pygments-parser.laDuel/usr/local/lib/gtags/pygments-parser.laDylan/usr/local/lib/gtags/pygments-parser.laECL/usr/local/lib/gtags/pygments-parser.laEC/usr/local/lib/gtags/pygments-parser.laERB/usr/local/lib/gtags/pygments-parser.laElixir/usr/local/lib/gtags/pygments-parser.laErlang/usr/local/lib/gtags/pygments-parser.laEvoque/usr/local/lib/gtags/pygments-parser.laFSharp/usr/local/lib/gtags/pygments-parser.laFactor/usr/local/lib/gtags/pygments-parser.laFancy/usr/local/lib/gtags/pygments-parser.laFantom/usr/local/lib/gtags/pygments-parser.laFelix/usr/local/lib/gtags/pygments-parser.laFortran/usr/local/lib/gtags/pygments-parser.laGAS/usr/local/lib/gtags/pygments-parser.laGLSL/usr/local/lib/gtags/pygments-parser.laGenshi/usr/local/lib/gtags/pygments-parser.laGherkin/usr/local/lib/gtags/pygments-parser.laGnuplot/usr/local/lib/gtags/pygments-parser.laGo/usr/local/lib/gtags/pygments-parser.laGoodData-CL/usr/local/lib/gtags/pygments-parser.laGosu/usr/local/lib/gtags/pygments-parser.laGroovy/usr/local/lib/gtags/pygments-parser.laGst/usr/local/lib/gtags/pygments-parser.laHaXe/usr/local/lib/gtags/pygments-parser.laHaml/usr/local/lib/gtags/pygments-parser.laHaskell/usr/local/lib/gtags/pygments-parser.laHxml/usr/local/lib/gtags/pygments-parser.laHybris/usr/local/lib/gtags/pygments-parser.laIDL/usr/local/lib/gtags/pygments-parser.laIo/usr/local/lib/gtags/pygments-parser.laIoke/usr/local/lib/gtags/pygments-parser.laJAGS/usr/local/lib/gtags/pygments-parser.laJade/usr/local/lib/gtags/pygments-parser.laJavaScript/usr/local/lib/gtags/pygments-parser.laJava/usr/local/lib/gtags/pygments-parser.laJsp/usr/local/lib/gtags/pygments-parser.laJulia/usr/local/lib/gtags/pygments-parser.laKoka/usr/local/lib/gtags/pygments-parser.laKotlin/usr/local/lib/gtags/pygments-parser.laLLVM/usr/local/lib/gtags/pygments-parser.laLasso/usr/local/lib/gtags/pygments-parser.laLiterate-Haskell/usr/local/lib/gtags/pygments-parser.laLiveScript/usr/local/lib/gtags/pygments-parser.laLogos/usr/local/lib/gtags/pygments-parser.laLogtalk/usr/local/lib/gtags/pygments-parser.laLua/usr/local/lib/gtags/pygments-parser.laMAQL/usr/local/lib/gtags/pygments-parser.laMOOCode/usr/local/lib/gtags/pygments-parser.laMXML/usr/local/lib/gtags/pygments-parser.laMako/usr/local/lib/gtags/pygments-parser.laMason/usr/local/lib/gtags/pygments-parser.laMatlab/usr/local/lib/gtags/pygments-parser.laMiniD/usr/local/lib/gtags/pygments-parser.laModelica/usr/local/lib/gtags/pygments-parser.laModula2/usr/local/lib/gtags/pygments-parser.laMonkey/usr/local/lib/gtags/pygments-parser.laMoonScript/usr/local/lib/gtags/pygments-parser.laMuPAD/usr/local/lib/gtags/pygments-parser.laMyghty/usr/suffix_to_currency82 @n 40substr86 @n 646,23str47 @n 200,3,3,3 64 store_date47 @n 133,15,18substr86 @n 646,23,85,74e strict86 @n 87str86 @n 796,2-1,2,11,5,7,4-1stocks86 @n 409,7,145,18,2,5,5rrestock86 @n 416,4,15-1,14,2,4,125-2 40suffix_to_currency82 @n 40,99-1srHsymbol77 @n 186-1,3,17,10-2,3,5,2,4,5-2,3,2,6-2,8,2,3-2,3-1,2-1,7,3,3,8,2,2,2 symbol79 @n 82-2 symbol78 @n 63-3 symbol76 @n 66-3 symbol75 @n 66-2 symbol74 @n 174-1%symbol70 @n 96-2,11-3,36-2,5-1,3-1,2,4,2-1symbol61 @n 28,2-3,2,7-2,6,6,5symbol60 @n 28,2-3,2,7-2,6,6,5symbol59 @n 60-2,25-3 symb70 @n 91sym35 @n 70,15,4-1,8-10,2,13-2 sym46 @n 66sym40 @n 62,16-1,3,2-15sym68 @n 67,41-1,3,9-1sym67 @n 62,12-3,2-5,2-1sym64 @n 91,14-1,4-1,3-2,4-4,2-1sym63 @n 91,14-1,4-1,3-3,4-4,2-1suffix68 @n 67,14-3 suffix77 @n 158,326 @ subtract54 @n 59 substr39 @n 202substr69 @n 122-2,2-2 substr53 @n 52,12substr77 @n 190,108t substr84 @n 129 style31 @n 109style51 @n 62,44,4 strftime56 @n 154-1 strftime82 @n 145 store_date26 @n 144 store_date27 @n 110 store_date31 @n 246,31 store_date30 @n 139,4 store_date28 @n 98 store_date36 @n 115 store_date35 @n 108 store_date34 @n 269,5 store_date33 @n 102 store_date32 @n 128 store_date49 @n 139,44 store_date51 @n 131,62,53,51,61 store_date50 @n 101 store_date48 @n 146 store_date46 @n 147 store_date82 @n 150 @ store_date45 @n 306,5 store_date77 @n 2279- store_date43 @n 74 store_date42 @n 115 store_date40 @n 99 store_date39 @n 218 store_date38 @n 77 store_date58 @n 124 store_date67 @n 81 store_date84 @n 143 store_date85 @n 125 store_date83 @n 128 store_date74 @n 148,7 store_date71 @n 97 store_date69 @n 142 store_date68 @n 160,2 store_date66 @n 291,5 store_date65 @n 962 store_date64 @n 121 store_date63 @n 122 store_date61 @n 50 store_date60 @n 50 store_date59 @n 76 store_date57 @n 90 store_date55 @n 186,5 store_date54 @n 100 store_date53 @n 65 store_date52 @n 148#stocks28 @n 52,6,2,12-1,7-1,4-11,2,2,3-1stocks29 @n 70,7-1,2,17 stocks32 @n 52,7,2,11-1,43-10,2,2,3-1Sstocks31 @n 108,6,3,9,8-1,6,6-1,6,3,11-1,72-1,3-2,3,10-1,5,3,6,2-1,3,4,4,4,4,4-1,2,2,8-1stocks51 @n 61,4,16-1,7-1,25,7-5,4,4,4,4,4,4,12,12,5-5,8,4,4,4,4,4,12,13-4,3-2,10,12,12,7-5,4,4,4,4,4,4,11,14,7-5,4,4,4,4,4,11,10-1,7-1stocks48 @n 69-1,9,16,9 stocks44 @n 79-1,5 stocks43 @n 50,4 stocks38 @n 53,4$stocks83 @n 58,7,2,13,12-1,16-7,4,4,4,8-1+stocks82 @n 63,6,2,14,13-1,27-1,2-5,2,2,2,10,8-1stocks58 @n 62-1,8,15stocks52 @n 63-1,9,22 stocklabels49 @n 44,3,3-2 stockhousecanada_fund62 @n 49,5 stockhouse_fund62 @n 49-1 stock_info30 @n 91,3,66stock29 @n 80-2,15-2,7,3,4,3,2,4,3,9-2,5,7-1,9,3,2-2,6,2-3stock38 @n 57-1,2,2,13-7,3-17stock48 @n 79-2,14-2,12-1,3,2,2,3-1,2,2,2-3,2,4-1,4,4-1,2-3stock43 @n 54,2-1,2,7,2,3,3-5T$p$pX< hP<0x8t\,| `D$X<hL0x\@$|`D( ThP4X<$ D ll timestamp47 @n tim te47 @n 647m tr86 @n 7653-to86 @n 235-1,7,3,234 timeout86 @n 620- timeString86 @n 764-2,2o this_month86 @n 707,15,35ithis86 @n 157-1,28,2-2,2,40-1,15,21,27-1,78-1,3,2,26,4,18,23,43-1,9,2-1,16,2,12,3,15,2,19,2,7,3,19,2,10,3,794text86 @n 636,3,7,13,3,7- te82 @n 643- tr77 @n 2853-ts85 @n 43,43-2,25-2,7-1uts84 @n 50,59-2,7,4-1 ts83 @n 59al/trusto68 @n 67,12-1,6-2ew trustnet68 @n 50,5gme)trust46 @n 66,9,9,15,5-1,8-1,3,12-2,2,4-4,6,2*trust68 @n 67,9,3,50-1,3,2,3-4,3-1,2-4,8,2,4-1.la troweprice_direct67 @n 48,6se troweprice67 @n 47-1,5tag trimtr74 @n 160ti trimmed_row49 @n 113-1,2p trim38 @n 78g trim49 @n 113 trim43 @n 65,10ertree31 @n 128,3,13,19,3,11,24,110tree74 @n 114-1,4,45,29oc treasury73 @n 30ptrades56 @n 131-1,3,6 trade56 @n 267altr29 @n 113,12,16 tr30 @n 160us tr48 @n 113,24s/p tr43 @n 43hon tr31 @n 305py tr74 @n 79ser tr85 @n 117ustr84 @n 115,34,5,5,5,4.la tr58 @n 107,11/li tr52 @n 121,29aP today30 @n 139s/p today34 @n 269Re today48 @n 146usr today45 @n 306-pa today36 @n 115lib today68 @n 162/li today66 @n 291aR today55 @n 186/py to56 @n 243,3 tnetuk_fund66 @n 57-1 tnetuk66 @n 57,6l tmpnam26 @n 90/lo tmpnam36 @n 75gs/ tmp_rows52 @n 93,21,2tmp27 @n 103,11-3 tmp39 @n 210-2ib/tmp69 @n 121-3,2-2,3,7-1,2par title34 @n 117,57 title45 @n 132,23 title74 @n 130-2g title66 @n 117,74 timezone:56 @n 271Sma time26 @n 74S time36 @n 58r time34 @n 318,3gt time65 @n 888,5gm time56 @n 123 time55 @n 233,3metime45 @n 272,5,3,5,5 time66 @n 340,3obticker56 @n 91-1,6,7-1,2-1,2-1latiaacref_vals65 @n 474-195,240ts-tiaacref_locs65 @n 676-195,36 tiaacref_ids65 @n 276-195,435,55e tiaacref65 @n 51,2libthis72 @n 49-1,6-2,6-2,10-1,19,2,3gs/ they56 @n 203the56 @n 202,43-1,4ar that56 @n 203 than56 @n 245 text_h37 @n 222b/!text34 @n 192-2,3-2,6-2,3,16-2,3-1,4utext66 @n 201,34-1,7,5,2-2,7d +tempinfo31 @n 160,33,31,4,9,8,5,6,13,4,9,4,4,4,4,3ags tempdate71 @n 62,16,19oca tel52 @n 80-1,2r. te26 @n 72V te27 @n 53,19-1,2,12te30 @n 52,13,3,4,10-2,7 te29 @n 87,5,4agete28 @n 53,12,3,2,8ta te31 @n 109te33 @n 56,9,6,4,11  te38 @n 65-2.te41 @n 50,20-1,3,34,33,3,7 te43 @n 61-2ate49 @n 102,2-1,6,55-2,5e te52 @n 87,2,5sr/ te58 @n 78,3,4/lote68 @n 75,24-1ag te74 @n 134-2 te83 @n 59:.te85 @n 43,21,2,4,16,27ntte84 @n 50,21-1,4,33,9gtate69 @n 96,5,3,4ete62 @n 144-1,3_pte53 @n 28,16-1,4@te51 @n 62,13,2,2,8,17,9,4,40,16,4,11,31,17,13,14,16,4,39,18,4,35 te48 @n 88,2,4/gtte46 @n 74,15-1,12,18te42 @n 67-1,10,12,2,13l/te39 @n 92,38-2  te36 @n 56te32 @n 53,13,2,2,7ge tdwaterhouse_get_currency64 @n 124 tdwaterhouse_create_symbol64 @n 111 tdwaterhouse64 @n 49,2t tdefunds_get_currency63 @n 125er. tdefunds_create_symbol63 @n 111 ,T<$|`D,|`H( pT<$xX< lT<$pX<8,ppX4HdH(tX8 |`@$`@( |`D( pTts85 @n 43,43-2,25-2,7-1uundef86 @n 236ua47 @n 58,4,4336undef86 @n 236,27,9,37,337,23uc86 @n 243-1,522ua86 @n 248,3,361,3,2,3-1,2,2 url82 @n 64,7-1 ua82 @n 67,5 ts82 @n 64url77 @n 174-1,2, undef77 @n 32427, ua77 @n 161,1627, usdate67 @n 81؀Xusage14 @n 9/ usa81 @n 47,11Boourlt65 @n 878,5,28,10,12eurlc65 @n 878,4,16,11,11,7s-p url26 @n 72,4,6al url28 @n 53,3,4la url27 @n 53,3-1me url32 @n 53,4,4r/url31 @n 109,3,4r url30 @n 52,4,3/g url36 @n 56,4,6arurl50 @n 52,4,2,34q/url49 @n 95-1,63-1par url48 @n 74,2url46 @n 66,10,8 url42 @n 56,2url41 @n 59,2,70,2sr/url33 @n 56,7-1,27ags url67 @n 62,3,2/ url83 @n 59,8-1gs url73 @n 91,4 url70 @n 90-1,3paurl68 @n 67,23,4/ url64 @n 91,2,2ts url63 @n 91,2,2alurl62 @n 78-1,16,2Cf url61 @n 14,19gme url60 @n 14,19r/l url59 @n 54,2,2rs url56 @n 121,3ocaurl53 @n 28,4-1,2 url51 @n 62,5,2li url85 @n 51,3 url84 @n 58,3 uri_escape56 @n 83,40 unshift56 @n 41,2 unless13 @n 42.la unless16 @n 15al/univ66 @n 130,8-1 unittype68 @n 67,11,5-1ca unionurl71 @n 71. unionfunds71 @n 43-1pundef26 @n 130-1,2/py undef41 @n 172-2lundef36 @n 104-1,2r.l undef66 @n 226pyg ukfunds34 @n 58,6 ukfunds55 @n 52,6 ukfunds45 @n 73,6 ukfunds66 @n 58,6 uk_unit_trusts68 @n 50,6rucname66 @n 201,14-1,36,7 uc36 @n 98oca uc66 @n 251ca uc48 @n 104aruc69 @n 121-1,4,2 ua26 @n 79,5p ua27 @n 54,3d ua29 @n 73,5Q ua28 @n 54,6pua34 @n 78,2,25,59al/ ua33 @n 56,2,6.la ua32 @n 55,6/ ua31 @n 110,9 ua30 @n 55,4g ua44 @n 83,2a ua43 @n 51,4-1ags ua42 @n 45,13ua41 @n 55-1,5,72ua40 @n 62,10-1ca ua39 @n 89,36 ua38 @n 54,4 ua37 @n 218-1 ua36 @n 63,5i ua35 @n 70,8-1ygm ua55 @n 72,2y ua64 @n 91,3-1rse ua72 @n 42-2a ua71 @n 61,10 ua69 @n 96,2-1ygmua68 @n 67,26-1oc ua67 @n 62,4-1serua66 @n 78,2,25,76agsua65 @n 878,47,2,6/lo ua63 @n 91,3-1b/gua62 @n 71,8,18L ua61 @n 26,3,4ent ua60 @n 26,3,4/li ua59 @n 54,3-1aI ua58 @n 66,2s ua57 @n 58,11ua54 @n 46,4,18/l ua53 @n 28,6-1ars ua52 @n 67,2o ua51 @n 63,6p ua50 @n 52,2,4libua49 @n 88,8,56,8 ua48 @n 73,3pua46 @n 66,13,4-1ua45 @n 93,2,27,23ib/ ua73 @n 50,45 ua83 @n 62-1,5ts- ua85 @n 48,6- ua84 @n 55,6u ua74 @n 86,24 type39 @n 93,97r/ tsx70 @n 57-1,6ar tsp69 @n 76,5 ts31 @n 109lo ts33 @n 56/usts32 @n 53,24,2-pts42 @n 78-1,26-1ts41 @n 50,58-2,41-2sts39 @n 92,40,14s ts38 @n 67,6n ts56 @n 153-2ts69 @n 96,12,2-1ts68 @n 67,33,2,3,15 ts62 @n 148,2 ts52 @n 83-1gXts51 @n 62,42-1,8-1,3-2,38-2,14-1,3-2,9-2,29-2,15-1,12-2,12-2,14-1,3-2,37-2,16-1,3-2,33-2ts49 @n 111-1,61-2,3-1,3gts46 @n 66,36-1,6,11-1sr/<tX 8< lL, lL, lL, lL, lL, |lL, xp\4t\D,lT<$ |dL4Xth\D,`l,  \ @ x LPd$d(HD0pP04H<p|\< 4 t ` H ,  l D ( 8  x X dH|$tT@n: for ( @@$row[0] ) {ASSIGN31 @n 232 @n: for ($key) { @markets56 @@markets 30 my @@markets =@labels56 @@labels 32 my @@labels =p@YH_FIELD_ENCODING79 @@YH_FIELD_ENCODING 56 our @@YH_FIELD_ENCODING = qw/s n l1 c1 p2 v b a p o m w e r d y j1 a2 c4 t1 d1 q r1/;b@YH_EUROPE_FIELDS79 @@YH_EUROPE_FIELDS 53 our @@YH_EUROPE_FIELDS = qw/symbol name last net p_change volume bid askI@LABELS70 @@LABELS 52 my @@LABELS = qw(name last net p_change volume exchange);F@ISA/44 @@ISA/ 41 use vars qw/$FOOL_URL @@FIELDS $MAX_REQU wantarray47 @n 121,2,55want47 @n 198,4,3 user_agent47 @n 58year_specified86 @n 707,16,6,8,7,7,6'year86 @n 707,12,2,6-1,2,5-1,6-1,5-2,7,2-1o_j x86 @n 824 warn86 @n 305 wantarray86 @n 217,377 vars86 @n 41 value86 @n 506-1 valid_params86 @n 300,4val286 @n 350,2-1,3_jval186 @n 350,3,3 user_agent86 @n 248n usdate86 @n 734-1 yahoo_json82 @n 47,8 wantarray82 @n 165 vars82 @n 30 user_agent82 @n 678 year_low77 @n 273-2 year_high77 @n 273 wantarray77 @n 327yea vars77 @n 40 user_agent77 @n 161 usdate77 @n 22770 za_unittrusts85 @n 29 za84 @n 37INGzA66 @n 169,67,7 zA55 @n 11586 yield_funds81 @n 75,21SA  yet56 @n 196,2POR year_low42 @n 48,84,15 @n year_high42 @n 48,83,16EB year84 @n 137,3e  year74 @n 149year54 @n 46,10,4,14,25,2year31 @n 272,2,2 year26 @n 144 yahoo_yql83 @n 44,72  yahoo_request81 @n 114 yahoo_request80 @n 61 yahoo_request79 @n 80 yahoo_request78 @n 61 yahoo_request76 @n 64 yahoo_request75 @n 64 yahoo_nz80 @n 43,5@n; yahoo_fidelity81 @n 52() yahoo_europe79 @n 58,5 yahoo_brasil78 @n 44-1,6 yahoo_australia76 @n 44-1,6 ( yahoo_asia75 @n 47,55yahoo81 @n 46-5,8,33t x31 @n 101-26wpkurs74 @n 122,2,6,5 wpfacts_vals74 @n 139-1,34'..wpfacts74 @n 126,2,11wkn39 @n 93,86,5i will56 @n 244 whrgtext74 @n 166-2ARwhrg74 @n 163,2-1 which56 @n 245ch( where56 @n 248%webdoc66 @n 105-1,5,6-1,4,5,54-1,5,4-1,4,6renwebdoc55 @n 99-1,14,32-1,12cu0webdoc45 @n 122-1,5,4-1,8,4-1,5,4-1,11,16,19,33,38,22!webdoc34 @n 105-1,5,6-1,5,41-1,5,4-1,6TSP warn29 @n 159 wantarray85 @n 129res wantarray84 @n 174 wantarray83 @n 143= ' wantarray81 @n 103,17 wantarray80 @n 68 wantarray79 @n 87 wantarray78 @n 68 wantarray76 @n 71 wantarray75 @n 71 wantarray74 @n 213nce wantarray73 @n 164ket wantarray71 @n 123e " wantarray70 @n 115 wantarray69 @n 148my wantarray68 @n 171RGV wantarray67 @n 91 wantarray66 @n 349, $ wantarray65 @n 992e, wantarray64 @n 13126 wantarray63 @n 132TEM wantarray62 @n 202D_U wantarray61 @n 65 wantarray60 @n 65 wantarray59 @n 64,30 wantarray58 @n 75,15,44RL wantarray57 @n 116L_T wantarray56 @n 170 wantarray55 @n 242n = wantarray54 @n 124 wantarray53 @n 41,40= wantarray52 @n 77,22,6638 wantarray51 @n 407o.c wantarray50 @n 66,43 wantarray49 @n 80,64,44se wantarray48 @n 83,16,57RR wantarray46 @n 152OO_ wantarray45 @n 319 qw wantarray44 @n 114ALI wantarray43 @n 83 wantarray42 @n 155URL wantarray41 @n 193 wantarray40 @n 103= U wantarray39 @n 137,3,19,79sx/ wantarray38 @n 89 wantarray36 @n 134 36 wantarray35 @n 129; wantarray34 @n 327@n wantarray33 @n 118$TR wantarray26 @n 164 wantarray27 @n 65,15,12,44ter wantarray29 @n 84,17,81 wantarray28 @n 107und wantarray32 @n 137six wantarray31 @n 318V wantarray30 @n 169 vwd74 @n 47,3 verify_hostname41 @n 56ru verify_hostname83 @n 63pr vars26 @n 40g vars28 @n 27a vars27 @n 31s vars31 @n 71t vars30 @n 32o vars29 @n 43p vars37 @n 21t vars44 @n 41t vars40 @n 34r vars36 @n 30g vars35 @n 39r vars34 @n 40t vars33 @n 18r vars32 @n 27a vars64 @n 30h vars66 @n 40h vars65 @n 37 vars63 @n 30 vars62 @n 35p vars59 @n 32 vars58 @n 42 vars55 @n 36h vars54 @n 28vars53 @n 6.t vars52 @n 42 vars51 @n 38 vars50 @n 10s vars48 @n 42 vars46 @n 36_ vars45 @n 54r vars76 @n 36n vars83 @n 27. vars81 @n 38 vars80 @n 35 vars79 @n 37i vars78 @n 36 vars75 @n 39 vars72 @n 32. vars69 @n 36h vars68 @n 36 vars67 @n 35 vanguard81 @n 51,11ib valuetext31 @n 191,2,29,2 values69 @n 102agvalue_currency53 @n 28,25,2-1 value37 @n 265r=I utf8_mode37 @n 227ser utf8_mode46 @n 89 utf8::59 @n 72sr/ using56 @n 249par usfedbonds73 @n 30,6l user_agent27 @n 54؀X user_agent28 @n 54׀X user_agent30 @n 55׀X user_agent29 @n 73׀X user_agent35 @n 78׀X user_agent34 @n 78׀X user_agent33 @n 58׀X user_agent32 @n 55׀X user_agent31 @n 110X user_agent41 @n 55րX user_agent48 @n 73ՀX user_agent46 @n 79ՀX user_agent45 @n 93րX user_agent44 @n 83րX user_agent43 @n 51րX user_agent42 @n 45րX user_agent40 @n 72րX user_agent39 @n 89րX user_agent38 @n 54րX user_agent49 @n 88,64 user_agent57 @n 58ȁY user_agent65 @n 925r/ user_agent74 @n 86_pa user_agent83 @n 62cal user_agent73 @n 50ags user_agent71 @n 61ser user_agent70 @n 94ygm user_agent69 @n 98otl user_agent68 @n 93ent user_agent67 @n 66\:/ user_agent66 @n 78par user_agent64 @n 94er. user_agent63 @n 94ell user_agent62 @n 71ts- user_agent61 @n 29LX user_agent60 @n 29΀Y user_agent59 @n 57Y user_agent58 @n 66Y user_agent56 @n 80,44 user_agent55 @n 72ԀX user_agent54 @n 50ԀX user_agent53 @n 34ՀX user_agent52 @n 67ՀX user_agent51 @n 63ՀX user_agent50 @n 54ՀX user_agent84 @n 55er. user_agent85 @n 48sr/ used56 @n 269 usdate27 @n 110a usdate33 @n 102 usdate42 @n 115 usdate40 @n 99ـX usdate65 @n 962 usdate64 @n 121X usdate63 @n 122 usdate46 @n 147X usdate69 @n 142 DxT0|X4|\8|`D,lL( pX@(dl`H0DtX< tX< x\@$H|`D( dD$|\<4$ |X!ASSIGN51 @n 286 @n: for ( @@$rFinanceHTTP::Request::Common84 @n 28 use @n;HTTP::Request::Common81 @n 34 use @n;HTTP::Reque UserAgent86 @n 36,574,5,2, UserAgent86 @n 36,574,5,2,6im USE_EXPERIMENTAL_UA86 @n 62,552im UserAgent82 @n 31 Time::82 @n 34 @n TableExtract82 @n 33 X77 @n 87 VI77 @n 89t8 VA77 @n 132ge V77 @n 94 UserAgent77 @n 36 US77 @n 80t8 XAL37 @n 48 XAG37 @n 168 XAF37 @n 72 WST37 @n 163 VWD74 @n 36 VUV37 @n 192 VND37 @n 194 VEF37 @n 193 UserAgent::72 @n 42 UserAgent26 @n 42,37 UserAgent28 @n 29 UserAgent27 @n 33 UserAgent31 @n 73 UserAgent30 @n 34 UserAgent29 @n 39 UserAgent39 @n 38 UserAgent37 @n 27,191 UserAgent36 @n 32,31 UserAgent35 @n 41 UserAgent34 @n 43 UserAgent33 @n 20 UserAgent32 @n 29 UserAgent56 @n 22 UserAgent57 @n 37 UserAgent55 @n 39 UserAgent53 @n 8 UserAgent52 @n 39 UserAgent51 @n 40 UserAgent50 @n 12 UserAgent49 @n 17 UserAgent48 @n 39 UserAgent46 @n 38 UserAgent45 @n 56 UserAgent44 @n 38 UserAgent42 @n 16 UserAgent41 @n 17 UserAgent40 @n 36 UserAgent66 @n 43 UserAgent74 @n 40 UserAgent85 @n 20 UserAgent84 @n 27 UserAgent81 @n 35 UserAgent80 @n 32 UserAgent79 @n 34 UserAgent78 @n 33 UserAgent76 @n 33 UserAgent75 @n 36 UserAgent73 @n 20 UserAgent72 @n 25,4 UserAgent71 @n 38 UserAgent70 @n 39 UserAgent69 @n 38 UserAgent68 @n 38 UserAgent67 @n 37 UserAgent65 @n 40 UserAgent64 @n 32 UserAgent63 @n 32 UserAgent62 @n 37 UserAgent59 @n 34 UserAgent58 @n 39Useful16 @n 9 Union71 @n 34 UYU37 @n 191 UTC56 @n 271 USFedBonds73 @n 15USD14 @n 9 USD37 @n 187 USAGE13 @n 10 USA81 @n 30 US14 @n 10 US56 @n 239 URI::56 @n 24 URI::70 @n 42 URI70 @n 47 UGX37 @n 189 UAH37 @n 190 Trustnet68 @n 31 Troweprice67 @n 30 TreeBuilder31 @n 75,53 TreeBuilder74 @n 42,72 Trades56 @n 249 TokeParser34 @n 46,77,58 TokeParser45 @n 59 TokeParser66 @n 46,81,75 Time::83 @n 30 Tiaacref65 @n 30This14 @n 6This15 @n 6 This56 @n 189 These56 @n 244 The13 @n 17 The56 @n 189,13 Telstra15 @n 72 Tdwaterhouse64 @n 25 Tdefunds63 @n 25Takes16 @n 8 TableExtract26 @n 44 TableExtract27 @n 35,37 TableExtract29 @n 40,47 TableExtract28 @n 31,34 TableExtract36 @n 34 TableExtract33 @n 22,43Us TableExtract32 @n 31,35 TableExtract30 @n 36,29 TableExtract49 @n 19,84,63 TableExtract48 @n 40,48e. TableExtract46 @n 40,34 @ TableExtract43 @n 21,40Ag TableExtract42 @n 18,49,23:Us TableExtract41 @n 19,51 TableExtract39 @n 40,90nc TableExtract38 @n 21,44se TableExtract50 @n 15P TableExtract70 @n 40,91 @ TableExtract85 @n 22,42 TableExtract84 @n 29,42 TableExtract83 @n 29 TableExtract74 @n 43,91 TableExtract73 @n 22L`<|H pHl$dhLP8 XtX88lPP4pP4lP4lL,|`D l|,`D4(`@$L localtime47 @n 199 lc47 @n 103json47 @n 110,2-2 localtime86 @n 719 local86 @n 259,12 length86 @n 817tilc86 @n 560,194tilabels86 @n 120,19,386-1c labelhash86 @n 120,19known_currencies86 @n 312,5,3,5,11lockeys86 @n 136,81,86,13,4,15ti key86 @n 303-1lti jun86 @n 708c jul86 @n 709 join86 @n 478 localtime82 @n 145 length82 @n 1358 labels82 @n 51,4i json_volume82 @n 113,20ti json_utctime82 @n 121,13,12@n json_type82 @n 118,13 json_timestamp82 @n 115,30 json_symbol82 @n 110 json_response_type82 @n 105json_resources82 @n 104,2,5-1,2,2-2,2,2,2 json_price82 @n 119,13 @n json_name82 @n 117,13 json_data_count82 @n 95,2 json_data82 @n 90,5,9json_currency82 @n 123,12-1 length77 @n 190,11 keys77 @n 315key77 @n 315,6-3 join77 @n 165,9logging74 @n 92-1,14,35,40,16,12 localtime73 @n 65 localtime65 @n 888,5 localtime84 @n 138 local79 @n 76-1 lmarket56 @n 39,12live_currencies37 @n 236,19,37,23 line26 @n 107,2 line59 @n 67-1,3 line36 @n 86-1line65 @n 875,72-18,2-3,2-1 lerevenu51 @n 49-1,5 length39 @n 202 length65 @n 939 length56 @n 74 length73 @n 147lc37 @n 250,2,10,14,11lc56 @n 39,12,116last31 @n 236,4-1,14,4-1last56 @n 141-1,4-1,5-1last39 @n 92,81,36,3,8-1 labels26 @n 57,3 labels27 @n 43 labels30 @n 159 labels29 @n 52,4 labels28 @n 42,3-1 labels35 @n 56,2-1 labels34 @n 61,3 labels33 @n 36,3 labels32 @n 42,3-1 labels31 @n 89,4-2 labels45 @n 76,3 labels53 @n 18 labels52 @n 52 labels51 @n 52,3 labels50 @n 33,2 labels48 @n 53,4-1 labels46 @n 52,3 labels44 @n 65 labels42 @n 31-2 labels41 @n 40-1 labels40 @n 47,4 labels36 @n 44labels56 @n 32,20-1 labels69 @n 79 labels85 @n 33,2 labels84 @n 41,2 labels83 @n 47,4 labels81 @n 55,3-5 labels80 @n 46 labels79 @n 61 labels78 @n 48,3 labels76 @n 48,3 labels75 @n 50 labels73 @n 35-1 labels68 @n 53,3 labels67 @n 51,3 labels66 @n 61,3 labels62 @n 53,2 labels59 @n 44 labels58 @n 51 labels57 @n 44,2 labels55 @n 55,3label29 @n 120,2,3-1,21-2 label48 @n 140-1label58 @n 115-1,2-1 kurs74 @n 158-2 known_currencies37 @n 36 known:56 @n 190keytext31 @n 190,3,28,3 keys31 @n 228 keys39 @n 231 keys46 @n 142 keys42 @n 141 keys71 @n 105 keys65 @n 985 keys57 @n 98&key31 @n 228,4,5,8,5,6,7,6,4,9,4,4,4,4,3 key69 @n 114-1 k15 @n 25 k35 @n 70 k65 @n 985-3 k40 @n 62 json_volume83 @n 102,13json_timestamp83 @n 103,14-1 json_symbol83 @n 101 json_resources83 @n 100-7 json_price83 @n 105,9 json_name83 @n 104,8 json_exchange83 @n 107,3 json_data_count83 @n 89,2 json_data83 @n 85,4,11 json_currency83 @n 106,10 join28 @n 60njoin30 @n 59,24,2 join29 @n 78 join39 @n 212 join32 @n 61tX< 4hx\<d@ tT4|\@(tXlP(PhL4pT4tP8|\D,hP0x`@|`@( $s47 @n 76-4,2,3,3,4,26,70-24 response47 @n 105,2-1,124 require47 @n 304 seen86 @n 133-1 scale_field86 @n 452 scale86 @n 471,5 scalar86 @n 316,19 returnhash86 @n 573,6,4,3,8 6returned_currencies86 @n 315,2,19,4retTime86 @n 767,6,3 required86 @n 541-3 require86 @n 31 row82 @n 64 require82 @n 26 scale_field77 @n 268sedol66 @n 168,3,2,77,3 second_row69 @n 96,15,30 seb_funds59 @n 41,5 searchfor46 @n 84 scan72 @n 83sDate57 @n 59,19,12 s35 @n 114-3 s39 @n 248-2s62 @n 185-1,10 s58 @n 107 s52 @n 121s49 @n 192-4,8-4rows27 @n 86-1,13 rows29 @n 95-1,9rows28 @n 77-1,11-7,2 rows32 @n 79rows31 @n 182-2,25-2rows30 @n 84,8,2,6,16-12,2-2,4rows48 @n 93-1,13 rows46 @n 121 rows42 @n 106rows41 @n 51,59,2,4-1,5-7,24-3,9 rows39 @n 146 rows38 @n 73rows33 @n 56,30-1,8rows84 @n 51,60-1,11,6,19,5,5,5,4rows85 @n 44,44-1,26-1,7,2 rows70 @n 138 rows68 @n 105,15 rows62 @n 150 rows58 @n 84-1,9 rows53 @n 50rows52 @n 93-1,12,4-2,4,3`rows51 @n 86-1,18-1,8-1,3-1,39-1,15-1,3-1,10-1,30-1,16-2,4,3-1,3-1,13-1,15-1,3-1,38-1,17-1,3-1,34-1 rows49 @n 112 rowhd33 @n 56 row_data26 @n 109,2,2 row_data36 @n 87,2,2 row252 @n 112-2 row152 @n 111,2row26 @n 73,38,11,6-1,3,2-2,3row27 @n 100-1,6,3-2,2,2row31 @n 109,75-1,4,22-1 row30 @n 79,5-1row29 @n 105-1,16 row41 @n 50row39 @n 92,54-1 row38 @n 73-5row36 @n 57,32,9,3-2,3,2-5row33 @n 56,39-5,2,6row32 @n 53,26-1row69 @n 96,14-1,28,3row70 @n 138,10,7-1,2,4row68 @n 68,37,2-1,6,6-1,3row62 @n 150,2-1row58 @n 94-1,21row53 @n 28,22-3,11row52 @n 119-1,27-2row51 @n 62,57-1,2-1,8,4,4,4,4,4,8-1,3,16-2,9-1,2,4,4,4,4,4,8-1,3,26-1,3,10-1,3,16-1,2-1,8,4,4,4,4,4,7-1,3,18-1,2-1,8,4,4,4,4,7-1,3 row49 @n 112-1row48 @n 107,2,11,3,4-3,2,4row46 @n 67,42-1,11,3-1,3-3$row42 @n 79-2,25,3-1,3,3-2,2-3,3-1,2-3 row85 @n 43 row84 @n 50 row83 @n 59 romania32 @n 38,6 retrieved56 @n 245result56 @n 37,3,2,3,4,3-1,2 response29 @n 78-1,13 response38 @n 58,3,5 response41 @n 61,3,7,62,3,5,25 response39 @n 125,2-1,8 response48 @n 76,2,12 response44 @n 85-1,3 response43 @n 56,2,4 response42 @n 58,2,8,24 response73 @n 80,15,2,2 response84 @n 61,4,7 response74 @n 110-2,85,4 response77 @n 177-1,5 response71 @n 71-1,3,7 response70 @n 94-1,9 response58 @n 68,2,11 response57 @n 69-1,3 response54 @n 46,22,14-1,10,15-1 response52 @n 69,3,9,8 response49 @n 96-1,7,56-1,6 response85 @n 54,4,8 require26 @n 34 require28 @n 21 require27 @n 25 require31 @n 65 require30 @n 26 require29 @n 32 require39 @n 35-1 require38 @n 23 require36 @n 24 require35 @n 36 require34 @n 30 require33 @n 14 require32 @n 21 require56 @n 26 require55 @n 30 hL08lP4lP$lP4\Dd< | `8dH$`<|X8 lH d$XLT&9::::::::4:4:V:V:x:x:::::@:@:@:@:@:@:@:@:@:@:@:@:A:A:A:A: A: A:0A:0A:@A:@A:PA:PA:`A:`A:pA:pA:A:A:A:A:A:A:A:A:A:A:A:A:A:A:A:A:B:B:B:B: B: B:0B:0B:@B:@B:PB:PB:`B:`B:pB:pB:B:B:B:B:B:B:B:B:B:B:B:B:B:B:B:B:C:C:C:C: C: C:0C:0C:@C:@C:PC:PC:`C:`C:pC:pC:C:C:C:C:C:C:C:C:C:C:C:C:C:C:C:C:D:D:D:D: D: D:0D:0D:@D:@D:PD:PD:`D:`D:pD:pD:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:E:E:E:E: E: E:0E:0E:@E:@E:PE:PE:`E:`E:pE:pE:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:F:F:F:F: F: F:0F:0F:@F:@F:PF:PF:`F:`F:pF:pF:F:F:F:F:F:F:F:F:F:F:F:F:F:F:F:F:G:G:G:G: G: G:0G:0G:@G:@G:PG:PG:`G:`G:pG:pG:G:G:G:G:G:G:G:G:G:G:G:G:G:G:G:G:J:J:    p-9 from_json47 @n 110 function86 @n 138 funcref86 @n 576,3from86 @n 235-1,2,6,2,23field86 @n 449-1,2,19-113 feb86 @n 708failed_stocks86 @n 578,4,8-1exists86 @n 77,227,19,6,98,117,19exchange_rate86 @n 252,2,9,3,6,2,3 eval86 @n 78,35 eurodate86 @n 741-1 exists82 @n 139 eurodate82 @n 151 &fundquote33 @n 55,22-1,6,4-4,4-4,2,3,3,3-1,6-1{F Kfundquote45 @n 91,19-1,4-1,10-1,9,13-1,9,3,13,4,11-1,21,8,24-1,15-5,19,6,14,2,5,3,5su Ffundquote34 @n 76,19-1,4-1,8-1,4-1,30,4,4-1,14-1,86,5,7,2,5,6-1,7-1,21-4,7,2,4 Ifundquote66 @n 76,19-1,4-1,8-1,4-1,38,4,4-1,23-1,76,14,5,8,2,5,6-1,7-1,21-4,7,2,4 >fundquote62 @n 69,13-1,5-1,10-1,4-1,6,30,21-1,3-2,4-1,3,15-1,3-1,3,3-1 Ffundquote55 @n 70,19-1,4-1,8-1,4-1,17,4,4-1,15-1,22,5,6,2,5,5-1,6-1,21-4,7,2,4 fundquote50 @n 51,12-1,2,23-4,4-5,2-1,4 fundlibrary33 @n 32-1,6ub fundlabels49 @n 42,6-17 @ fundhash39 @n 90,30,105,6-1te fundhash71 @n 62,5,20,2,16,21fund27 @n 53,7,2-1,13-2,10-2,8,3,3-6,2,3,2,2,2-2,9-1 fund65 @n 905-2,2,2,3,2-1 fund39 @n 119-1,15,48-1,19,13-9,6-347/fund74 @n 98-3,5,26,16,2,5-1,4,8,3,4,3-1,5-5,7-1,2n {fund71 @n 65,2,38,2,2-1,6,2-1 ftportfolios_direct46 @n 49,6 ftportfolios46 @n 49,5_cu ftfunds_fund45 @n 72-1 ftfunds45 @n 72,6from56 @n 177,12,130  france31 @n 83,10 france51 @n 49,5m found26 @n 117CH found36 @n 95found27 @n 99,30,3-1>found49 @n 110,6,5,8-10@n fool44 @n 55,12{ following56 @n 189,13fmyear54 @n 47,13,11@fmmonth54 @n 47,14,11fmday54 @n 47,15,11 first_table_found32 @n 77 first_table_found43 @n 63 first_table_found41 @n 74,70 first_table_found74 @n 136 first_table_found69 @n 108 first_table_found49 @n 105,63 first_table_found85 @n 70 first_table_found84 @n 76 find74 @n 130-1 finanzpartner43 @n 27-1 financecanada42 @n 25-1,7 finance_quote_headers72 @n 43,7 fileyear73 @n 86,5,62 filename26 @n 90-1 filename36 @n 75-1 filemonth73 @n 87,4,55-2,2-1 field77 @n 265-3 fidelityfixed41 @n 35,6x fidelity_direct40 @n 44,7 fidelity40 @n 43-1,6 fidelity81 @n 52,11 fetching56 @n 269 fetches56 @n 189b fetch_live_currencies37 @n 37 fetch56 @n 184-16 failover56 @n 243f15 @n 38,12,12,13,9 f73 @n 64-1re extract_stock_data70 @n 104 exists37 @n 252eq exists56 @n 66qw( exists69 @n 131e  exists65 @n 958ST exists57 @n 81est exists71 @n 87 38 exists70 @n 110w/ exchanges56 @n 244qw( exchange31 @n 263-1,2 exchange39 @n 93,73,50par exchange77 @n 187,72-1,4,7,24-18 eval56 @n 92,40{ europe28 @n 40,6 europe31 @n 85,10 europe79 @n 58,5n europe32 @n 40,6 eurodate28 @n 981 eurodate32 @n 128 eurodate31 @n 247,31s eurodate34 @n 274 eurodate43 @n 74e eurodate39 @n 218 eurodate38 @n 77r eurodate35 @n 108 eurodate66 @n 296 eurodate61 @n 50 eurodate60 @n 50e eurodate58 @n 124 eurodate55 @n 191 eurodate52 @n 148 eurodate51 @n 131,62,53,51,61 eurodate50 @n 101 eurodate45 @n 311 eurodate83 @n 129 eurodate85 @n 125tX<$|`D( dH,hL0hH(H$pX@ h@$hP8lP4xtX<\$4 `<h<l T, yahoo_json82 @n 60 sub @n {strict82 @n 28 use @n;yahoo_request77 @n 150 sub @n {strict77 @n 35 use @n; user_agent86 @n 607 sub @n {timeout86 @n 488 sub @n {strict86 @n 33 use @n; @n store_date86 @n 700 sub @nsources86 @n 216 s Common47 @n 3286 FQ_LOAD_QUOTELET86 @n 165-1TF FAILOVER86 @n 189,318-1,81LOO Exporter86 @n 34O EXPORT_TAGS86 @n 58LD EXPORT_OK86 @n 56,2LD EXPORT86 @n 55LOO ENV86 @n 165-1LOO Currencies::86 @n 312 Common86 @n 3714FTFUNDS_LOOK_LD45 @n 65,57,14 FRTXX81 @n 78 FP26 @n 96gs. FP36 @n 81/li FOOL_URL44 @n 45,40/l FKP37 @n 93nt FJD37 @n 94er FINANZPARTNER_URL43 @n 25,31- FINANCECANADA_URL42 @n 22,34l FINANCECANADA_MAINURL42 @n 21,32r FIELD_ENCODING79 @n 77ube FIELD_ENCODING77 @n 63,102OADFIELDS44 @n 53,18,32,2:gt FIELDS79 @n 76-ctFIELDS77 @n 59,12,126,10 FIDELITY_URL241 @n 32,99i FIDELITY_URL40 @n 41,32xu FIDELITY_URL41 @n 31,28_pFIDELITY_MAINURL41 @n 30-2,73 FGRXX81 @n 82 FGMXX81 @n 77 FDTXX81 @n 76 FDRXX81 @n 75 FDLXX81 @n 81 F77 @n 103 Example13 @n 16exExample14 @n 9 European56 @n 250 Europe79 @n 29tag Euro56 @n 217 Escape56 @n 24loc Encode::37 @n 228 Encode::65 @n 940 EXPORT_OK37 @n 23 EXPORT_OK54 @n 30 EXPORT_OK77 @n 45 EXPORT77 @n 44OAD EUR37 @n 92s_ ETB37 @n 91al ERN37 @n 89ta EQUINOX_URL85 @n 25,26calEQUINOX_MAINURL85 @n 24,2,57a EQUINOX85 @n 35ta ENV50 @n 26ex ENV77 @n 176D ENV72 @n 97,2 EGP37 @n 87/e EEK37 @n 90ag ECS37 @n 86ca Dumper16 @n 5,20. Dumper45 @n 134,23a:  Dumper34 @n 119,57oca Dollars14 @n 10srDollar56 @n 207,2,12,6,8,4:gt Demonstrates13 @n 16 Demo15 @n 81 Deka38 @n 18 DateTime54 @n 55Data16 @n 5-2 Danish56 @n 215,3 DZD37 @n 47ns DWS_URL39 @n 124-17 @ DWS39 @n 34 k DOP37 @n 84ur DKK37 @n 82ns DJF37 @n 83ge DESCRIPTION56 @n 187 DEKA_URL38 @n 26,32 75DEBUG34 @n 117-2,19-1,35-2,14,3,5,8-1,6-1,13,5,18,12,15,8DEBUG45 @n 132-2,10,11-2,GDEBUG66 @n 117-1,2-3,12,4,7-1,26,18-1,2-3,10,3,3,3,5,4,5,11,5,4,2,30,2,15,8li DE77 @n 108AD DATE13 @n 273 D77 @n 102OAD Currencies37 @n 16n 7 Cookies34 @n 45,34 77 Cookies45 @n 58,36137 Cookies66 @n 45,34122 Cookies55 @n 41,32 77 Converts14 @n 107 Common26 @n 43 Common28 @n 30 Common27 @n 34 Common32 @n 30 Common31 @n 74 Common30 @n 35 Common29 @n 38 Common41 @n 1863- Common44 @n 37 @n Common42 @n 17qui Common40 @n 37 Common39 @n 39 Common37 @n 26 Common36 @n 33 Common35 @n 42 Common34 @n 44 Common33 @n 21 Common48 @n 38,3  Common57 @n 38t_c Common65 @n 41 77 Common68 @n 39 @n Common67 @n 38 12 Common66 @n 449 P Common64 @n 337 @ Common63 @n 33n 9 Common62 @n 3838  Common61 @n 10W 7 Common60 @n 1077  Common59 @n 35ess Common58 @n 38n 3 Common56 @n 20sym Common55 @n 40 @nCommon53 @n 9 Common52 @n 38est Common51 @n 415 s Common50 @n 137 @ Common49 @n 187 @ Common46 @n 39,3, Common45 @n 57n 2 Common69 @n 3977 hD `<Dd4plH$xX8tT(hHD(xX8pP,`D$lL, lP4p<copyright5o4./debian/controlo./debian/control4o3./debian/changelogo./debian/changelog3o 2./Changeso ./Changes2o1./ChangeLog.1o./ChangeLog.11o  __1_2bbZ0pb1 symbol86 @n 704,26 table_silver47 @n 64,49,39-1table_platinum47 @n 65,49,56-1 table_gold47 @n 64,48,26-1symbols47 @n 55-1,20,42-1,65,4 symbolhash47 @n 631symbol86 @n 704,26,29-1 tdefunds63 @n 49,2tagname37 @n 248,2,12,12,2,112tag34 @n 126,2,2,2,52,2,2,2-1,2,3,2,6,2,2,17,2,3,2-1%tag66 @n 130-1,2,2-1,4,65,2-1,2-1,2,4,2 tables27 @n 75 tables29 @n 96 tables28 @n 70 tables33 @n 75 tables32 @n 70 tables30 @n 72,10 tables70 @n 134 tables53 @n 49 tables51 @n 79 tables49 @n 111 table_states30 @n 91 table_states38 @n 67 table_states42 @n 78,27 table_states68 @n 100 table_states62 @n 148 table_states52 @n 83 table_state39 @n 132 table_state41 @n 108,43 table_state85 @n 86,27 table_state84 @n 109,9 5table_state51 @n 104,9,4,40,16,4,11,31,17,13,14,16,4,39,18,4,35 table_coords30 @n 83 table30 @n 79,3-2table43 @n 63,2,3-1 table49 @n 173 table46 @n 102,18 table74 @n 136,22table70 @n 134-1,3table53 @n 28,21-1 t39 @n 188,2symbols26 @n 69-1,45,39 symbols30 @n 49-1,8 symbols34 @n 72,2,8 symbols33 @n 47,5,8 symbols40 @n 60-1,7 symbols39 @n 244,4symbols36 @n 53-1,39,31symbols35 @n 68-1,6,39,9 symbols45 @n 87,2,8 symbols55 @n 66,2,8 symbols54 @n 42,23symbols53 @n 25,2,3,7,37symbols50 @n 43,5,14,26symbols49 @n 60,3,22,5,59,5symbols77 @n 167,5,2-symbols46 @n 63,2,6,2 symbols42 @n 40,3,4 symbols41 @n 48,5,5symbols56 @n 62,3,124symbols69 @n 87,5,26symbols80 @n 54-1,6,2 symbols85 @n 41,5,4 symbols84 @n 48,5,4symbols81 @n 86-1,5,2,16-1,3,2symbols79 @n 71-1,8,2symbols78 @n 57-1,3,2symbols76 @n 57-1,6,2symbols75 @n 60-1,3,2 symbols73 @n 43,5,4symbols70 @n 78-1,5,3,22symbols68 @n 64,2,6,2 symbols66 @n 72,2,8 symbols62 @n 63,4,6 symbols61 @n 24-1,3 symbols60 @n 24-1,3symbols59 @n 51,2,7,13,14symbols57 @n 55-1,7,46 symbolline31 @n 131,2,6 symbolhash35 @n 74-1,14-1 symbolhash40 @n 67-1,14 symbolhash46 @n 70-1 symbolhash68 @n 71-1 symbolhash57 @n 60,5,16,2,15,2 symbol350 @n 77,5-1 symbol250 @n 77,2-1 symbol150 @n 77-1symbol26 @n 115,7,4-10,8,3-1,6-1,2-1 symbol31 @n 139-2Asymbol30 @n 58-1,14-1,21-1,7,3,3-1,2-2,2-8,2-2,4,6-1,4-1,4-1,3,2,6,4-1symbol44 @n 96,3-1,5,2-1,27symbol42 @n 47,3-3,3,5,19,3-1,31-3,2-4,2-1,2-1,4,5-1,4-1,3,3Bsymbol41 @n 58-1,6-1,10-1,26-2,16-7,3,6-1,8-1,8,2-2,6,2-2,3-4,2,2,2-2,3symbol57 @n 63,2,33,2,2-1,6,2-1:symbol56 @n 65-1,4-2,2-1,8,2,4,5,5,7,3,3,11,23,6,2-2,4-2,2-3,79symbol54 @n 65,4,31,2-5,6-1,5-1symbol53 @n 30-1,6-2,35-3symbol50 @n 62-2,24-5,2,2-5,2-1symbol36 @n 93,5-15,2,2-1,6-1,2-1Bsymbol49 @n 63-2,5-1,5-1,13-3,2,3,8,8,8,7-10,2,13-3,2,3,7,5,2-2,2-1,2,2&symbol73 @n 52,3,2-1,4,40-1,20-1,7,3-8,16-2symbol81 @n 94-3,2,17-2#symbol85 @n 50-1,8-1,13-1,5-4,6-19,8-1,88symbol84 @n 57-1,8-1,12-1,21-1,2-2,6,3,28,5-2,3-2,3-2,3-1,3-1 symbol80 @n 63-3Finance-Quote-1.38/GTAGS000644 000765 000024 00000240000 12566055631 014432 0ustar00ecstaff000000 000000 b1 $dpd dtD< H|T0t$|8@\\$t(L\$0\ L \ ( X l 4  <hT$X$h P`,d0!ASSIGN51 @n 252 @n: for ( @@$row[0] ){!ASSIGN51 @n 222 @n: for ( @@$row[0] ){!ASSIGN51 @n 191 @n: for ( @@$row[0] ){!ASSIGN51 @n 160 @n: for ( @@$row[0] ){"ASSIGN51 @n 120 @n: for ( @@$row[0] ) {ASSIGN31 @n 232 @n: for ($key) { @markets56 @@markets 30 my @@markets =@labels56 @@labels 32 my @@labels =p@YH_FIELD_ENCODING79 @@YH_FIELD_ENCODING 56 our @@YH_FIELD_ENCODING = qw/s n l1 c1 p2 v b a p o m w e r d y j1 a2 c4 t1 d1 q r1/;b@YH_EUROPE_FIELDS79 @@YH_EUROPE_FIELDS 53 our @@YH_EUROPE_FIELDS = qw/symbol name last net p_change volume bid askI@LABELS70 @@LABELS 52 my @@LABELS = qw(name last net p_change volume exchange);F@ISA/44 @@ISA/ 41 use vars qw/$FOOL_URL @@FIELDS $MAX_REQUEST_SIZE @@ISA/;K@ISA77 @@ISA 40 use vars qw/ @@FIELDS @@FIELD_ENCODING $MAX_REQUEST_SIZE @@ISA I@EXPORT_TAGS86 @@EXPORT_TAGS 41 use vars qw/@@ISA @@EXPORT @@EXPORT_OK @@EXPORT_TAGS F@EXPORT_OK54 @@EXPORT_OK 30 our @@EXPORT_OK = qw(morningstarjp methods labels);#066 @n 37 use constant DEBUG => @n;#045 @n 51 use constant DEBUG => @n;#034 @n 37 use constant DEBUG => @n; /72 @n 32 use vars qw@n@@ISA @n;(/58 @n 42 use vars qw@n$PLATINUM_URL @n;&/52 @n 42 use vars qw@n$MANINV_URL @n;#/48 @n 42 use vars qw@n$HEX_URL @n;(/40 @n 34 use vars qw@n$FIDELITY_URL @n;)/35 @n 39 use vars qw@n$COMINVEST_URL @n;#/29 @n 43 use vars qw@n$ASX_URL @n;&)83 @n 26 use JSON qw( decode_json @n;&)82 @n 29 use JSON qw( decode_json @n;()86 @n 34 use Exporter @n;(%currencies)64 @n 44 my@n = ((%currencies)63 @n 44 my@n = ( 'Exporter'54 @n 25 use base @n; 'Exporter'37 @n 20 use base @n; '../lib'16 @n 3 use lib @n; '../lib'15 @n 8 use lib @n; '../lib'14 @n 3 use lib @n; '../lib'13 @n 3 use lib @n;$%quotes16 @n 23 my @n = $q->fetch(@@ARGV);1%quote13 @n 39 my @n = $quoter->fetch($market,@@ARGV); %options16 @n 11 my @n = ('c' => '');%currency_tags77 @n 78 my @n = ( 7%currencies37 @n 46 my @n = ( ALL => { name => qq{Albanian Lek} }C%TSP_FUND_NAMES)69 @n 36 use vars qw( $TSP_URL $TSP_MAIN_URL %TSP_FUND_COLUMNS @n;W$url61 @n 14 my @n = 'http://www.six-swiss-exchange.com/shares/security_info_en.html?id=';V$url60 @n 14 my @n = 'http://www.six-swiss-exchange.com/funds/security_info_en.html?id=';($quoter13 @n 36 my @n = Finance::Quote->new();&$q16 @n 17 my @n = Finance::Quote->new;($q15 @n 11 my @n = Finance::Quote->new();($q14 @n 14 my @n = Finance::Quote->new();;$market13 @n 37 my @n = shift || die "Usage: $0 market stocks\n";2$exchange_rate14 @n 16 my @n = $q->currency($ARGV[0],$ARGV[1]);G$close)13 @n 21 my ($name, $date, $last, $p_change, $high, $low, $volume, @n; 8$cachedir50 @n 26 my @n = $ENV{TMPDIR} // $ENV{TEMP} // '/tmp/';1$YIND_URL_TAIL)83 @n 27 use vars qw($VERSION $YIND_URL_HEAD @n;1$YIND_URL_TAIL)82 @n 30 use vars qw($VERSION $YIND_URL_HEAD @n;$YIND_URL_TAIL83 @n 40 my @n ='$YIND_URL_TAIL82 @n 39 my @n = '/quote?format=json';$YIND_URL_HEAD83 @n 37 my @n =D$YIND_URL_HEAD82 @n 38 my @n = 'http://finance.yahoo.com/webservice/v1/symbols/';$YAHOO_EUROPE_URL)79 @n 37 use vars qw( @n;%$YAHOO_CURRENCY_CONV_URL/37 @n 21 use vars qw/@@EXPORT_OK @n;$YAHOO_BRASIL_URL/78 @n 36 use vars qw/ @n;$YAHOO_AUSTRALIA_URL/76 @n 36 use vars qw/ @n;$YAHOO_ASIA_URL)75 @n 39 use vars qw( @n; U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)64 @n 30 use vars qw( @n; $TD_URL)63 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars qw( @n;$MORNINGSTAR_JP_URL)54 @n 28 use vars qw( @n; $LR_URL)51 @n 38 use vars qw( @n;@$LR_URL51 @n 46 my @n = 'http://bourse.lerevenu.com/recherchenom.hts';'$FUNDLIB_MAIN_URL)33 @n 18 use vars qw( $FUNDLIB_URL @n;,$FTPORTFOLIOS_ALL)46 @n 36 use vars qw( $FTPORTFOLIOS_URL @n;D$FTFUNDS_MAIN_URL)45 @n 54 use vars qw($VERSION $FTFUNDS_LOOK_UD $FTFUNDS_LOOK_LD @n;4$FINANZPARTNER_URL43 @n 25 my @n = "http://www.finanzpartner.de/fi/";K$FINANCECANADA_URL42 @n 22 my @n = "http://stockgroup.canada.com/sn_overview.asp?symbol=T.";1$FINANCECANADA_MAINURL42 @n 21 my @n = ("http://finance.canada.com/");G$FIDELITY_URL241 @n 32 my @n = ($FIDELITY_MAINURL."ftgw/fi/FILastTradeData?cusip=");O$FIDELITY_URL41 @n 31 my @n = ($FIDELITY_MAINURL."ftgw/fi/FIIndividualBondsSearch?cusip=");?$FIDELITY_MAINURL41 @n 30 my @n = ("https://fixedincome6800rtp.fidelity.com/"); $EQUINOX_URL85 @n 25 my @n =0$EQUINOX_MAINURL85 @n 24 my @n = ("http://www.equinox.co.za/"); l$DEKA_URL38 @n 26 my @n = "https://www.deka.de/dn/useCases/fundsearch/UCFundsSearch.shtml?ACTION_FIELD=quickSearch"; M$CSE_URL36 @n 39 my @n = "http://www.cse.lk/trade_summary_report.do?reportType=CSV";G$CITYWIRE_MAIN_URL)34 @n 40 use vars qw($VERSION $CITYWIRE_NEXT_URL $CITYWIRE_LOOK_UP @n; $Bourso_URL)31 @n 71 use vars qw( @n; D$Bourso_URL31 @n 80 my @n = 'http://www.boursorama.com/recherche/index.phtml'; X$BSE_URL49 @n 28 my @n = $BSE_MAINURL . "topmenu/kereskedesi_adatok/product_search?isinquery="; '$BSE_MAINURL49 @n 27 my @n = "http://www.bet.hu/"; $BSERO_URL)32 @n 27 use vars qw( @n; E$BSERO_URL32 @n 35 my @n = 'http://www.bvb.ro/mobile/m_SecurityDetails.aspx?'; $BMO_URL)30 @n 32 use vars qw( @n; Q$BMO_URL30 @n 41 my @n = 'http://bmonesbittburns.com/QuickQuote/QuickQuote.asp?Symbol='; $BATCH_SIZE70 @n 50 my @n = 10; 6$BAMOSZ_URL49 @n 25 my @n = $BAMOSZ_MAINURL . "alapoldal?isin=";*$BAMOSZ_MAINURL49 @n 24 my @n = "http://www.bamosz.hu/"; $ASEGR_URL)28 @n 27 use vars qw( @n; c$ASEGR_URL28 @n 35 my @n = 'http://www.ase.gr/content/en/MarketData/Stocks/Prices/Share_SearchResults.asp?';3$AMFI_MAIN_URL)50 @n 10 use vars qw( $AMFI_URL $AMFI_NAV_LIST @n; $AIAHK_URL)27 @n 31 use vars qw( @n; $AEX_URL)26 @n 40 use vars qw( @n; $AEX_URL26 @n 51 my @n = "http://www.euronext.com/search/download/trapridownloadpopup.jcsv?pricesearchresults=actif&filter=1&belongsToList=market_EURLS&mep=8626&lan=NL&resultsTitle=Amsterdam+-+Euronext&cha=1800&format=txt&formatDe sixlabelsPHTTP::Request::CommonFinance::Quote::VREASSIGN$YAHOO_ASIA_URL) _E|LtDP dtD< H|T0t$|8@\\$t(L  (),./0258;=@BCEGIKMOPT^`adwxz{}  ,.03?@ACEFGJKM`bdfgilmoq{|!,1368<=+$%qyz{PQR;45lIJK,-.bc|YZ[{\<=>sL  deBC\%&'{tuRrS567mnKDE./(5|}~[TU>?8LMNefg]^' !vw701nohEFG()*~xUVW 89:<NOH g`a^_X!"#wp123ijG@A*+$yzWPQ:;4HIJ,-  abcXYZ#<=rs3 kMdABC$%&ztQRS./lib/Finance/Quote.pm UnitTrusts.pm m U$TSX_URL70 @n 47 my @n = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');'$TRUSTNET_ALL)68 @n 36 use vars qw($TRUSTNET_URL @n;$TROWEPRICE_URL)67 @n 35 use vars qw( @n;5$TREASURY_URL73 @n 27 my @n = ($TREASURY_MAINURL."indiv/tools/");5$TREASURY_MAINURL73 @n 26 my @n = ("http://www.treasurydirect.gov/");C$TNETUK_MAIN_URL)66 @n 40 use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP @n; #$TIAA_URL65 @n 37 use vars qw( $CREF_URL @n $TD_URL)63 @n 30 use vars qw( @n; $TD_URL)64 @n 30 use vars qw( @n;A$STOCKHOUSE_MAIN_URL)62 @n 35 use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL @n;1$SHARENET_URL84 @n 34 my @n = ( $SHARENET_MAINURL . "jse/" );1$SHARENET_MAINURL84 @n 33 my @n = ("http://www.sharenet.co.za/");$SEB_FUNDS_URL)59 @n 32 use vars qw( @n;E$MSTARUK_MAIN_URL)55 @n 36 use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP @n;$MORNINGSTAR_SE_FUNDS_URL)53 @n 6 use vars qw( @n;$MORNINGSTAR_JP_URL)54 @n 28 use vars qw( @n; $LR_URL)51 @n 38 use vars qw( @n;@$LR_URL51 @n 46 my @n = 'http://bourse.lerevenu.com/recherchenom.hts';'$FUNDLIB_MAIN_URL)33 @n 18 use vars qw( $FUNDLIB_URL @n;,$FTPORTFOLIOS_ALL)46 @n 36 use vars qw( $FTPORTFOLIOS_URL @n;D$FTFUNDS_MAIN_URL)45 @n 54 use vars qw($VERSION $FTFUNDS_LOOK_UD $FTFUNDS_LOOK_LD @n;4$FINANZPARTNER_URL43 @n 25 my @n = "http://www.finanzpartner.de/fi/";K$FINANCECANADA_URL42 @n 22 my @n = "http://stockgroup.canada.com/sn_overview.asp?symbol=T.";1$FINANCECANADA_MAINURL42 @n 21 my @n = ("http://finance.canada.com/");G$FIDELITY_URL241 @n 32 my @n = ($FIDELITY_MAINURL."ftgw/fi/FILastTradeData?cusip=");O$FIDELITY_URL41 @n 31 my @n = ($FIDELITY_MAINURL."ftgw/fi/FIIndividualBondsSearch?cusip=");?$FIDELITY_MAINURL41 @n 30 my @n = ("https://fixedincome6800rtp.fidelity.com/"); $EQUINOX_URL85 @n 25 my @n =0$EQUINOX_MAINURL85 @n 24 my @n = ("http://www.equinox.co.za/"); l$DEKA_URL38 @n 26 my @n = "https://www.deka.de/dn/useCases/fundsearch/UCFundsSearch.shtml?ACTION_FIELD=quickSearch"; M$CSE_URL36 @n 39 my @n = "http://www.cse.lk/trade_summary_report.do?reportType=CSV";G$CITYWIRE_MAIN_URL)34 @n 40 use vars qw($VERSION $CITYWIRE_NEXT_URL $CITYWIRE_LOOK_UP @n; $Bourso_URL)31 @n 71 use vars qw( @n; D$Bourso_URL31 @n 80 my @n = 'http://www.boursorama.com/recherche/index.phtml'; X$BSE_URL49 @n 28 my @n = $BSE_MAINURL . "topmenu/kereskedesi_adatok/product_search?isinquery="; '$BSE_MAINURL49 @n 27 my @n = "http://www.bet.hu/"; $BSERO_URL)32 @n 27 use vars qw( @n; E$BSERO_URL32 @n 35 my @n = 'http://www.bvb.ro/mobile/m_SecurityDetails.aspx?'; $BMO_URL)30 @n 32 use vars qw( @n; Q$BMO_URL30 @n 41 my @n = 'http://bmonesbittburns.com/QuickQuote/QuickQuote.asp?Symbol='; $BATCH_SIZE70 @n 50 my @n = 10; 6$BAMOSZ_URL49 @n 25 my @n = $BAMOSZ_MAINURL . "alapoldal?isin=";*$BAMOSZ_MAINURL49 @n 24 my @n = "http://www.bamosz.hu/"; $ASEGR_URL)28 @n 27 use vars qw( @n; c$ASEGR_URL28 @n 35 my @n = 'http://www.ase.gr/content/en/MarketData/Stocks/Prices/Share_SearchResults.asp?';3$AMFI_MAIN_URL)50 @n 10 use vars qw( $AMFI_URL $AMFI_NAV_LIST @n; $AIAHK_URL)27 @n 31 use vars qw( @n; $AEX_URL)26 @n 40 use vars qw( @n; $AEX_URL26 @n 51 my @n = "http://www.euronext.com/search/download/trapridownloadpopup.jcsv?pricesearchresults=actif&filter=1&belongsToList=market_EURLS&mep=8626&lan=NL&resultsTitle=Amsterdam+-+Euronext&cha=1800&format=txt&formatDecimal=.&formatDate=dd/MM/yy";  __.VERSION __.VERSION 6  __.COMPRESS __.COMPRESS ddefine ttypedef __.COMPNAME __.COMPNAMEDX|04D\ Ttx4\0xLL0D|p@ p< I@EXPORT_TAGS86 @@EXPORT_TAGS 41 use vars qw/@@ISA @@EXPORT @@EXPORT_OK @@EXPORT_TAGS()86 @n 34 use Exporter @n;n &)82 @n 29 use JSON qw( decode_json @n;%suffix_to_currency82 @n 40 my @n = (1$YIND_URL_TAIL)82 @n 30 use vars qw($VERSION $YIND_URL_HEAD @n;ec'$YIND_URL_TAIL82 @n 39 my @n = '/quote?format=json';cD$YIND_URL_HEAD82 @n 38 my @n = 'http://finance.yahoo.com/webservice/v1/symbols/';K@ISA77 @@ISA 40 use vars qw/ @@FIELDS @@FIELD_ENCODING $MAX_REQUEST_SIZE @@ISA va%currency_tags77 @n 78 my @n = (A!ASSIGN51 @n 286 @n: for ( @@$row[0] ){!ASSIGN51 @n 252 @n: for ( @@$row[0] ){!ASSIGN51 @n 222 @n: for ( @@$row[0] ){!ASSIGN51 @n 191 @n: for ( @@$row[0] ){!ASSIGN51 @n 382 @n: for ( @@$row[0] ){!ASSIGN51 @n 347 @n: for ( @@$row[0] ){!ASSIGN51 @n 325 @n: for ( @@$row[0] ){ @markets56 @@markets 30 my @@markets =@labels56 @@labels 32 my @@labels =p@YH_FIELD_ENCODING79 @@YH_FIELD_ENCODING 56 our @@YH_FIELD_ENCODING = qw/s n l1 c1 p2 v b a p o m w e r d y j1 a2 c4 t1 d1 q r1/;b@YH_EUROPE_FIELDS79 @@YH_EUROPE_FIELDS 53 our @@YH_EUROPE_FIELDS = qw/symbol name last net p_change volume bid askI@LABELS70 @@LABELS 52 my @@LABELS = qw(name last net p_change volume exchange);F@ISA/44 @@ISA/ 41 use vars qw/$FOOL_URL @@FIELDS $MAX_REQUEST_SIZE @@ISA/; F@EXPORT_OK54 @@EXPORT_OK 30 our @@EXPORT_OK = qw(morningstarjp methods labels);#034 @n 37 use constant DEBUG => @n;#066 @n 37 use constant DEBUG => @n;#045 @n 51 use constant DEBUG => @n;#/29 @n 43 use vars qw@n$ASX_URL @n;)/35 @n 39 use vars qw@n$COMINVEST_URL @n;&/52 @n 42 use vars qw@n$MANINV_URL @n;(/58 @n 42 use vars qw@n$PLATINUM_URL @n;#/48 @n 42 use vars qw@n$HEX_URL @n;(/40 @n 34 use vars qw@n$FIDELITY_URL @n; /72 @n 32 use vars qw@n@@ISA @n;&)83 @n 26 use JSON qw( decode_json @n;(%currencies)63 @n 44 my@n = ((%currencies)64 @n 44 my@n = ( 'Exporter'37 @n 20 use base @n; 'Exporter'54 @n 25 use base @n; '../lib'13 @n 3 use lib @n; '../lib'14 @n 3 use lib @n; '../lib'16 @n 3 use lib @n; '../lib'15 @n 8 use lib @n;$%quotes16 @n 23 my @n = $q->fetch(@@ARGV);1%quote13 @n 39 my @n = $quoter->fetch($market,@@ARGV); %options16 @n 11 my @n = ('c' => ''); 7%currencies37 @n 46 my @n = ( ALL => { name => qq{Albanian Lek} }C%TSP_FUND_NAMES)69 @n 36 use vars qw( $TSP_URL $TSP_MAIN_URL %TSP_FUND_COLUMNS @n;V$url60 @n 14 my @n = 'http://www.six-swiss-exchange.com/funds/security_info_en.html?id=';W$url61 @n 14 my @n = 'http://www.six-swiss-exchange.com/shares/security_info_en.html?id=';($quoter13 @n 36 my @n = Finance::Quote->new();($q14 @n 14 my @n = Finance::Quote->new();($q15 @n 11 my @n = Finance::Quote->new();&$q16 @n 17 my @n = Finance::Quote->new;;$market13 @n 37 my @n = shift || die "Usage: $0 market stocks\n";2$exchange_rate14 @n 16 my @n = $q->currency($ARGV[0],$ARGV[1]);G$close)13 @n 21 my ($name, $date, $last, $p_change, $high, $low, $volume, @n; 8$cachedir50 @n 26 my @n = $ENV{TMPDIR} // $ENV{TEMP} // '/tmp/';1$YIND_URL_TAIL)83 @n 27 use vars qw($VERSION $YIND_URL_HEAD @n;$YIND_URL_TAIL83 @n 40 my @n =$YIND_URL_HEAD83 @n 37 my @n =$YAHOO_EUROPE_URL)79 @n 37 use vars qw( @n;%$YAHOO_CURRENCY_CONV_URL/37 @n 21 use vars qw/@@EXPORT_OK @n;$YAHOO_BRASIL_URL/78 @n 36 use vars qw/ @n;$YAHOO_AUSTRALIA_URL/76 @n 36 use vars qw/ @n;$YAHOO_ASIA_URL)75 @n 39 use vars qw( @n;d8xH\8xT0 p<`,Hl0H p4H l8Pt<X !ASSIGN51 @n 286 @n: for ( @@$rFinance::Quote::GoldMoney47 @n 29 package @n;Finance::Quote::UserAgent86 @n 36 use @n;Finance::Quote86 @n 30 package @n;77Encode86 @n 38 use @n;@n DESTROY86 @n 834 sub @n { return; }n Carp86 @n 35 use @n;7B_to_billions86 @n 794 sub @n {te AUTOLOAD86 @n 67 sub @n { Exporter77 @n 38 use @n;8Finance::Quote::UserAgent72 @n 25 package @n;Finance::Quote::Union71 @n 34 package @n;Finance::Quote::USFedBonds73 @n 15 package @n;Finance::Quote::Trustnet68 @n 31 package @n;Finance::Quote::Troweprice67 @n 30 package @n;Finance::Quote::Tiaacref65 @n 30 package @n;Finance::Quote::Tdwaterhouse64 @n 25 package @n;Finance::Quote::Tdefunds63 @n 25 package @n;Finance::Quote::TSX70 @n 37 package @n;Finance::Quote::TSP69 @n 34 package @n;Finance::Quote::TNetuk66 @n 29 package @n;!Finance::Quote::StockHouseCanada62 @n 30 package @n;Finance::Quote::SIXshares61 @n 8 package @n;Finance::Quote::SIXfunds60 @n 8 package @n;Finance::Quote::SEB59 @n 27 package @n;Finance::Quote::Platinum58 @n 36 package @n;Finance::Quote::NZX57 @n 33 package @n;Finance::Quote::MtGox56 @n 16 package @n;Finance::Quote::MorningstarJP54 @n 20 package @n;Finance::Quote::Morningstar53 @n 1 package @n;Finance::Quote::ManInvestments52 @n 36 package @n;Finance::Quote::MStaruk55 @n 29 package @n;Finance::Quote::LeRevenu51 @n 36 package @n;Finance::Quote::IndiaMutual50 @n 5 package @n;Finance::Quote::HU49 @n 12 package @n;Finance::Quote::HEX48 @n 36 package @n;Finance::Quote::Fool44 @n 35 package @n;Finance::Quote::Finanzpartner43 @n 18 package @n;Finance::Quote::FinanceCanada42 @n 11 package @n;Finance::Quote::FidelityFixed41 @n 12 package @n;Finance::Quote::Fidelity40 @n 30 package @n;Finance::Quote::FTfunds45 @n 43 package @n;Finance::Quote::FTPortfolios46 @n 31 package @n;Finance::Quote::Deka38 @n 18 package @n;Finance::Quote::DWS39 @n 34 package @n;Finance::Quote::Currencies37 @n 16 package @n;Finance::Quote::Cominvest35 @n 35 package @n;Finance::Quote::Citywire34 @n 29 package @n;Finance::Quote::Cdnfundlibrary33 @n 13 package @n;Finance::Quote::CSE36 @n 28 package @n;Finance::Quote::Bourso31 @n 69 package @n;Finance::Quote::BSERO32 @n 25 package @n; Finance::Quote::BMONesbittBurns30 @n 30 package @n;Finance::Quote::ASX29 @n 36 package @n;Finance::Quote::ASEGR28 @n 25 package @n;Finance::Quote::AIAHK27 @n 29 package @n;Finance::Quote::AEX26 @n 38 package @n;Finance::Quote14 @n 4 use @n;Finance::Quote15 @n 9 use @n;Finance::Quote16 @n 4 use @n; Exporter44 @n 39 use @n;Encode29 @n 41 use @n;Encode37 @n 29 use @n;Encode65 @n 43 use @n;Encode49 @n 20 use @n; DateTime54 @n 26 use @n; Data::Dumper16 @n 5 use @n;DEBUG34 @n 37 use constant @n => 0;DEBUG45 @n 51 use constant @n => 0;DEBUG66 @n 37 use constant @n => 0;Carp63 @n 34 use @n;Carp64 @n 34 use @n;Carp67 @n 39 use @n;Carp65 @n 42 use @n;CGI26 @n 45 use @n;CGI36 @n 35 use @n;ASSIGN31 @n 232 @n: for ($key) {!ASSIGN51 @n 160 @n: for ( @@$row[0] ){"ASSIGN51 @n 120 @n: for ( @@$row[0] ) {!ASSIGN51 @n 266 @n: for ( @@$row[0] ){ Ptd<,lDT$d4tDT$ d4xL xP(p@P `0p@!ASSIGN51 @n 286 @n: for ( @@$rFinanceHTTP::Request::Common84 @n 28 use @n;HTML::TableExtract82 @n 33 use @n; paHTML::TableExtract82 @n 33 use @n; paFinance::Quote::YahooJSON82 @n 24 package @n;Finance::Quote::Yahoo::Base77 @n 32 package @n;;HTTP::Request::Common84 @n 28 use @n;HTTP::Request::Common81 @n 34 use @n;HTTP::Request::Common80 @n 31 use @n;HTTP::Request::Common79 @n 33 use @n;HTTP::Request::Common76 @n 32 use @n;HTTP::Request::Common75 @n 35 use @n;HTTP::Request::Common73 @n 21 use @n;HTTP::Request::Common71 @n 39 use @n;HTTP::Request::Common69 @n 39 use @n;HTTP::Request::Common67 @n 38 use @n;HTTP::Request::Common66 @n 44 use @n;HTTP::Request::Common65 @n 41 use @n;HTTP::Request::Common63 @n 33 use @n;HTTP::Request::Common62 @n 38 use @n;HTTP::Request::Common61 @n 10 use @n;HTTP::Request::Common59 @n 35 use @n;HTTP::Request::Common58 @n 38 use @n;HTTP::Request::Common57 @n 38 use @n;HTTP::Request::Common55 @n 40 use @n;HTTP::Request::Common53 @n 9 use @n;lHTTP::Request::Common51 @n 41 use @n;HTTP::Request::Common50 @n 13 use @n;HTTP::Request::Common49 @n 18 use @n;HTTP::Headers72 @n 30 use @n;HTTP::Cookies34 @n 45 use @n;HTTP::Cookies45 @n 58 use @n;HTTP::Cookies66 @n 45 use @n;HTTP::Cookies55 @n 41 use @n;HTML::TreeBuilder31 @n 75 use @nHTML::TreeBuilder74 @n 42 use @n;HTML::TokeParser34 @n 46 use @n;HTML::TokeParser45 @n 59 use @n;HTML::TokeParser66 @n 46 use @n;HTML::TableExtract26 @n 44 use @n;HTML::TableExtract28 @n 31 use @n;HTML::TableExtract27 @n 35 use @n;HTML::TableExtract32 @n 31 use @n;HTML::TableExtract30 @n 36 use @n;HTML::TableExtract29 @n 40 use @n;HTML::TableExtract43 @n 21 use @n;HTML::TableExtract42 @n 18 use @n;HTML::TableExtract41 @n 19 use @n;HTML::TableExtract39 @n 40 use @n;HTML::TableExtract38 @n 21 use @n;HTML::TableExtract36 @n 34 use @n;HTML::TableExtract33 @n 22 use @n;HTML::TableExtract49 @n 19 use @n;HTML::TableExtract69 @n 40 use @n;HTML::TableExtract84 @n 29 use @n;HTML::TableExtract83 @n 29 use @n;HTML::TableExtract74 @n 43 use @n;HTML::TableExtract73 @n 22 use @n;HTML::TableExtract70 @n 40 use @n;HTML::TableExtract68 @n 40 use @n;HTML::TableExtract62 @n 39 use @n;HTML::TableExtract58 @n 40 use @n;HTML::TableExtract53 @n 10 use @n;HTML::TableExtract52 @n 40 use @n;HTML::TableExtract51 @n 42 use @n;HTML::TableExtract50 @n 15 use @n;HTML::TableExtract48 @n 40 use @n;HTML::TableExtract46 @n 40 use @n;HTML::TableExtract85 @n 22 use @n; HTML::Parser37 @n 28 use @n; HTML::Parser73 @n 23 use @n; Getopt::Std16 @n 6 use @n;Finance::Quote::ZA_UnitTrusts85 @n 13 package @n;Finance::Quote::ZA84 @n 22 package @n;Finance::Quote::YahooYQL83 @n 21 package @n;Finance::Quote::Yahoo::USA81 @n 30 package @n;Finance::Quote::Yahoo::NZ80 @n 27 package @n;Finance::Quote::Yahoo::Europe79 @n 29 package @n;Finance::Quote::Yahoo::Brasil78 @n 28 package @n;!Finance::Quote::Yahoo::Australia76 @n 28 package @n;Finance::Quote::Yahoo::Asia75 @n 31 package @n;Finance::Quote::VWD74 @n 36 package @n;@p@P `0pH`@P @`8 \0T(xL tHl@d8 \0T(xJSON47 @n 33 use @n;HTTP::Request::Common47 @n 32 use @n;HTTP::Request::Common86 @n 37 use @n;LWP::UserAgent82 @n 31 use @n; 28HTTP::Request::Common82 @n 32 use @n;LWP::UserAgent77 @n 36 use @n; 28HTTP::Request::Common77 @n 37 use @n;LWP::UserAgent26 @n 42 use @n;e/QLWP::UserAgent28 @n 29 use @n;ODSLWP::UserAgent27 @n 33 use @n;b/FLWP::UserAgent32 @n 29 use @n;ce/LWP::UserAgent31 @n 73 use @n;D cLWP::UserAgent30 @n 34 use @n;rreLWP::UserAgent29 @n 39 use @n;.pmLWP::UserAgent36 @n 32 use @n;te.LWP::UserAgent42 @n 16 use @n;te.LWP::UserAgent41 @n 17 use @n;metLWP::UserAgent40 @n 36 use @n;20 LWP::UserAgent39 @n 38 use @n;82 LWP::UserAgent37 @n 27 use @n;ancLWP::UserAgent35 @n 41 use @n;te.LWP::UserAgent34 @n 43 use @n; $ LWP::UserAgent33 @n 20 use @n; ./LWP::UserAgent46 @n 38 use @n; ./LWP::UserAgent56 @n 22 use @n;37 LWP::UserAgent66 @n 43 use @n;LWP::UserAgent69 @n 38 use @n;LWP::UserAgent68 @n 38 use @n;LWP::UserAgent67 @n 37 use @n;LWP::UserAgent65 @n 40 use @n;LWP::UserAgent64 @n 32 use @n;LWP::UserAgent63 @n 32 use @n;LWP::UserAgent62 @n 37 use @n;LWP::UserAgent59 @n 34 use @n;LWP::UserAgent58 @n 39 use @n;LWP::UserAgent57 @n 37 use @n;LWP::UserAgent55 @n 39 use @n;FinLWP::UserAgent53 @n 8 use @n;LWP::UserAgent52 @n 39 use @n;uotLWP::UserAgent51 @n 40 use @n; 64LWP::UserAgent50 @n 12 use @n;b/FLWP::UserAgent49 @n 17 use @n;oteLWP::UserAgent48 @n 39 use @n;R $LWP::UserAgent45 @n 56 use @n;ce/LWP::UserAgent44 @n 38 use @n;QuoLWP::UserAgent70 @n 39 use @n;LWP::UserAgent74 @n 40 use @n;LWP::UserAgent78 @n 33 use @n;LWP::UserAgent85 @n 20 use @n; $ LWP::UserAgent84 @n 27 use @n;LWP::UserAgent81 @n 35 use @n;LWP::UserAgent80 @n 32 use @n;LWP::UserAgent79 @n 34 use @n;LWP::UserAgent76 @n 33 use @n;LWP::UserAgent75 @n 36 use @n;LWP::UserAgent73 @n 20 use @n;LWP::UserAgent72 @n 29 use @n;LWP::UserAgent71 @n 38 use @n; LWP::Simple34 @n 42 use @n;b/ LWP::Simple55 @n 38 use @n;@$ LWP::Simple39 @n 41 use @n;/l LWP::Simple66 @n 42 use @n;e.JSON56 @n 21 use @n;/ HTTP::Status50 @n 14 use @n;aHTTP::Request::Common27 @n 34 use @n;HTTP::Request::Common28 @n 30 use @n;HTTP::Request::Common30 @n 35 use @n;HTTP::Request::Common29 @n 38 use @n;HTTP::Request::Common35 @n 42 use @n;HTTP::Request::Common34 @n 44 use @n;HTTP::Request::Common33 @n 21 use @n;HTTP::Request::Common32 @n 30 use @n;HTTP::Request::Common31 @n 74 use @n;HTTP::Request::Common48 @n 38 use @n;HTTP::Request::Common46 @n 39 use @n;HTTP::Request::Common45 @n 57 use @n;HTTP::Request::Common44 @n 37 use @n;HTTP::Request::Common42 @n 17 use @n;HTTP::Request::Common41 @n 18 use @n;HTTP::Request::Common40 @n 37 use @n;HTTP::Request::Common39 @n 39 use @n;HTTP::Request::Common37 @n 26 use @n;HTTP::Request::Common52 @n 38 use @n;HTTP::Request::Common56 @n 20 use @n;HTTP::Request::Common60 @n 10 use @n;HTTP::Request::Common64 @n 33 use @n;HTTP::Request::Common68 @n 39 use @n;HTTP::Request::Common74 @n 41 use @n;HTTP::Request::Common78 @n 32 use @n;HTTP::Request::Common85 @n 21 use @n;` T(X,tT0t$`L \4xpP,d@xP(TpLT!ASSIGN goldmoney47 @n 53 sub @n {_goldmoney_time47 @n 197 sub @n {_goldmoney_error47 @n 183 sub @n {isoTime86 @n 763 sub @n {fetch86 @n 555 sub @n {us failover86 @n 504 sub @n { @ndefault_currency_fields86 @n 391 sub @n {decimal_shiftup86 @n 811 sub @n {currency_lookup86 @n 295 sub @n { currency86 @n 231 sub @n {_smart_compare86 @n 349 sub @n {_require_test86 @n 537 sub @n {_load_modules86 @n 98 sub @n { @n_dummy86 @n 202 sub @n {s _convert86 @n 406 sub @n { @n Time::Piece82 @n 34 use @n;b base_yahoo_labels77 @n 70 sub @n {fet\labels63 @n 51 sub @n { return (tdefunds => [qw/method exchange name nav date isodate price/]); }labels61 @n 18 sub @n {labels60 @n 18 sub @n {1labels59 @n 46 sub @n { return (seb_funds => \@@@n); }labels57 @n 43 sub @n {labels56 @n 48 sub @n {,labels55 @n 57 sub @n { return (mstaruk => \@@@n,3labels53 @n 20 sub @n { return (morningstar => \@@@n); }.labels52 @n 54 sub @n { return (maninv => \@@@n); }+labels51 @n 54 sub @n { return (france => \@@@n,known_currencies37 @n 207 sub @n { 41 hu_decimal49 @n 203 sub @n {.hu49 @n 58 sub @n { .hex48 @n 67 sub @n {f fundlibrary33 @n 45 sub @n {c ftportfolios46 @n 60 sub @ne. ftfunds_fund45 @n 85 sub @n {fool44 @n 77 sub @n {finanzpartner43 @n 47 sub @n financecanada42 @n 38 sub @n {90 fidelityfixed41 @n 45 sub @n {Fin fidelity40 @n 57 sub @nncfetch_live_currencies37 @n 217 sub @n {teextract_stock_data70 @n 124 sub @n {. env_proxy72 @n 95 sub @n { R dwsfunds39 @n 84 sub @n {Mdon't67 @n 114 sources. The information source "troweprice" can be used if you @ndeka38 @n 50 sub @nQudefault_headers72 @n 48 sub @n {mcse36 @n 51 sub @n { convert_price38 @n 42 sub @n {e/Qconvert_price43 @n 41 sub @n {anc cominvest35 @n 66 sub @n {pm citywire_fund34 @n 70 sub @n { ./bsero32 @n 49 sub @n {ockbse49 @n 83 sub @n { bourso_to_number31 @n 100 sub @n {b/Fbourso31 @n 106 sub @n {nbmonesbittburns30 @n 47 sub @n {u>base_yahoo_labels/75 @n 37 use Finance::Quote::Yahoo::Base qw/yahoo_request @n;Qu>base_yahoo_labels/78 @n 34 use Finance::Quote::Yahoo::Base qw/yahoo_request @n;li>base_yahoo_labels/76 @n 34 use Finance::Quote::Yahoo::Base qw/yahoo_request @n; $>base_yahoo_labels/81 @n 36 use Finance::Quote::Yahoo::Base qw/yahoo_request @n;./>base_yahoo_labels/80 @n 33 use Finance::Quote::Yahoo::Base qw/yahoo_request @n;e.>base_yahoo_labels/79 @n 35 use Finance::Quote::Yahoo::Base qw/yahoo_request @n;/Fbase_fool_labels44 @n 70 sub @n {bamosz49 @n 147 sub @n {easx29 @n 66 sub @n {nasegr28 @n 49 sub @n {ina amfiindia50 @n 41 sub @n {ancaiahk27 @n 49 sub @n {inaaex26 @n 67 sub @n {F_text_handler37 @n 300 sub @n {/Q_start_handler37 @n 247 sub @n {p_live_currencies37 @n 314 sub @n {R t _end_handler37 @n 273 sub @n {pm _dwsfunds_error39 @n 243 sub @n {_add_custom_headers72 @n 75 sub @n {RURI::QueryParam70 @n 42 use @n; . URI::Escape56 @n 24 use @n;inURI70 @n 41 use @n;b/ Time::Piece83 @n 30 use @n;na +TABLE_LOOP49 @n 111 @n: for my $ts ( $te->tables ) { SWITCH51 @n 110 @n: for ($style){ STDOUT_TOP13 @n 23 format @n =nanSTDOUT13 @n 31 format @n =otePOSIX56 @n 23 use @n; 0`l0xT0h,Hx8LThl,lH$4\\ l0D 8 d  x ( X H$8 0p(xTp$X`8L(\ P,xmethods47 @n 40 sub @n { labels47 @n 44 sub @n { set_currency86 @n 374 sub @n {met scale_field86 @n 468 sub @n {require_labels86 @n 523 sub @n {tparse_csv_semicolon86 @n 656 sub @nds parse_csv86 @n 633 sub @nnew86 @n 153 sub @n {methods82 @n 46 sub @n { labels82 @n 54 sub @n { simple_request72 @n 55 sub @n { sharenet84 @n 46 sub @n { seb_funds59 @n 49 sub @n {request72 @n 63 sub @n {qw/asx/13 @n 4 use Finance::Quote @n;qw/$YAHOO_URL/81 @n 38 use vars @n;qw/$YAHOO_NZ_URL/80 @n 35 use vars @n; 'qw(POST)36 @n 33 use HTTP::Request::Common @n; 'qw(POST)26 @n 43 use HTTP::Request::Common @n; qw($CSE_URL)36 @n 30 use vars @n; platinum58 @n 60 sub @n {nzx57 @n 51 sub @nnew72 @n 41 sub @n {mtgox56 @n 58 sub @n { mstaruk_fund55 @n 64 sub @n {morningstarjp54 @n 40 sub @n morningstar53 @n 23 sub @n {methods85 @n 28 sub @n {methods84 @n 36 sub @n {methods83 @n 43 sub @n {,methods81 @n 46 sub @n {return (canada => \&yahoo,Emethods80 @n 43 sub @n {return (nz => \&yahoo_nz, yahoo_nz => \&yahoo_nz)};Tmethods79 @n 58 sub @n {return (europe => \&yahoo_europe,yahoo_europe => \&yahoo_europe)};3methods78 @n 44 sub @n {return (brasil => \&yahoo_brasil,9methods76 @n 44 sub @n {return (australia => \&yahoo_australia,Lmethods75 @n 47 sub @n {return (asia => \&yahoo_asia,yahoo_asia => \&yahoo_asia)};-methods74 @n 47 sub @n { return ( vwd => \&vwd ); }methods73 @n 29 sub @n {9methods71 @n 43 sub @n { return (unionfunds => \&unionfunds); }methods70 @n 55 sub @n {*methods69 @n 76 sub @n { return (tsp => \&tsp) }Smethods68 @n 50 sub @n { return (uk_unit_trusts => \&trustnet, trustnet => \&trustnet); }6methods67 @n 47 sub @n { return (troweprice => \&troweprice,3methods66 @n 57 sub @n { return (tnetuk => \&tnetuk_fund,3methods65 @n 51 sub @n { return (tiaacref=>\&tiaacref); }=methods64 @n 49 sub @n { return (tdwaterhouse => \&tdwaterhouse); }5methods63 @n 49 sub @n { return (tdefunds => \&tdefunds); }Fmethods62 @n 49 sub @n { return (stockhousecanada_fund => \&stockhouse_fund,9methods61 @n 16 sub @n { return ( sixshares => \&sixshares ); }7methods60 @n 16 sub @n { return ( sixfunds => \&sixfunds ); }7methods59 @n 41 sub @n { return (seb_funds => \&seb_funds); }2methods58 @n 48 sub @n {return (platinum => \&platinum)}8methods57 @n 42 sub @n { return (nz => \&nzx, nzx => \&nzx); }methods56 @n 36 sub @n {5methods55 @n 51 sub @n { return (mstaruk => \&mstaruk_fund,Amethods54 @n 37 sub @n { return ( morningstarjp => \&morningstarjp ); };methods53 @n 15 sub @n { return (morningstar => \&morningstar); }.methods52 @n 49 sub @n {return (maninv => \&maninv)}1methods51 @n 49 sub @n { return ( france => \&lerevenu,6methods50 @n 29 sub @n { return (indiamutual => \&amfiindia,methods49 @n 30 sub @n {Pmethods48 @n 50 sub @n {return ('europe' => \&hex, 'finland' => \&hex,'hex' => \&hex)}dmethods46 @n 49 sub @n { return (ftportfolios => \&ftportfolios, ftportfolios_direct => \&ftportfolios); }5methods45 @n 72 sub @n { return (ftfunds => \&ftfunds_fund,*methods44 @n 55 sub @n {return (fool => \&fool)}=methods43 @n 27 sub @n {return (finanzpartner => \&finanzpartner);}methods42 @n 24 sub @n {methods41 @n 34 sub @n {1methods40 @n 43 sub @n {return (fidelity => \&fidelity,methods39 @n 47 sub @n {+methods38 @n 28 sub @n {return (deka => \&deka);}*methods26 @n 53 sub @n { return (dutch => \&aex,/methods27 @n 41 sub @n { return (aiahk => \&aiahk); };methods29 @n 49 sub @n {return (australia => \&asx,asx => \&asx)}.methods28 @n 38 sub @n { return ( greece => \&asegr,9methods33 @n 32 sub @n { return (canadamutual => \&fundlibrary,/methods32 @n 38 sub @n { return ( romania => \&bsero,methods31 @n 82 sub @n {Bmethods30 @n 43 sub @n { return (bmonesbittburns => \&bmonesbittburns) }7methods34 @n 57 sub @n { return (citywire => \&citywire_fund,Bmethods37 @n 36 sub @n { return ( known_currencies => \&known_currencies*methods36 @n 41 sub @n { return (cse => \&cse) }methods35 @n 48 sub @n {maninv52 @n 61 sub @n { lerevenu51 @n 58 sub @n {*labels26 @n 59 sub @n { return (dutch => \@@@n,m -labels27 @n 46 sub @n { return (aiahk => \@@@n); } 58labels30 @n 44 sub @n { return (bmonesbittburns => [qw/name last p_change bid offer open high low volume currency method exchange date isodate time/]) };.labels29 @n 55 sub @n { return (australia => \@@@n,./+labels28 @n 44 sub @n { return (greece => \@@@n,0labels35 @n 55 sub @n {-labels34 @n 63 sub @n { return (citywire => \@@@n,1labels33 @n 38 sub @n { return (canadamutual => \@@@n,,labels32 @n 44 sub @n { return (romania => \@@@n,labels31 @n 92 sub @n { Flabels38 @n 29 sub @n { return (deka=>[qw/name date price last method/]); }1labels46 @n 54 sub @n { return (ftportfolios => \@@@n,labels49 @n 41 sub @n {-labels48 @n 56 sub @n { return ('europe' => \@@@n,,labels45 @n 78 sub @n { return (ftfunds => \@@@n,,labels44 @n 67 sub @n { return (fool => \@@@n); }Vlabels43 @n 28 sub @n { return (finanzpartner=>[qw/name date price last method/]); } # TODOlabels42 @n 30 sub @n {labels41 @n 39 sub @n {-labels40 @n 50 sub @n { return (fidelity => \@@@n,labels39 @n 51 sub @n {labels37 @n 41 sub @n { return () };*labels36 @n 46 sub @n { return (cse => \@@@n) }0labels50 @n 34 sub @n { return (indiamutual => \@@@n,Glabels54 @n 38 sub @n { return ( morningstarjp => [qw/symbol date nav/] ); }0labels58 @n 53 sub @n { return (platinum => \@@@n); }:labels62 @n 54 sub @n { return (stockhousecanada_fund => \@@@n,+labels66 @n 63 sub @n { return (tnetuk => \@@@n,labels70 @n 62 sub @n {Alabels75 @n 52 sub @n { return (asia => \@@@n, yahoo_asia => \@@@n); }=labels80 @n 48 sub @n { return (nz => \@@@n, yahoo_nz => \@@@n); }labels84 @n 40 sub @n {labels85 @n 32 sub @n {labels83 @n 50 sub @n {+labels81 @n 57 sub @n { return (canada => \@@@n,Elabels79 @n 63 sub @n { return (europe => \@@@n, yahoo_europe => \@@@n); }+labels78 @n 50 sub @n { return (brasil => \@@@n,.labels76 @n 50 sub @n { return (australia => \@@@n,labels74 @n 49 sub @n {labels73 @n 34 sub @n {Zlabels71 @n 44 sub @n { return (unionfunds => [qw/exchange name date isodate price method/]); }+labels69 @n 81 sub @n { return (tsp => \@@@n); }-labels68 @n 55 sub @n { return (trustnet => \@@@n,/labels67 @n 53 sub @n { return (troweprice => \@@@n,clabels65 @n 53 sub @n { return (tiaacref => [qw/method symbol exchange name date isodate nav price/]); }`labels64 @n 51 sub @n { return (tdwaterhouse => [qw/method exchange name nav date isodate price/]); } XPx0XdDl$(tLpH h@4| 4T,t(HhPP,|\8hH(P,tpHl@ warnings47 @n 36 use @n;nstrict47 @n 35 use @n;;n user_agent86 @n 607 sub @n {timeout86 @n 488 sub @n {strict86 @n 33 use @n;@n store_date86 @n 700 sub @nsources86 @n 216 sub @n { yahoo_json82 @n 60 sub @n {strict82 @n 28 use @n;yahoo_request77 @n 150 sub @n {strict77 @n 35 use @n;za_unittrusts85 @n 38 sub @n {Uyour70 @n 200 sources for Canadian stocks. Using the "tsx" method will guarantee that @n yahoo_yql83 @n 55 sub @n { yahoo_nz80 @n 51 sub @nyahoo_fidelity81 @n 84 sub @n { yahoo_europe79 @n 68 sub @n yahoo_brasil78 @n 54 sub @nyahoo_australia76 @n 54 sub @n yahoo_asia75 @n 57 sub @nyahoo81 @n 107 sub @n warnings66 @n 33 use @n; warnings56 @n 19 use @n; warnings55 @n 33 use @n; warnings54 @n 24 use @n; warnings45 @n 47 use @n; warnings39 @n 43 use @n; warnings37 @n 18 use @n; warnings34 @n 33 use @n;vwd74 @n 84 sub @n {utf859 @n 36 use @n; unionurl71 @n 129 sub @n unionfunds71 @n 56 sub @ntsx70 @n 76 sub @n {tsp69 @n 85 sub @n { trustnet68 @n 61 sub @n troweprice67 @n 59 sub @ntrimtr74 @n 73 sub @n {trim74 @n 61 sub @n {trim49 @n 191 sub @n {trim43 @n 31 sub @ntrim38 @n 32 sub @n treasury73 @n 40 sub @n { tnetuk_fund66 @n 70 sub @n { tiaacref65 @n 273 sub @ntdwaterhouse_get_currency64 @n 75 sub @n {tdwaterhouse_create_symbol64 @n 58 sub @n { tdwaterhouse64 @n 88 sub @ntdefunds_get_currency63 @n 75 sub @n {tdefunds_create_symbol63 @n 58 sub @n { tdefunds63 @n 88 sub @nstrict85 @n 18 use @n;strict84 @n 25 use @n;strict83 @n 25 use @n;strict81 @n 33 use @n;strict80 @n 30 use @n;strict79 @n 32 use @n;strict78 @n 31 use @n;strict76 @n 31 use @n;strict75 @n 34 use @n;strict74 @n 39 use @n;strict73 @n 18 use @n;strict72 @n 28 use @n;strict71 @n 37 use @n;strict70 @n 35 use @n;strict69 @n 32 use @n;strict68 @n 34 use @n;strict67 @n 33 use @n;strict66 @n 32 use @n;strict65 @n 35 use @n;strict64 @n 28 use @n;strict63 @n 28 use @n;strict62 @n 33 use @n;strict59 @n 30 use @n;strict58 @n 34 use @n;strict57 @n 36 use @n;strict56 @n 18 use @n;strict55 @n 32 use @n;strict54 @n 23 use @n;strict53 @n 4 use @n;strict52 @n 34 use @n;strict51 @n 34 use @n;strict50 @n 8 use @n;strict49 @n 15 use @n;strict48 @n 34 use @n;strict46 @n 34 use @n;strict45 @n 46 use @n;strict44 @n 33 use @n;strict43 @n 20 use @n;strict42 @n 14 use @n;strict41 @n 15 use @n;strict40 @n 33 use @n;strict39 @n 42 use @n;strict38 @n 20 use @n;strict37 @n 17 use @n;strict36 @n 26 use @n;strict35 @n 38 use @n;strict34 @n 32 use @n;strict33 @n 16 use @n;strict32 @n 23 use @n;strict31 @n 67 use @n;strict30 @n 28 use @n;strict29 @n 34 use @n;strict28 @n 23 use @n;strict27 @n 27 use @n;strict26 @n 36 use @n;strict16 @n 2 use @n;strict14 @n 2 use @n;strict13 @n 2 use @n;stockhouse_fund62 @n 61 sub @n { sixshares61 @n 22 sub @n { sixfunds60 @n 22 sub @n {Finance-Quote-1.38/htdocs/000755 000765 000024 00000000000 12566055631 015132 5ustar00ecstaff000000 000000 Finance-Quote-1.38/lib/000755 000765 000024 00000000000 12566055631 014414 5ustar00ecstaff000000 000000 Finance-Quote-1.38/LICENSE000644 000765 000024 00000043523 12566055631 014662 0ustar00ecstaff000000 000000 This software is Copyright (c) 2013 by Erik Colson . This is free software, licensed under: The GNU General Public License, Version 2, June 1991 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. Finance-Quote-1.38/Makefile.PL000644 000765 000024 00000005470 12566055631 015626 0ustar00ecstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.029. use strict; use warnings; use 5.010; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "Get stock and mutual fund quotes from various exchanges", "AUTHOR" => "Dj Padzensky , PadzNet, Inc., Linas Vepstas , Yannick LE NY , Paul Fenwick , Brent Neal , Volker Stuerzl , Keith Refson , Rob Sessink , Leigh Wedding , Tobias Vancura , James Treacy , Bradley Dean , Erik Colson ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Finance-Quote", "EXE_FILES" => [], "LICENSE" => "gpl", "MIN_PERL_VERSION" => "5.010", "NAME" => "Finance::Quote", "PREREQ_PM" => { "CGI" => 0, "Carp" => 0, "DateTime" => 0, "Encode" => 0, "Exporter" => 0, "HTML::Parser" => 0, "HTML::TableExtract" => 0, "HTML::TokeParser" => 0, "HTML::TreeBuilder" => 0, "HTTP::Cookies" => 0, "HTTP::Headers" => 0, "HTTP::Request::Common" => 0, "HTTP::Status" => 0, "JSON" => 0, "LWP::Protocol::https" => 0, "LWP::Simple" => 0, "LWP::UserAgent" => 0, "Mozilla::CA" => 0, "POSIX" => 0, "Time::Piece" => 0, "URI" => 0, "URI::QueryParam" => 0, "base" => 0, "constant" => 0, "strict" => 0, "utf8" => 0, "vars" => 0, "warnings" => 0 }, "TEST_REQUIRES" => { "Data::Dumper" => 0, "File::Spec" => 0, "Test::More" => 0 }, "VERSION" => "1.38", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "CGI" => 0, "Carp" => 0, "Data::Dumper" => 0, "DateTime" => 0, "Encode" => 0, "Exporter" => 0, "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "HTML::Parser" => 0, "HTML::TableExtract" => 0, "HTML::TokeParser" => 0, "HTML::TreeBuilder" => 0, "HTTP::Cookies" => 0, "HTTP::Headers" => 0, "HTTP::Request::Common" => 0, "HTTP::Status" => 0, "JSON" => 0, "LWP::Protocol::https" => 0, "LWP::Simple" => 0, "LWP::UserAgent" => 0, "Mozilla::CA" => 0, "POSIX" => 0, "Test::More" => 0, "Time::Piece" => 0, "URI" => 0, "URI::QueryParam" => 0, "base" => 0, "constant" => 0, "strict" => 0, "utf8" => 0, "vars" => 0, "warnings" => 0 ); unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); Finance-Quote-1.38/MANIFEST000644 000765 000024 00000007000 12566055631 014774 0ustar00ecstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.029. ChangeLog.1 Changes Documentation/FAQ Documentation/Hackers-Guide Documentation/License Documentation/README Examples/Quote_example.pl Examples/chkshares.pl Examples/currency-lookup.pl Examples/stockdump.pl GPATH GRTAGS GTAGS LICENSE MANIFEST META.json META.yml Makefile.PL README debian/changelog debian/control debian/copyright debian/rules htdocs/Images/Button1.gif htdocs/Images/Button2.gif htdocs/Images/bg.jpg htdocs/Images/bg2.jpg htdocs/Images/logo_big1.gif htdocs/Images/logo_medium1.gif htdocs/Images/logo_small1.gif htdocs/Images/logo_small2.gif htdocs/Stylesheet.css htdocs/developer.html htdocs/discussion.html htdocs/documentation.html htdocs/download.html htdocs/index.html htdocs/tpj/finance-quote-example htdocs/tpj/finance-quote-sidebar htdocs/tpj/finance-quote.txt lib/Finance/Quote.pm lib/Finance/Quote/AEX.pm lib/Finance/Quote/AIAHK.pm lib/Finance/Quote/ASEGR.pm lib/Finance/Quote/ASX.pm lib/Finance/Quote/BMONesbittBurns.pm lib/Finance/Quote/BSERO.pm lib/Finance/Quote/Bourso.pm lib/Finance/Quote/CSE.pm lib/Finance/Quote/Cdnfundlibrary.pm lib/Finance/Quote/Citywire.pm lib/Finance/Quote/Cominvest.pm lib/Finance/Quote/Currencies.pm lib/Finance/Quote/DWS.pm lib/Finance/Quote/Deka.pm lib/Finance/Quote/FTPortfolios.pm lib/Finance/Quote/FTfunds.pm lib/Finance/Quote/Fidelity.pm lib/Finance/Quote/FidelityFixed.pm lib/Finance/Quote/FinanceCanada.pm lib/Finance/Quote/Finanzpartner.pm lib/Finance/Quote/Fool.pm lib/Finance/Quote/GoldMoney.pm lib/Finance/Quote/HEX.pm lib/Finance/Quote/HU.pm lib/Finance/Quote/IndiaMutual.pm lib/Finance/Quote/LeRevenu.pm lib/Finance/Quote/MStaruk.pm lib/Finance/Quote/ManInvestments.pm lib/Finance/Quote/Morningstar.pm lib/Finance/Quote/MorningstarJP.pm lib/Finance/Quote/NZX.pm lib/Finance/Quote/Platinum.pm lib/Finance/Quote/SEB.pm lib/Finance/Quote/SIXfunds.pm lib/Finance/Quote/SIXshares.pm lib/Finance/Quote/StockHouseCanada.pm lib/Finance/Quote/TNetuk.pm lib/Finance/Quote/TSP.pm lib/Finance/Quote/TSX.pm lib/Finance/Quote/Tdefunds.pm lib/Finance/Quote/Tdwaterhouse.pm lib/Finance/Quote/Tiaacref.pm lib/Finance/Quote/Troweprice.pm lib/Finance/Quote/Trustnet.pm lib/Finance/Quote/USFedBonds.pm lib/Finance/Quote/Union.pm lib/Finance/Quote/UserAgent.pm lib/Finance/Quote/VWD.pm lib/Finance/Quote/Yahoo/Asia.pm lib/Finance/Quote/Yahoo/Australia.pm lib/Finance/Quote/Yahoo/Base.pm lib/Finance/Quote/Yahoo/Brasil.pm lib/Finance/Quote/Yahoo/Europe.pm lib/Finance/Quote/Yahoo/NZ.pm lib/Finance/Quote/Yahoo/USA.pm lib/Finance/Quote/YahooJSON.pm lib/Finance/Quote/YahooYQL.pm lib/Finance/Quote/ZA.pm lib/Finance/Quote/ZA_UnitTrusts.pm t/00-use.t t/01-pod.t t/02-pod-coverage.t t/03-kwalitee.t t/04-critic.t t/05-data-dumper.t t/aex.t t/aiahk.t t/asegr.t t/asx.t t/bmonesbittburns.t t/bourso.t t/bsero.t t/cdnfundlibrary.t t/citywire.t t/cominvest.t t/cse.t t/currencies.t t/currency.t t/currency_lookup.t t/deka.t t/dws.t t/fidelity.t t/fidelityfixed.t t/financecanada.t t/finanzpartner.t t/ftfunds.t t/ftportfolios.t t/goldmoney.t t/hex.t t/hu.t t/indiamutual.t t/lerevenu.t t/maninvestments.t t/morningstar.t t/morningstarJP.t t/mstaruk.t t/nzx.t t/platinum.t t/quote.t t/release-pod-syntax.t t/seb.t t/sixfunds.t t/sixshares.t t/stockhousecanada.t t/tdefunds.t t/tdwaterhouse.t t/tiaacref.t t/tnetuk.t t/troweprice.t t/trustnet.t t/tsp.t t/tsx.t t/ukfunds.t t/union.t t/usfedbonds.t t/vanguard.t t/vwd.t t/yahoo.t t/yahoo_asia.t t/yahoo_australia.t t/yahoo_brasil.t t/yahoo_europe.t t/yahoo_nz.t t/yahoo_speed.t t/yahoojson.t t/za.t t/za_unittrusts.t Finance-Quote-1.38/META.json000644 000765 000024 00000005363 12566055631 015276 0ustar00ecstaff000000 000000 { "abstract" : "Get stock and mutual fund quotes from various exchanges", "author" : [ "Dj Padzensky , PadzNet, Inc.", "Linas Vepstas ", "Yannick LE NY ", "Paul Fenwick ", "Brent Neal ", "Volker Stuerzl ", "Keith Refson ", "Rob Sessink ", "Leigh Wedding ", "Tobias Vancura ", "James Treacy ", "Bradley Dean ", "Erik Colson " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 5.029, CPAN::Meta::Converter version 2.142690", "license" : [ "gpl_2" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Finance-Quote", "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "develop" : { "requires" : { "Test::Pod" : "1.41" } }, "runtime" : { "requires" : { "CGI" : "0", "Carp" : "0", "DateTime" : "0", "Encode" : "0", "Exporter" : "0", "HTML::Parser" : "0", "HTML::TableExtract" : "0", "HTML::TokeParser" : "0", "HTML::TreeBuilder" : "0", "HTTP::Cookies" : "0", "HTTP::Headers" : "0", "HTTP::Request::Common" : "0", "HTTP::Status" : "0", "JSON" : "0", "LWP::Protocol::https" : "0", "LWP::Simple" : "0", "LWP::UserAgent" : "0", "Mozilla::CA" : "0", "POSIX" : "0", "Time::Piece" : "0", "URI" : "0", "URI::QueryParam" : "0", "base" : "0", "constant" : "0", "perl" : "5.010", "strict" : "0", "utf8" : "0", "vars" : "0", "warnings" : "0" } }, "test" : { "requires" : { "Data::Dumper" : "0", "File::Spec" : "0", "Test::More" : "0" } } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://rt.cpan.org/Dist/Display.html?Name=Finance-Quote" }, "homepage" : "http://finance-quote.sourceforge.net/", "repository" : { "type" : "git", "url" : "git://github.com/finance-quote/finance-quote", "web" : "https://github.com/finance-quote/finance-quote" } }, "version" : "1.38" } Finance-Quote-1.38/META.yml000644 000765 000024 00000003277 12566055631 015130 0ustar00ecstaff000000 000000 --- abstract: 'Get stock and mutual fund quotes from various exchanges' author: - 'Dj Padzensky , PadzNet, Inc.' - 'Linas Vepstas ' - 'Yannick LE NY ' - 'Paul Fenwick ' - 'Brent Neal ' - 'Volker Stuerzl ' - 'Keith Refson ' - 'Rob Sessink ' - 'Leigh Wedding ' - 'Tobias Vancura ' - 'James Treacy ' - 'Bradley Dean ' - 'Erik Colson ' build_requires: Data::Dumper: '0' File::Spec: '0' Test::More: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 generated_by: 'Dist::Zilla version 5.029, CPAN::Meta::Converter version 2.142690' license: gpl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Finance-Quote requires: CGI: '0' Carp: '0' DateTime: '0' Encode: '0' Exporter: '0' HTML::Parser: '0' HTML::TableExtract: '0' HTML::TokeParser: '0' HTML::TreeBuilder: '0' HTTP::Cookies: '0' HTTP::Headers: '0' HTTP::Request::Common: '0' HTTP::Status: '0' JSON: '0' LWP::Protocol::https: '0' LWP::Simple: '0' LWP::UserAgent: '0' Mozilla::CA: '0' POSIX: '0' Time::Piece: '0' URI: '0' URI::QueryParam: '0' base: '0' constant: '0' perl: '5.010' strict: '0' utf8: '0' vars: '0' warnings: '0' resources: bugtracker: https://rt.cpan.org/Dist/Display.html?Name=Finance-Quote homepage: http://finance-quote.sourceforge.net/ repository: git://github.com/finance-quote/finance-quote version: '1.38' Finance-Quote-1.38/README000644 000765 000024 00000000561 12566055631 014530 0ustar00ecstaff000000 000000 This archive contains the distribution Finance-Quote, version 1.38: Get stock and mutual fund quotes from various exchanges This software is Copyright (c) 2013 by Erik Colson . This is free software, licensed under: The GNU General Public License, Version 2, June 1991 This README file was generated by Dist::Zilla::Plugin::Readme v5.029. Finance-Quote-1.38/t/000755 000765 000024 00000000000 12566055631 014111 5ustar00ecstaff000000 000000 Finance-Quote-1.38/t/00-use.t000755 000765 000024 00000006627 12566055631 015325 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # Test to see if Finance::Quote can at least be loaded and used. use strict; use Test::More; plan tests => 19; use Finance::Quote; ok(1, "Finance::Quote loaded"); my $quote = Finance::Quote->new(); ok($quote, "quote object created"); # Get Today's date my ($month, $day, $year2) = (localtime())[4,3,5]; $month++; my $year4 += $year2 + 1900; # 2007 my $year4m += $year2 + 1900 - 1;# 2006 $year2 -= 100; # 05 my $isotoday = sprintf("%04d-%02d-%02d", $year4, $month, $day); my $ustoday = sprintf("%02d/%02d/%04d", $month, $day, $year4); # Test date functions my %info; $quote->store_date(\%info, "test", {today => 1}); ok($info{"test","isodate"} eq $isotoday,"test->isodate is today"); ok($info{"test","date"} eq $ustoday,"test->date is today"); # Test various permutions of an ISO Date as input %info = (); $quote->store_date(\%info, "test", {isodate => "2004-12-31"}); ok($info{"test","date"} eq "12/31/2004", "ISO date permutation 1"); %info = (); $quote->store_date(\%info, "test", {isodate => "2004 Dec 31"}); ok($info{"test","date"} eq "12/31/2004","ISO date permutation 2"); %info = (); $quote->store_date(\%info, "test", {isodate => "2004 December 31"}); ok($info{"test","date"} eq "12/31/2004","ISO date permutation 3"); # Test various permutions of an US Date as input %info = (); $quote->store_date(\%info, "test", {usdate => "12/31/2004"}); ok($info{"test","isodate"} eq "2004-12-31","US date permutation 1"); %info = (); $quote->store_date(\%info, "test", {usdate => "Dec 31, 2004"}); ok($info{"test","isodate"} eq "2004-12-31","US date permutation 2"); %info = (); $quote->store_date(\%info, "test", {usdate => "December 31 2004"}); ok($info{"test","isodate"} eq "2004-12-31","US date permutation 3"); # Test various permutions of an European Date as input %info = (); $quote->store_date(\%info, "test", {eurodate => "31/12/2004"}); ok($info{"test","isodate"} eq "2004-12-31","EUR date permutation 1" ); %info = (); $quote->store_date(\%info, "test", {eurodate => "31 December 2004"}); ok($info{"test","isodate"} eq "2004-12-31","EUR date permutation 2"); %info = (); $quote->store_date(\%info, "test", {eurodate => "31 Dec, 2004"}); ok($info{"test","isodate"} eq "2004-12-31","EUR date permutation 3"); # Try some other permutions. A recent change to the date handling # code changes the behavior if a year is not explicitly provided. Now # it will look at the month and decide if the date is in the current # year or is from the previous year. This code still has to handle # being executed on 12/31, thus the dual tests for each date. %info = (); $quote->store_date(\%info, "test", {day=>"31", month=>"12"}); ok($info{"test","date"} eq "12/31/$year4" || $info{"test","date"} eq "12/31/$year4m","test year 1"); ok($info{"test","isodate"} eq "$year4-12-31" || $info{"test","isodate"} eq "$year4m-12-31","test year 2"); %info = (); $quote->store_date(\%info, "test", {day=>"31", month=>"December"}); ok($info{"test","date"} eq "12/31/$year4" || $info{"test","date"} eq "12/31/$year4m","test year 3"); ok($info{"test","isodate"} eq "$year4-12-31" || $info{"test","isodate"} eq "$year4m-12-31","test year 4"); %info = (); $quote->store_date(\%info, "test", {day=>"31", month=>"December", year => $year2}); ok($info{"test","date"} eq "12/31/$year4" || $info{"test","date"} eq "12/31/$year4m","test year 5"); ok($info{"test","isodate"} eq "$year4-12-31" || $info{"test","isodate"} eq "$year4m-12-31","test year 6"); Finance-Quote-1.38/t/01-pod.t000755 000765 000024 00000000435 12566055631 015303 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; if (not $ENV{TEST_AUTHOR}) { plan( skip_all => 'Author test. Set $ENV{TEST_AUTHOR} to true to run.'); } eval "use Test::Pod 1.00"; ## no critic plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; all_pod_files_ok(); Finance-Quote-1.38/t/02-pod-coverage.t000755 000765 000024 00000000447 12566055631 017100 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; if (not $ENV{TEST_AUTHOR}) { plan( skip_all => 'Author test. Set $ENV{TEST_AUTHOR} to true to run.'); } eval "use Test::Pod::Coverage 1.00"; plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD" if $@; all_pod_coverage_ok(); Finance-Quote-1.38/t/03-kwalitee.t000755 000765 000024 00000000436 12566055631 016331 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; if (not $ENV{TEST_AUTHOR}) { plan( skip_all => 'Author test. Set $ENV{TEST_AUTHOR} to true to run.'); } eval { require Test::Kwalitee; Test::Kwalitee->import() }; plan( skip_all => 'Test::Kwalitee not installed; skipping' ) if $@; Finance-Quote-1.38/t/04-critic.t000755 000765 000024 00000000521 12566055631 015775 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use File::Spec; if (not $ENV{TEST_AUTHOR}) { plan( skip_all => 'Author test. Set $ENV{TEST_AUTHOR} to true to run.'); } eval { require Test::Perl::Critic; }; if ($@) { plan( skip_all => 'Test::Perl::Critic required for test.'); } Test::Perl::Critic->import(); all_critic_ok(); Finance-Quote-1.38/t/05-data-dumper.t000755 000765 000024 00000000717 12566055631 016733 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{TEST_AUTHOR}) { plan( skip_all => 'Author test. Set $ENV{TEST_AUTHOR} to true to run.'); } plan tests => 1; # F::Q doesn't load all its code until we actually create # an object. my $fq = Finance::Quote->new; # Sometimes Data::Dumper gets left in code by accident. Make sure # we haven't done so. ok(! exists $INC{'Data/Dumper.pm'}, "Data::Dumper should not be loaded"); Finance-Quote-1.38/t/aex.t000755 000765 000024 00000002160 12566055631 015055 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 13; # Test AEX functions. my $quoter = Finance::Quote->new(); my %quotes = $quoter->aex("AH"); ok(%quotes); # Check that some values are defined. ok($quotes{"AH","success"}); ok($quotes{"AH","last"} > 0); ok($quotes{"AH","date"}); ok($quotes{"AH","volume"} > 0); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok(substr($quotes{"AH","isodate"},0,4) == $year || substr($quotes{"AH","isodate"},0,4) == $lastyear); ok(substr($quotes{"AH","date"},6,4) == $year || substr($quotes{"AH","date"},6,4) == $lastyear); # Exercise the fetch function %quotes = $quoter->fetch("aex","AMG"); ok(%quotes); ok($quotes{"AMG","success"}); ok($quotes{"AMG","last"} > 0); # Check fetching on based on ISIN %quotes = $quoter->aex("NL0000009165"); # NL0000009165 == Heineken == HEIA ok(%quotes); ok($quotes{"NL0000009165","success"}); # Check that a bogus fund returns no-success. %quotes = $quoter->aex("BOGUS"); ok( ! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/aiahk.t000755 000765 000024 00000002477 12566055631 015370 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 30; # Test Aia functions. my $q = Finance::Quote->new(); # my stocks = stock, fund, warrant, bond, indice my @stocks = ("ABD-AUS.EQ", "AIG-EUSC.U", "FID-JP.ADV", "SCH-HKEQ"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fetch("aiahk", @stocks); ok(%quotes); TODO: { local $TODO="To be debugged"; # Check that the name, last, currency and date are defined for all of the stocks. foreach my $stock (@stocks) { ok($quotes{$stock,"success"}); ok($quotes{$stock,"bid"} > 0); ok($quotes{$stock,"offer"} > 0); ok(length($quotes{$stock,"name"})); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } ok($quotes{"ABD-AUS.EQ", "currency"} eq "AUD"); ok($quotes{"AIG-EUSC.U", "currency"} eq "EUR"); ok($quotes{"FID-JP.ADV", "currency"} eq "JPY"); ok($quotes{"SCH-HKEQ", "currency"} eq "HKD"); } # Check that a bogus stock returns no-success. %quotes = $q->fetch("aiahk", "BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/asegr.t000755 000765 000024 00000002474 12566055631 015411 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 13; # Test ASEGR functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->asegr("ALPHA","ELTON"); ok(%quotes); # Check the last values are defined. These are the most used and most # reliable indicators of success. ok($quotes{"ALPHA","last"} > 0); ok($quotes{"ALPHA","success"}); ok(substr($quotes{"ALPHA","date"},6,4) == $year || substr($quotes{"ALPHA","date"},6,4) == $lastyear); ok($quotes{"ELTON","success"}); ok($quotes{"ELTON","last"} > 0); ok(substr($quotes{"ELTON","date"},6,4) == $year || substr($quotes{"ELTON","date"},6,4) == $lastyear); # Exercise the fetch function a little. %quotes = $q->fetch("asegr","IKONA"); ok(%quotes); ok($quotes{"IKONA","last"} > 0); ok($quotes{"IKONA","success"} > 0); # Check that we're getting currency information. ok($quotes{"IKONA", "currency"} eq "EUR"); # Check we're not getting bogus percentage signs. $quotes{"IKONA","p_change"} ||= ""; # Avoid warning if undefined. ok($quotes{"IKONA","p_change"} !~ /%/); # Check that looking up a bogus stock returns failure: %quotes = $q->asegr("BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/asx.t000755 000765 000024 00000004121 12566055631 015072 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # 16-Feb-2014 Change RZR (delisted in 2012) to BOQ. # 28-Feb-2014 Add tests with 11 stocks at once. plan tests 11 -> 34. use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 34; # Test ASX functions. my $q = Finance::Quote->new(); $q->timeout(120); # ASX is broken regularly, so timeouts are good. my %quotes = $q->asx("WES","BHP"); ok( %quotes, "Data returned for call to asx" ); # Check the last values are defined. These are the most used and most # reliable indicators of success. ok( $quotes{"WES","success"}, "WES query was successful" ); cmp_ok( $quotes{"WES","last"}, '>', 0 , "Last price for WES was > 0" ); ok( $quotes{"BHP","success"}, "BHP query was successful" ); cmp_ok( $quotes{"BHP","last"}, '>', 0 , "Last price for BHP was > 0" ); # Exercise the fetch function a little. %quotes = $q->fetch("asx","BOQ"); ok( %quotes, "Data returned for call to fetch" ); ok( $quotes{"BOQ","success"}, "BOQ query was successful" ); cmp_ok( $quotes{"BOQ","last"}, '>', 0 , "Last price for BOQ was > 0" ); # Check that we're getting currency information. cmp_ok( $quotes{"BOQ", "currency"}, "eq", "AUD" , "Currency of BOQ is AUD" ); # Check we're not getting bogus percentage signs. unlike( $quotes{"BOQ","p_change"} , qr/%/ , "No percentage sign in p_change value" ); # Check that looking up a bogus stock returns failure: %quotes = $q->asx("BOG"); ok( ! $quotes{"BOG","success"}, "asx call for invalid stock BOG returns failure"); # Check 11 stocks at once to test batching of price enquiries into groups of 10 my @stocks = qw/AMP ANZ BHP BOQ BEN CSR IAG NAB TLS WBC WES/; %quotes = $q->asx(@stocks); ok( %quotes, "Data returned for call to asx" ); # Check the last values are defined. These are the most used and most # reliable indicators of success. foreach my $stock (@stocks) { ok( $quotes{$stock, "success"}, $stock . " query was successful" ); cmp_ok( $quotes{$stock,"last"}, '>', 0 , "Last price for " . $stock . " was > 0" ); } Finance-Quote-1.38/t/bmonesbittburns.t000755 000765 000024 00000002636 12566055631 017530 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 23; # Test bmonesbittburns functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my @stocks = ("NT,T", "BBD.A,T","MFC598,MF"); my %quotes = $q->bmonesbittburns(@stocks); ok(%quotes); # Check that last and date are defined as our tests. foreach my $stock (@stocks) { ok($quotes{$stock,"last"} > 0); ok($quotes{$stock,"success"}); ok($quotes{$stock,"currency"} eq "CAD"); ok(length($quotes{$stock,"date"}) > 0); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } # Exercise the fetch function %quotes = $q->fetch("bmonesbittburns", "NT,X"); ok(%quotes); ok($quotes{"NT,X","success"}); ok($quotes{"NT,X","last"} > 0); # Check that a bogus fund returns no-success. %quotes = $q->bmonesbittburns("BOGUS"); ok( ! $quotes{"BOGUS","success"}); # Fetching an empty stock does result in an error, and yes # this is bad. But fetching an empty stock isn't normal # behaviour. # %quotes = $q->fetch("bmonesbittburns", ""); # ok( %quotes); # ok( ! $quotes{"NT,X","success"}); # ok( ! $quotes{"NT,X","last"} > 0); Finance-Quote-1.38/t/bourso.t000755 000765 000024 00000005370 12566055631 015617 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if ( not $ENV{ONLINE_TEST} ) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 65; # Test Bourso functions. my $q = Finance::Quote->new(); # my stocks = stock, fund, warrant, bond, indice my @stocks = ( "FR0000441677", # Fund "AF", # Stock, EUR, Nyse Euronext "MSFT", # Stock, USD, NASDAQ "SOLB", # Stock, EUR, BRUXELLES "CNP", # Stock, EUR, Nyse Euronext "FR0010371401", # Bond "FR0010707414", # Warrant "FR0003500008", # Index ); # Bourso tests need to cover all the possible cases: # # Name What Test Case # # cours-action Stock AF # cours-obligation Bond FR0010371401 # opcvm/opcvm Fund FR0000441677 # cours-warrant Warrant FR0010707414 # cours-indice Index FR0003500008 my $year = ( localtime() )[5] + 1900; my $lastyear = $year - 1; my %quotes; #my %quotes = $q->fetch("bourso", @stocks); #ok(%quotes); # Check that the name, last, currency and date are defined for all of the stocks. foreach my $stock (@stocks) { eval { %quotes = $q->fetch( "bourso", $stock ); ok( %quotes, "$stock \%quotes defined" ); my $last = $quotes{ $stock, "last" }; ok( $last > 0, "$stock last ($last) > 0" ); ok( length( $quotes{ $stock, "name" } ), "$stock name is defined" ); ok( length( $quotes{ $stock, "symbol" } ), "$stock symbol is defined" ); ok( $quotes{ $stock, "success" }, "$stock returned success" ); ok( # indexes are quoted in percents ( $stock eq "FR0003500008" ) || ( ( $stock eq "MSFT" ) && ( $quotes{ $stock, "currency" } eq "USD" ) ) || ( $quotes{ $stock, "currency" } eq "EUR" ), "Index is quoted in percents" ); SKIP: { skip "date is not defined for warrants", 2 if ( $stock eq "FR0010707414" ); ok( substr( $quotes{ $stock, "isodate" }, 0, 4 ) == $year || substr( $quotes{ $stock, "isodate" }, 0, 4 ) == $lastyear, "$stock isodate defined" ); ok( substr( $quotes{ $stock, "date" }, 6, 4 ) == $year || substr( $quotes{ $stock, "date" }, 6, 4 ) == $lastyear, "$stock date defined" ); } }; if ($@) { print STDERR "Error fetching stock ", $stock, "\n", $@; ok( !1 ); } } # Check that a bogus stock returns no-success. %quotes = $q->fetch( "bourso", "BOGUS" ); ok( !$quotes{ "BOGUS", "success" }, "BOGUS failed correctly" ); Finance-Quote-1.38/t/bsero.t000644 000765 000024 00000002052 12566055631 015407 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 26; # Test BSERO functions. my $q = Finance::Quote->new(); my @stocks = ("TLV", "BRD", "SNP"); my %regexps = ( TLV => qr/\bTLV\b/, BRD => qr/\bBRD\b/, SNP => qr/\bSNP\b/, ); my %quotes = $q->fetch("bsero", @stocks); ok(%quotes); foreach my $stock (@stocks) { my $name = $quotes{$stock, "name"}; print "#Testing $stock: $name\n"; my $regexp = $regexps{$stock}; ok($name =~ /$regexp/i); ok($quotes{$stock, "exchange"} eq 'Bucharest Stock Exchange'); ok($quotes{$stock, "method"} eq 'bsero'); ok($quotes{$stock, "last"} > 0); ok($quotes{$stock, "open"} =~ /^-?\d+\.\d+$/); ok($quotes{$stock, "p_change"} =~ /^-?\d+\.\d+$/); ok($quotes{$stock, "success"}); ok($quotes{$stock, "volume"} >= 0); } # Check that a bogus stock returns no-success. %quotes = $q->fetch("tsx", "BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/cdnfundlibrary.t000755 000765 000024 00000001644 12566055631 017314 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; # Test Canadian Fund Library functions. my $q = Finance::Quote->new(); my %quotes = $q->fundlibrary("19001","00000"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"19001","last"} > 0); ok($quotes{"19001","success"}); ok($quotes{"19001", "currency"} eq "CAD"); ok(length($quotes{"19001","date"}) > 0); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok(substr($quotes{"19001","isodate"},0,4) == $year || substr($quotes{"19001","isodate"},0,4) == $lastyear); ok(substr($quotes{"19001","date"},6,4) == $year || substr($quotes{"19001","date"},6,4) == $lastyear); # Check that bogus stocks return failure: ok(! $quotes{"00000","success"}); Finance-Quote-1.38/t/citywire.t000755 000765 000024 00000001440 12566055631 016137 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->citywire("GB0003865390","GB0003865176","GB0033696674","BOGUS"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"GB0003865390","last"} > 0); ok($quotes{"GB0003865390","success"}); ok($quotes{"GB0003865176","last"} > 0); ok($quotes{"GB0003865176","success"}); ok($quotes{"GB0033696674","last"} > 0); ok($quotes{"GB0033696674","success"}); # Check that bogus stocks return failure: ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/cominvest.t000755 000765 000024 00000001755 12566055631 016320 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 9; # Test Cominvest functions. my $q = Finance::Quote->new("Cominvest"); my %quotes = $q->fetch("cominvest","DE0008471178","BOGUS"); ok(%quotes); # Check that the price and date values are defined. ok($quotes{"DE0008471178","success"}); ok($quotes{"DE0008471178","price"} > 0); ok(length($quotes{"DE0008471178","date"}) > 0); ok($quotes{"DE0008471178","currency"}); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok((substr($quotes{"DE0008471178","isodate"},0,4) == $year) || (substr($quotes{"DE0008471178","isodate"},0,4) == $lastyear)); ok((substr($quotes{"DE0008471178","date"},6,4) == $year) || (substr($quotes{"DE0008471178","date"},6,4) == $lastyear)); # Check that a bogus fund returns no-success and has a error message ok(! $quotes{"BOGUS","success"}); ok($quotes{"BOGUS","errormsg"}); Finance-Quote-1.38/t/cse.t000755 000765 000024 00000002016 12566055631 015052 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 12; # Test CSE functions. my $quoter = Finance::Quote->new(); my %quotes = $quoter->cse("JKH.N0000"); ok(%quotes); # Check that some values are defined. ok($quotes{"JKH.N0000","success"},"success"); ok($quotes{"JKH.N0000","last"} > 0,"last > 0"); ok($quotes{"JKH.N0000","volume"} > 0,"volume > 0"); TODO: { local $TODO = "No 'open' returned when market closed ?" ; ok($quotes{"JKH.N0000","open"},"open is defined"); } ok($quotes{"JKH.N0000","high"},"high is defined"); ok($quotes{"JKH.N0000","low"},"low is defined"); ok($quotes{"JKH.N0000","close"},"close is defined"); # Exercise the fetch function %quotes = $quoter->fetch("cse", "JKH.N0000"); ok(%quotes); ok($quotes{"JKH.N0000","success"}); ok($quotes{"JKH.N0000","last"} > 0); # Check that a bogus fund returns no-success. %quotes = $quoter->cse("BOGUS"); ok( ! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/currencies.t000755 000765 000024 00000000767 12566055631 016455 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote::Currencies; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 1; my $known_currencies = eval { Finance::Quote::Currencies::known_currencies() }; my $live_currencies = eval { Finance::Quote::Currencies::fetch_live_currencies() }; is_deeply( $known_currencies , $live_currencies , "Stored currency list is up to date with live currency list" ); Finance-Quote-1.38/t/currency.t000755 000765 000024 00000002750 12566055631 016137 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 11; # Test currency conversion, both explicit requests and automatic # conversion. my $q = Finance::Quote->new(); # Explicit conversion... ok($q->currency("USD","AUD")); # Test 1 ok($q->currency("EUR","JPY")); # Test 2 ok(! defined($q->currency("XXX","YYY"))); # Test 3 # test for thousands : GBP -> IQD. This should be > 1000 ok($q->currency("GBP","IQD")>1000) ; # Test 4 # Test 5 ok(($q->currency("10 AUD","AUD")) == (10 * ($q->currency("AUD","AUD")))); # Euros into French Francs are fixed at a conversion rate of # 1:6.559576 . We can use this knowledge to test that a stock is # converting correctly. # Test 6 my %baseinfo = $q->fetch("yahoo_europe","UG.PA"); ok($baseinfo{"UG.PA","success"}); $q->set_currency("AUD"); # All new requests in Aussie Dollars. my %info = $q->fetch("yahoo_europe","UG.PA"); ok($info{"UG.PA","success"}); # Test 7 ok($info{"UG.PA","currency"} eq "AUD"); # Test 8 ok($info{"UG.PA","price"} > 0); # Test 9 # Check if inverse is working ok ok(check_inverse("EUR","RUB"),"Inverse is calculated correctly: multiplication should be 1"); ok(check_inverse("CZK","USD"),"Inverse is calculated correctly: multiplication should be 1"); sub check_inverse { my ($cur1,$cur2)=@_; my $a = $q->currency($cur1,$cur2); my $b = $q->currency($cur2,$cur1); return $a*$b; } Finance-Quote-1.38/t/currency_lookup.t000755 000765 000024 00000003416 12566055631 017530 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More tests => 12; use Finance::Quote; # Test overall currency lookup my $currencies = Finance::Quote::currency_lookup(); my %test_currencies = ( AUD => "Australian Dollar" , EUR => "Euro" , CAD => "Canadian Dollar" ); while ( my ($code, $name) = each %test_currencies ) { ok( exists $currencies->{$code}, "Expected currency code (${code}) exists" ); is( $currencies->{$code}->{name} , $name , "Expected currency name (${name}) for code (${code})" ); } # Test selective currency lookup $currencies = Finance::Quote::currency_lookup( name => qr/pound/i ); # Test multiple lookup parameters $currencies = Finance::Quote::currency_lookup( name => "Australia" , code => qr/AU/ ); ok( exists $currencies->{AUD} , "Expected currency code (AUD) exists for matching multiple params" ); cmp_ok( scalar keys %{$currencies}, '==', 1 , "Only one currency returned for matching multiple params" ); $currencies = Finance::Quote::currency_lookup( name => "Euro" , code => "AUD" ); cmp_ok( scalar keys %{$currencies}, '==', 0 , "Expected zero-response for non-matching multiple params" ); # Test non-matching currency lookup $currencies = Finance::Quote::currency_lookup( name => qr/rubbish_value/i ); is( ref $currencies , 'HASH' , 'Hash-ref returned for non-matching lookup' ); cmp_ok( scalar keys %{$currencies} , '==', 0 , "Empty hashref returned for non-matching lookup" ); # Test that an error returns undef $currencies = Finance::Quote::currency_lookup( invalid_param => 1 ); is( $currencies , undef , "Error results in undef response" ); Finance-Quote-1.38/t/deka.t000755 000765 000024 00000002202 12566055631 015201 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 13; # Test deka functions. my $q = Finance::Quote->new("Deka"); $q->timeout(60); # Deka appears to be hanging today. my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my @stocks = ("DE0008474511","LU0051755006"); my %quotes = $q->deka(@stocks, "BOGUS"); ok(%quotes); TODO: { local $TODO="To be debugged"; # Check that the last and date values are defined. foreach my $stock (@stocks) { ok($quotes{$stock,"success"}); ok($quotes{$stock,"last"} > 0); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } ok($quotes{"DE0008474511","currency"} eq "EUR"); ok($quotes{"LU0051755006","currency"} eq "USD"); } # Check that a bogus fund returns no-success. ok($quotes{"BOGUS","success"} == 0); ok($quotes{"BOGUS","errormsg"} eq "Couldn't parse deka website"); Finance-Quote-1.38/t/dws.t000755 000765 000024 00000001570 12566055631 015101 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; # Test DWS functions. my $q = Finance::Quote->new("DWS"); my %quotes = $q->fetch("dwsfunds","847402","BOGUS"); ok(%quotes); # Check that the last and date values are defined. ok($quotes{"847402","success"}); ok($quotes{"847402","last"} > 0); ok(length($quotes{"847402","date"}) > 0); ok($quotes{"847402","currency"} eq "EUR"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok((substr($quotes{"847402","isodate"},0,4) == $year) || (substr($quotes{"847402","isodate"},0,4) == $lastyear)); ok((substr($quotes{"847402","date"},6,4) == $year) || (substr($quotes{"847402","date"},6,4) == $lastyear)); # Check that a bogus fund returns no-success. ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/fidelity.t000755 000765 000024 00000002330 12566055631 016110 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 25; # Test Fidelity functions. my $q = Finance::Quote->new(); my @funds = qw/FGRIX FNMIX FASGX/; my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fidelity_direct(@funds); ok(%quotes); # Check that the name and nav are defined for all of the funds. foreach my $fund (@funds) { ok($quotes{$fund,"nav"} > 0); ok(length($quotes{$fund,"name"})); ok($quotes{$fund,"success"}); ok($quotes{$fund, "currency"} eq "USD"); ok(substr($quotes{$fund,"isodate"},0,4) == $year || substr($quotes{$fund,"isodate"},0,4) == $lastyear); ok(substr($quotes{$fund,"date"},6,4) == $year || substr($quotes{$fund,"date"},6,4) == $lastyear); } # Some funds have yields instead of navs. Check one of them too. %quotes = $q->fidelity_direct("FSLXX"); ok(%quotes); ok(length($quotes{"FSLXX","name"})); ok($quotes{"FSLXX","yield"} > 0); ok($quotes{"FSLXX","success"}); ok($quotes{"FSLXX", "currency"} eq "USD"); # Check that a bogus fund returns no-success. %quotes = $q->fidelity_direct("BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/fidelityfixed.t000644 000765 000024 00000001646 12566055631 017136 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 17; # Test Fidelity functions. my $q = Finance::Quote->new(); my @funds = qw/59333PRJ9 971175PC2 594712RK9/; my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fetch("fidelityfixed",@funds); ok(%quotes); # Check info reported by funds foreach my $fund (@funds) { ok(length($quotes{$fund,"name"})); ok($quotes{$fund,"success"}); ok($quotes{$fund, "currency"} eq "USD"); ok(substr($quotes{$fund,"isodate"},0,4) == $year || substr($quotes{$fund,"isodate"},0,4) == $lastyear); ok(substr($quotes{$fund,"date"},6,4) == $year || substr($quotes{$fund,"date"},6,4) == $lastyear); } # Check that a bogus fund returns no-success. %quotes = $q->fetch("fidelityfixed","BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/financecanada.t000755 000765 000024 00000001766 12566055631 017046 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 26; # Test Finance Canada functions. my $q = Finance::Quote->new(); my @stocks = ("NT","XIU","UUU", "PCA"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fetch("financecanada", @stocks); ok(%quotes); # Check that the name and nav are defined for all of the stocks. foreach my $stock (@stocks) { ok($quotes{$stock,"price"} > 0); ok(length($quotes{$stock,"name"})); ok($quotes{$stock,"success"}); ok($quotes{$stock, "currency"} eq "CAD"); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } # Check that a bogus stock returns no-success. %quotes = $q->fetch("financecanada", "BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/finanzpartner.t000644 000765 000024 00000001673 12566055631 017166 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; # Test finanzpartner functions. my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my $q = Finance::Quote->new("Finanzpartner"); my %quotes = $q->finanzpartner("LU0055732977","BOGUS"); ok(%quotes); # Check that the last and date values are defined. ok($quotes{"LU0055732977","success"}); ok($quotes{"LU0055732977","last"} > 0); ok(length($quotes{"LU0055732977","date"}) > 0); ok(substr($quotes{"LU0055732977","isodate"},0,4) == $year || substr($quotes{"LU0055732977","isodate"},0,4) == $lastyear); ok(substr($quotes{"LU0055732977","date"},6,4) == $year || substr($quotes{"LU0055732977","date"},6,4) == $lastyear); ok($quotes{"LU0055732977","currency"} eq "USD"); # Check that a bogus fund returns non-success. ok($quotes{"BOGUS","success"} == 0); Finance-Quote-1.38/t/ftfunds.t000644 000765 000024 00000002145 12566055631 015751 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 12; my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->ftfunds("GB0031835118","GB0030880255","GB0003865176","GB00B7W6PR65","BOGUS"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"GB0031835118","last"} > 0); ok($quotes{"GB0031835118","success"}); ok($quotes{"GB00B7W6PR65","last"} > 0); ok($quotes{"GB00B7W6PR65","success"}); ok($quotes{"GB00B7W6PR65","currency"} eq "GBP", "Currency (GBP) for GB00B7W6PR65 is ".$quotes{"GB00B7W6PR65","currency"}); ok($quotes{"GB00B7W6PR65","price"}<100,"Price for GB00B7W6PR65 < 100 : ".$quotes{"GB00B7W6PR65","price"}); ok($quotes{"GB0030880255","last"} > 0); ok($quotes{"GB0030880255","success"}); ok($quotes{"GB0003865176","last"} > 0); ok($quotes{"GB0003865176","success"}); # Check that bogus stocks return failure: ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/ftportfolios.t000755 000765 000024 00000002103 12566055631 017027 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 18; # Test FTPortfolios functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my @stocks = ("FKYMRX", "FAEDEX"); my %quotes = $q->ftportfolios(@stocks, "BOGUS"); ok(%quotes); TODO: { local $TODO="To be debugged"; # Check that last and date are defined as our tests. foreach my $stock (@stocks) { ok($quotes{$stock,"pop"} > 0); ok($quotes{$stock,"nav"} > 0); ok($quotes{$stock,"price"} > 0); ok($quotes{$stock,"success"}); ok($quotes{$stock,"currency"} eq "USD"); ok(length($quotes{$stock,"date"}) > 0); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } } # Check that a bogus fund returns no-success. ok( ! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/goldmoney.t000755 000765 000024 00000004013 12566055631 016274 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if ( not $ENV{ONLINE_TEST} ) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 46; # Test GoldMoney functions. my $q = Finance::Quote->new("GoldMoney"); foreach my $currency ( 'EUR', 'USD' ) { $q->set_currency($currency); my %quotes = $q->fetch( "goldmoney", "gold", "silver", "platinum", "BOGUS" ); ok(%quotes); # Check that sound information is returned for gold, silver and platinum. ok( $quotes{ "gold", "success" }, 'gold price lookup' ); ok( $quotes{ "gold", "last" } > 0, "Gold is quoted at " . $quotes{ "gold", "last" } ); ok( $quotes{ "gold", "currency" } eq $currency, "currency is $currency" ); ok( length( $quotes{ "gold", "date" } ) > 0 ); ok( length( $quotes{ "gold", "time" } ) > 0 ); ok( $quotes{ "silver", "success" }, 'silver price lookup' ); ok( $quotes{ "silver", "last" } > 0 ); ok( $quotes{ "silver", "currency" } eq $currency, "currency is $currency" ); ok( length( $quotes{ "silver", "date" } ) > 0 ); ok( length( $quotes{ "silver", "time" } ) > 0 ); ok( $quotes{ "platinum", "success" }, 'platinum price lookup' ); ok( $quotes{ "platinum", "last" } > 0 ); ok( $quotes{ "platinum", "currency" } eq $currency, "currency is $currency" ); ok( length( $quotes{ "platinum", "date" } ) > 0 ); ok( length( $quotes{ "platinum", "time" } ) > 0 ); my $year = ( localtime() )[5] + 1900; ok( ( substr( $quotes{ "gold", "isodate" }, 0, 4 ) == $year ) ); ok( ( substr( $quotes{ "gold", "date" }, 6, 4 ) == $year ) ); ok( ( substr( $quotes{ "silver", "isodate" }, 0, 4 ) == $year ) ); ok( ( substr( $quotes{ "silver", "date" }, 6, 4 ) == $year ) ); ok( ( substr( $quotes{ "platinum", "isodate" }, 0, 4 ) == $year ) ); ok( ( substr( $quotes{ "platinum", "date" }, 6, 4 ) == $year ) ); # Check that a bogus symbol returns no-success. ok( !$quotes{ "BOGUS", "success" } ); } Finance-Quote-1.38/t/hex.t000755 000765 000024 00000001720 12566055631 015065 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 14; # Test HEX functions. my $q = Finance::Quote->new(); my @stocks = ("NOK1V", "RTRKS"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fetch("hex", @stocks); ok(%quotes); # Check that the name and nav are defined for all of the stocks. foreach my $stock (@stocks) { ok($quotes{$stock,"price"} > 0); ok(length($quotes{$stock,"name"})); ok($quotes{$stock,"success"}); ok($quotes{$stock, "currency"} eq "EUR"); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } # Check that a bogus stock returns no-success. %quotes = $q->fetch("hex", "BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/hu.t000644 000765 000024 00000004722 12566055631 014717 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # HU.pm # # Version 0.1 - test of Hungarian (HU) F::Q # This version based on za.t module # # Zoltan Levardy # 2009 use strict; use Test::More; use Finance::Quote; if ( not $ENV{ONLINE_TEST} ) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 21; # Test za functions. my $q = Finance::Quote->new("HU"); my $year = ( localtime() )[5] + 1900; my $lastyear = $year - 1; #getting quotes for shares by ticker (OTP,ANY,RABA), # shares by ISIN (ticker: MTELEKOM: HU0000073507, MOL: HU0000068952) # and for funds by ISIN (HU0000702709,HU0000706437) # and finally an incorrect ticker/isin is ZOL, must fail. my %quotes = $q->hu( "OTP", "HU0000068952", "HU0000702709", "ZOL" ) ; #,"ANY","RABA","HU0000073507","HU0000068952","HU0000702709","HU0000706437","ZOL"); ok(%quotes); # Check that the last and date values are defined. ok( $quotes{ "OTP", "success" } ); ok( $quotes{ "OTP", "last" } > 0 ); ok( length( $quotes{ "OTP", "date" } ) > 0 ); ok( substr( $quotes{ "OTP", "isodate" }, 0, 4 ) == $year || substr( $quotes{ "OTP", "isodate" }, 0, 4 ) == $lastyear ); ok( substr( $quotes{ "OTP", "date" }, 6, 4 ) == $year || substr( $quotes{ "OTP", "date" }, 6, 4 ) == $lastyear ); ok( $quotes{ "OTP", "currency" } eq "HUF" ); # MTELEKOM: HU0000073507 ok( $quotes{ "HU0000068952", "success" } ); ok( $quotes{ "HU0000068952", "last" } > 0 ); ok( length( $quotes{ "HU0000068952", "date" } ) > 0 ); ok( substr( $quotes{ "HU0000068952", "isodate" }, 0, 4 ) == $year || substr( $quotes{ "HU0000068952", "isodate" }, 0, 4 ) == $lastyear ); ok( substr( $quotes{ "HU0000068952", "date" }, 6, 4 ) == $year || substr( $quotes{ "HU0000068952", "date" }, 6, 4 ) == $lastyear ); ok( $quotes{ "HU0000068952", "currency" } eq "HUF" ); # Fund: Budapest II, isin: HU0000702709 ok( $quotes{ "HU0000702709", "success" } ); ok( $quotes{ "HU0000702709", "last" } > 0 ); ok( length( $quotes{ "HU0000702709", "date" } ) > 0 ); ok( substr( $quotes{ "HU0000702709", "isodate" }, 0, 4 ) == $year || substr( $quotes{ "HU0000702709", "isodate" }, 0, 4 ) == $lastyear ); ok( substr( $quotes{ "HU0000702709", "date" }, 6, 4 ) == $year || substr( $quotes{ "HU0000702709", "date" }, 6, 4 ) == $lastyear ); ok( $quotes{ "HU0000702709", "currency" } eq "HUF" ); # Check that a ZOL fund returns no-success. ok( !$quotes{ "ZOL", "success" } ); ok( $quotes{ "ZOL", "errormsg" } eq "Fetch from bse or bamosz failed" ); Finance-Quote-1.38/t/indiamutual.t000755 000765 000024 00000002053 12566055631 016615 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 50; # Test Fidelity functions. my $q = Finance::Quote->new(); my @funds = ("102676", "103131", "101599", "102732", "100151", "INF194K01W88", "INF090I01FN7", "INF082J01127"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fetch("indiamutual", @funds); ok(%quotes); # Check that the name and nav are defined for all of the funds. foreach my $fund (@funds) { ok($quotes{$fund,"nav"} > 0); ok(length($quotes{$fund,"name"})); ok($quotes{$fund,"success"}); ok($quotes{$fund, "currency"} eq "INR"); ok(substr($quotes{$fund,"isodate"},0,4) == $year || substr($quotes{$fund,"isodate"},0,4) == $lastyear); ok(substr($quotes{$fund,"date"},6,4) == $year || substr($quotes{$fund,"date"},6,4) == $lastyear); } # Check that a bogus fund returns no-success. %quotes = $q->fetch("indiamutual", "BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/lerevenu.t000755 000765 000024 00000002525 12566055631 016132 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 32; # Test LeRevenu functions. my $q = Finance::Quote->new(); # my stocks = stock, fund, warrant, bond, indice my @stocks = ("AF","FR0000441677","FR0010324475","FR0010112052","FR0003500008"); # LeRevenu tests need to cover all the possible cases: # # Name What Test Case # # Actions Stock AF # Obligations Bond FR0010112052 # SICAVetFCP Fund FR0000441677 # Bons&Warrants Warrant FR0010324475 # Indices Index FR0003500008 my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fetch("lerevenu", @stocks); ok(%quotes); # Check that the name, last, currency and date are defined for all of the stocks. foreach my $stock (@stocks) { ok($quotes{$stock,"last"} > 0); ok(length($quotes{$stock,"name"})); ok($quotes{$stock,"success"}); ok($quotes{$stock, "currency"} eq "EUR"); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } # Check that a bogus stock returns no-success. %quotes = $q->fetch("lerevenu", "BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/maninvestments.t000755 000765 000024 00000001777 12566055631 017370 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; # Test ManInvestments functions. my $q = Finance::Quote->new(); my %quotes = $q->maninv("OMIP220","BOGUS"); TODO: { local $TODO="To be debugged"; ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"OMIP220","last"} > 0); ok(length($quotes{"OMIP220","name"}) > 0); ok($quotes{"OMIP220","success"}); ok($quotes{"OMIP220", "currency"} eq "AUD"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok((substr($quotes{"OMIP220","isodate"},0,4) == $year) || (substr($quotes{"OMIP220","isodate"},0,4) == $lastyear)); ok((substr($quotes{"OMIP220","date"},6,4) == $year) || (substr($quotes{"OMIP220","date"},6,4) == $lastyear)); } # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/morningstar.t000644 000765 000024 00000002111 12566055631 016634 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 9; # Test Morningstar functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my @stocks = ("F0GBR069L2","BOGUS"); my %quotes = $q->fetch("morningstar",@stocks); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"F0GBR069L2","price"} > 0); ok(length($quotes{"F0GBR069L2","name"}) > 0); ok($quotes{"F0GBR069L2","success"}); ok($quotes{"F0GBR069L2", "currency"} eq "USD"); ok(substr($quotes{"F0GBR069L2","isodate"},0,4) == $year || substr($quotes{"F0GBR069L2","isodate"},0,4) == $lastyear); ok(substr($quotes{"F0GBR069L2","date"},6,4) == $year || substr($quotes{"F0GBR069L2","date"},6,4) == $lastyear); # Make sure we don't have spurious % signs. ok($quotes{"F0GBR069L2","p_change"} !~ /%/); # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/morningstarJP.t000644 000765 000024 00000003334 12566055631 017076 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use DateTime; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 9 * 2; # Find out today my $calcDay = DateTime->now(); my $year = $calcDay->year(); my $month = $calcDay->month(); my $day = $calcDay->day(); # Test Morningstar JP functions. my $q = Finance::Quote->new(); my @funds = ( "2009100101", "2002013108" ); my %info = $q->morningstarjp(@funds); ok(%info); # Check that the symbol/name, date, currency and nav defined for all of the funds. foreach my $fund (@funds) { # NAV date should be within 10 days of today, but we will allow +- 1 day # on top of that for running tests outside of Asia/Tokyo timezone my $fndyear = substr( $info{ $fund, "isodate" }, 0, 4 ); my $fndmonth = substr( $info{ $fund, "isodate" }, 5, 2 ); my $fndday = substr( $info{ $fund, "isodate" }, 8, 2 ); my $fnd = DateTime->new(year=>$fndyear,month=>$fndmonth,day=>$fndday); my $deltadays = $calcDay->subtract_datetime($fnd)->in_units('days'); cmp_ok( $deltadays,'<=', 11, 'not more than 11 days before today' ); cmp_ok( $deltadays,'>=', -1, 'not more than 1 day in the future' ); cmp_ok( $info{ $fund, 'currency' }, 'eq', 'JPY', 'currency' ); cmp_ok( $info{ $fund, 'method' }, 'eq', 'MorningstarJP', 'method' ); cmp_ok( $info{ $fund, 'name' }, 'eq', $fund, 'name' ); cmp_ok( $info{ $fund, "nav" }, '>', 0, 'nav' ); ok( $info{ $fund, "success" }, 'success' ); cmp_ok( $info{ $fund, 'symbol' }, 'eq', $fund, 'symbol' ); } # Check that a bogus symbol returns no-success. ok( !$info{ "BOGUS", "success" } ); Finance-Quote-1.38/t/mstaruk.t000644 000765 000024 00000001437 12566055631 015771 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->mstaruk("GB0031835118","GB0030880032","GB0004842737","BOGUS"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"GB0031835118","last"} > 0); ok($quotes{"GB0031835118","success"}); ok($quotes{"GB0030880032","last"} > 0); ok($quotes{"GB0030880032","success"}); ok($quotes{"GB0004842737","last"} > 0); ok($quotes{"GB0004842737","success"}); # Check that bogus stocks return failure: ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/nzx.t000755 000765 000024 00000001707 12566055631 015125 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; # Test Yahoo_europe functions. my $q = Finance::Quote->new(); my %quotes = $q->nzx("TPW","BOGUS"); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. TODO: { local $TODO="To be debugged"; ok($quotes{"TPW","price"} > 0); ok(length($quotes{"TPW","name"}) > 0); ok($quotes{"TPW","success"}); ok($quotes{"TPW", "currency"} eq "NZD"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok(substr($quotes{"TPW","isodate"},0,4) == $year || substr($quotes{"TPW","isodate"},0,4) == $lastyear); ok(substr($quotes{"TPW","date"},6,4) == $year || substr($quotes{"TPW","date"},6,4) == $lastyear); } # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/platinum.t000755 000765 000024 00000001673 12566055631 016141 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; # Test Platinum functions. my $q = Finance::Quote->new(); my %quotes = $q->platinum("PLA0001AU","BOGUS"); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"PLA0001AU","last"} > 0); ok(length($quotes{"PLA0001AU","name"}) > 0); ok($quotes{"PLA0001AU","success"}); ok($quotes{"PLA0001AU", "currency"} eq "AUD"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok(substr($quotes{"PLA0001AU","isodate"},0,4) == $year || substr($quotes{"PLA0001AU","isodate"},0,4) == $lastyear); ok(substr($quotes{"PLA0001AU","date"},6,4) == $year || substr($quotes{"PLA0001AU","date"},6,4) == $lastyear); # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/quote.t000644 000765 000024 00000002677 12566055631 015447 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; plan tests => 28; my $q = Finance::Quote->new(); # test isoTime function ok($q->isoTime("11:39PM") eq "23:39") ; ok($q->isoTime("9:10 AM") eq "09:10") ; ok($q->isoTime("1.32") eq "01:32") ; ok($q->isoTime("1u32") eq "01:32") ; ok($q->isoTime("19h2") eq "19:02") ; ok($q->isoTime("10:62") eq "00:00" ) ; ok($q->isoTime("8:05am") eq "08:05" ) ; ok($q->isoTime("4:00pm") eq "16:00" ) ; ok($q->isoTime("0:59PM") eq "12:59" ) ; ok($q->isoTime("12:00pm") eq "12:00" ) ; ok($q->isoTime("12:10pm") eq "12:10" ) ; # yahoo might return 12:XXPM ! # decimal_shiftup() is($q->decimal_shiftup('1',1), '10'); is($q->decimal_shiftup('1',2), '100'); is($q->decimal_shiftup('1.',1), '10'); is($q->decimal_shiftup('1.',2), '100'); is($q->decimal_shiftup('1.5',1), '15'); is($q->decimal_shiftup('1.5',2), '150'); is($q->decimal_shiftup('1.5',3), '1500'); is($q->decimal_shiftup('56',1), '560'); is($q->decimal_shiftup('56',2), '5600'); is($q->decimal_shiftup('56.00',-1), '5.600'); # we want to keep precision is($q->decimal_shiftup('56.00',1), '560.0'); is($q->decimal_shiftup('1.2345678901234',3), '1234.5678901234'); is($q->decimal_shiftup('0.12345678',1), '1.2345678'); is($q->decimal_shiftup('0.00001',1), '0.0001'); # _B_to_billions() is($q->B_to_billions('1B'), '1000000000'); is($q->B_to_billions('1.5B'), '1500000000'); is($q->B_to_billions('1.23456789876B'), '1234567898.76'); Finance-Quote-1.38/t/release-pod-syntax.t000644 000765 000024 00000000456 12566055631 020027 0ustar00ecstaff000000 000000 #!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { require Test::More; Test::More::plan(skip_all => 'these tests are for release candidate testing'); } } # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use Test::More; use Test::Pod 1.41; all_pod_files_ok(); Finance-Quote-1.38/t/seb.t000755 000765 000024 00000002000 12566055631 015042 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; # Test Yahoo_europe functions. my $q = Finance::Quote->new(); my %quotes = $q->seb_funds("SEB Cancerfonden","BOGUS"); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"SEB Cancerfonden","price"} > 0); ok(length($quotes{"SEB Cancerfonden","name"}) > 0); ok($quotes{"SEB Cancerfonden","success"}); ok($quotes{"SEB Cancerfonden", "currency"} eq "SEK"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok(substr($quotes{"SEB Cancerfonden","isodate"},0,4) == $year || substr($quotes{"SEB Cancerfonden","isodate"},0,4) == $lastyear); ok(substr($quotes{"SEB Cancerfonden","date"},6,4) == $year || substr($quotes{"SEB Cancerfonden","date"},6,4) == $lastyear); # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/sixfunds.t000755 000765 000024 00000002077 12566055631 016152 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if ( not $ENV{ONLINE_TEST} ) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 9; # Test SIXshares functions. my $q = Finance::Quote->new(); my $year = ( localtime() )[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->sixfunds( 'CSSMI', 'BOGUS' ); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok( $quotes{ 'CSSMI', 'last' } > 0 ); ok( length( $quotes{ 'CSSMI', 'name' } ) > 0 ); ok( $quotes{ 'CSSMI', 'success' } ); ok( $quotes{ 'CSSMI', 'currency' } eq 'CHF' ); ok( substr( $quotes{ 'CSSMI', 'isodate' }, 0, 4 ) == $year || substr( $quotes{ 'CSSMI', 'isodate' }, 0, 4 ) == $lastyear ); ok( substr( $quotes{ 'CSSMI', 'date' }, 6, 4 ) == $year || substr( $quotes{ 'CSSMI', 'date' }, 6, 4 ) == $lastyear ); # Make sure we don't have spurious % signs. ok( $quotes{ 'CSSMI', 'p_change' } !~ /%/ ); # Check that a bogus stock returns no-success. ok( !$quotes{ 'BOGUS', 'success' } ); Finance-Quote-1.38/t/sixshares.t000755 000765 000024 00000002066 12566055631 016316 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if ( not $ENV{ONLINE_TEST} ) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 9; # Test SIXshares functions. my $q = Finance::Quote->new(); my $year = ( localtime() )[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->sixshares( 'NESN', 'BOGUS' ); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok( $quotes{ 'NESN', 'last' } > 0 ); ok( length( $quotes{ 'NESN', 'name' } ) > 0 ); ok( $quotes{ 'NESN', 'success' } ); ok( $quotes{ 'NESN', 'currency' } eq 'CHF' ); ok( substr( $quotes{ 'NESN', 'isodate' }, 0, 4 ) == $year || substr( $quotes{ 'NESN', 'isodate' }, 0, 4 ) == $lastyear ); ok( substr( $quotes{ 'NESN', 'date' }, 6, 4 ) == $year || substr( $quotes{ 'NESN', 'date' }, 6, 4 ) == $lastyear ); # Make sure we don't have spurious % signs. ok( $quotes{ 'NESN', 'p_change' } !~ /%/ ); # Check that a bogus stock returns no-success. ok( !$quotes{ 'BOGUS', 'success' } ); Finance-Quote-1.38/t/stockhousecanada.t000755 000765 000024 00000002332 12566055631 017620 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 20; # Test Stock House Canada functions. my $q = Finance::Quote->new(); my @stocks = ("CIB497", "TDB227", "FID342"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fetch("stockhousecanada_fund", @stocks); ok(%quotes); # Check that the name and nav are defined for all of the stocks. foreach my $stock (@stocks) { # print "----------->PRICE: ".$quotes{$stock,"price"}."\n"; ok($quotes{$stock,"price"} > 0); # print "----------->NAME: ".$quotes{$stock,"name"}."\n"; ok(length($quotes{$stock,"name"})); ok($quotes{$stock,"success"}); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } ok($quotes{"CIB497", "currency"} eq "CAD"); ok($quotes{"TDB227", "currency"} eq "USD"); ok($quotes{"FID342", "currency"} eq "USD"); # Check that a bogus stock returns no-success. %quotes = $q->fetch("stockhousecanada_fund", "BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/tdefunds.t000755 000765 000024 00000001211 12566055631 016110 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 5; my $q = Finance::Quote->new; ok($q); my %quotes = $q->tdefunds("TD Canadian Index"); ok(%quotes); ok($quotes{"TD Canadian Index", "nav"}); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok(substr($quotes{"TD Canadian Index","isodate"},0,4) == $year || substr($quotes{"TD Canadian Index","isodate"},0,4) == $lastyear); ok(substr($quotes{"TD Canadian Index","date"},6,4) == $year || substr($quotes{"TD Canadian Index","date"},6,4) == $lastyear); Finance-Quote-1.38/t/tdwaterhouse.t000755 000765 000024 00000002077 12566055631 017025 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 12; # Test TD Waterhouse functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my @stocks = ("TD U.S. MidCap Growth US", "TD Canadian Bond Index"); my %quotes = $q->tdwaterhouse(@stocks, "BOGUS"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. foreach my $stock (@stocks) { ok($quotes{$stock,"last"} > 0); ok($quotes{$stock,"success"}); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } ok($quotes{"TD U.S. MidCap Growth US", "currency"} eq "USD"); ok($quotes{"TD Canadian Bond Index", "currency"} eq "CAD"); # Check that bogus stocks return failure: ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/tiaacref.t000755 000765 000024 00000002434 12566055631 016062 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 45; # Test TIAA-CREF functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my @symbols = qw / CREFmony TIAAreal TLSRX TCMVX TLGRX CREFbond /; my %quotes = $q->tiaacref(@symbols,"BOGOname"); ok(%quotes,"quotes got retrieved"); foreach my $symbol (@symbols) { ok($quotes{$symbol,"success"} > 0,"$symbol got retrieved"); ok($quotes{$symbol,"nav"} > 0,"$symbol has a nav"); ok($quotes{$symbol, "currency"} eq "USD","$symbol currency is valid"); ok($quotes{$symbol,"price"} > 0,"$symbol price (".$quotes{$symbol,"price"}.")> 0"); ok(length($quotes{$symbol,"date"}) > 0,"$symbol has a valid date : ".$quotes{$symbol,"date"}); ok(substr($quotes{$symbol,"isodate"},0,4) == $year || substr($quotes{$symbol,"isodate"},0,4) == $lastyear,"$symbol isodate is recent"); ok(substr($quotes{$symbol,"date"},6,4) == $year || substr($quotes{$symbol,"date"},6,4) == $lastyear,"$symbol date is recent"); }; ok($quotes{"BOGOname","success"} == 0,"BOGUS failed"); ok($quotes{"BOGOname","errormsg"} eq "Bad symbol","BOGUS returned errornsg"); Finance-Quote-1.38/t/tnetuk.t000644 000765 000024 00000001436 12566055631 015614 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->tnetuk("GB0031835118","GB0030880032","LU0116926998","BOGUS"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"GB0031835118","last"} > 0); ok($quotes{"GB0031835118","success"}); ok($quotes{"GB0030880032","last"} > 0); ok($quotes{"GB0030880032","success"}); ok($quotes{"LU0116926998","last"} > 0); ok($quotes{"LU0116926998","success"}); # Check that bogus stocks return failure: ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/troweprice.t000755 000765 000024 00000002265 12566055631 016471 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 13; # Test troweprice functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->troweprice; ok(%quotes); # Check that nav and date are defined as our tests. ok($quotes{"PRFDX","nav"} > 0); ok($quotes{"PRFDX","success"}); ok($quotes{"PRFDX","currency"} eq "USD"); ok(length($quotes{"PRFDX","date"}) > 0); ok(substr($quotes{"PRFDX","isodate"},0,4) == $year || substr($quotes{"PRFDX","isodate"},0,4) == $lastyear); ok(substr($quotes{"PRFDX","date"},6,4) == $year || substr($quotes{"PRFDX","date"},6,4) == $lastyear); ok($quotes{"PRIDX","success"}); ok($quotes{"PRIDX","nav"} > 0); ok(length($quotes{"PRIDX","date"}) > 0); ok(substr($quotes{"PRIDX","isodate"},0,4) == $year || substr($quotes{"PRIDX","isodate"},0,4) == $lastyear); ok(substr($quotes{"PRIDX","date"},6,4) == $year || substr($quotes{"PRIDX","date"},6,4) == $lastyear); # Check a bogus fund returns no-success %quotes = $q->troweprice("BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/trustnet.t000755 000765 000024 00000001751 12566055631 016175 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 12; # Test trustnet functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my @stocks = ("ABBEY NATIONAL INTERNATIONAL","MARLBOROUGH INTERNATIONAL EQUITY"); my %quotes = $q->fetch("trustnet",@stocks); ok(%quotes); # For each of our stocks, check to make sure we got back some # useful information. foreach my $stock (@stocks) { ok($quotes{$stock,"success"}); ok($quotes{$stock,"price"}); ok($quotes{$stock,"date"}); ok(substr($quotes{$stock,"isodate"},0,4) == $year || substr($quotes{$stock,"isodate"},0,4) == $lastyear); ok(substr($quotes{$stock,"date"},6,4) == $year || substr($quotes{$stock,"date"},6,4) == $lastyear); } # Test that a bogus stock gets no success. %quotes = $q->fetch("trustnet","BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/tsp.t000755 000765 000024 00000003272 12566055631 015113 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 22; # Test TSP functions. my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my $quoter = Finance::Quote->new(); my %quotes = $quoter->tsp("c","s","TSPgfund","BOGUS","l2040fund"); ok(%quotes); # Check that some values are defined. ok($quotes{"c","success"}); ok($quotes{"c","nav"} > 0); ok($quotes{"l2040fund","date"}); ok(substr($quotes{"l2040fund","isodate"},0,4) == $year || substr($quotes{"l2040fund","isodate"},0,4) == $lastyear); ok(substr($quotes{"l2040fund","date"},6,4) == $year || substr($quotes{"l2040fund","date"},6,4) == $lastyear); ok($quotes{"s","currency"}); ok($quotes{"s","name"}); ok($quotes{"TSPgfund","success"}); ok($quotes{"TSPgfund","nav"} > 0); ok($quotes{"TSPgfund","date"}); ok(substr($quotes{"TSPgfund","isodate"},0,4) == $year || substr($quotes{"TSPgfund","isodate"},0,4) == $lastyear); ok(substr($quotes{"TSPgfund","date"},6,4) == $year || substr($quotes{"TSPgfund","date"},6,4) == $lastyear); # Check that some values are undefined. ok( !defined($quotes{"c","exchange"}) ); # Check that a bogus fund returns no-success. ok( ! $quotes{"BOGUS","success"}); # Exercise the fetch function %quotes = $quoter->fetch("tsp","g","f","i","tsplincomefund"); ok(%quotes); ok($quotes{"g","success"}); ok($quotes{"f","nav"} > 0); ok($quotes{"i","date"}); ok(substr($quotes{"i","isodate"},0,4) == $year || substr($quotes{"i","isodate"},0,4) == $lastyear); ok(substr($quotes{"i","date"},6,4) == $year || substr($quotes{"i","date"},6,4) == $lastyear); ok($quotes{"tsplincomefund","nav"} > 0); Finance-Quote-1.38/t/tsx.t000755 000765 000024 00000001774 12566055631 015130 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Data::Dumper; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 26 ; # Test TSX functions. my $q = Finance::Quote->new(); my @stocks = ("NT", "BCE", "AER"); my %regexps = ( NT => qr/\bNortel\b/, BCE => qr/\b(BCE|Bell)\b/, AER => qr/\bAeroplan\b/, ); my %quotes = $q->fetch("tsx", @stocks); ok(%quotes); foreach my $stock (@stocks) { my $name = $quotes{$stock, "name"}; print "#Testing $stock: $name\n"; my $regexp = $regexps{$stock}; ok($name =~ /$regexp/i); ok($quotes{$stock, "exchange"} eq 'T'); ok($quotes{$stock, "method"} eq 'tsx'); ok($quotes{$stock, "last"} > 0); ok($quotes{$stock, "net"} =~ /^-?\d+\.\d+$/); ok($quotes{$stock, "p_change"} =~ /^-?\d+\.\d+$/); ok($quotes{$stock, "success"}); ok($quotes{$stock, "volume"} >= 0); } # Check that a bogus stock returns no-success. %quotes = $q->fetch("tsx", "BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/ukfunds.t000644 000765 000024 00000001437 12566055631 015762 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 8; my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->ukfunds("GB0031835118","GB0030880032","LU0116926998","BOGUS"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"GB0031835118","last"} > 0); ok($quotes{"GB0031835118","success"}); ok($quotes{"GB0030880032","last"} > 0); ok($quotes{"GB0030880032","success"}); ok($quotes{"LU0116926998","last"} > 0); ok($quotes{"LU0116926998","success"}); # Check that bogus stocks return failure: ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/union.t000755 000765 000024 00000001573 12566055631 015437 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 7; # Test TD Waterhouse functions. my $q = Finance::Quote->new(); my %quotes = $q->unionfunds("975792","12345"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"975792","last"} > 0); ok($quotes{"975792","success"}); ok($quotes{"975792", "currency"} eq "EUR"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; ok(substr($quotes{"975792","isodate"},0,4) eq $year || substr($quotes{"975792","isodate"},0,4) eq $lastyear); ok(substr($quotes{"975792","date"},6,4) eq $year || substr($quotes{"975792","date"},6,4) eq $lastyear); # Check that bogus stocks return failure: ok(! $quotes{"12345","success"}); Finance-Quote-1.38/t/usfedbonds.t000755 000765 000024 00000004004 12566055631 016433 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 19; # Test usfedbonds functions. my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my $q = Finance::Quote->new("USFedBonds"); #my %quotes = $q->usfedbonds("E197001.200606"); my %quotes = $q->usfedbonds("E197001.200606","E194112.200610","E194101.200610","E194001.200610","BOGUS"); ok(%quotes); TODO: { local $TODO="To be debugged"; # Check that the last and date values are defined. ok($quotes{"E197001.200606","success"}); ok($quotes{"E197001.200606","price"} > 0); ok(length($quotes{"E197001.200606","date"}) > 0); ok(substr($quotes{"E197001.200606","isodate"},0,4) eq $year || substr($quotes{"E197001.200606","isodate"},0,4) eq $lastyear); ok(substr($quotes{"E197001.200606","date"},6,4) eq $year || substr($quotes{"E197001.200606","date"},6,4) eq $lastyear); ok($quotes{"E197001.200606","currency"} eq "USD"); ok($quotes{"E194112.200610","success"}); ok($quotes{"E194112.200610","price"} > 0); ok(length($quotes{"E194112.200610","date"}) > 0); ok(substr($quotes{"E194112.200610","isodate"},0,4) eq $year || substr($quotes{"E194112.200610","isodate"},0,4) eq $lastyear); ok(substr($quotes{"E194112.200610","date"},6,4) eq $year || substr($quotes{"E194112.200610","date"},6,4) eq $lastyear); ok($quotes{"E194112.200610","currency"} eq "USD"); } # Check that a non-existent price returns no-success. ok($quotes{"E194101.200610","success"} == 0); TODO: { local $TODO="To be debugged"; ok($quotes{"E194101.200610","errormsg"} eq "No value found"); } # Check that a non-existent price returns no-success. ok($quotes{"E194001.200610","success"} == 0); TODO: { local $TODO="To be debugged"; ok($quotes{"E194001.200610","errormsg"} eq "Date not found"); } # Check that a bogus fund returns no-success. ok($quotes{"BOGUS","success"} == 0); ok($quotes{"BOGUS","errormsg"} eq "Parse error"); Finance-Quote-1.38/t/vanguard.t000755 000765 000024 00000001671 12566055631 016115 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 26; # Test Vanguard functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my @funds = qw/VBINX VIVAX VWINX VFIIX/; my %quotes = $q->vanguard(@funds); ok(%quotes); # Check that the name and last are defined for all of the funds. foreach my $fund (@funds) { ok($quotes{$fund,"last"} > 0); ok(length($quotes{$fund,"name"})); ok($quotes{$fund,"success"}); ok($quotes{$fund, "currency"} eq "USD"); ok(substr($quotes{$fund,"isodate"},0,4) == $year || substr($quotes{$fund,"isodate"},0,4) == $lastyear); ok(substr($quotes{$fund,"date"},6,4) == $year || substr($quotes{$fund,"date"},6,4) == $lastyear); } # Make sure we're not getting spurious percentage signs. ok($quotes{"VBINX","p_change"} !~ /%/); Finance-Quote-1.38/t/vwd.t000755 000765 000024 00000003656 12566055631 015113 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 1 + 3 * 6 + 2; # Test vwd functions. my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my $q = Finance::Quote->new("VWD"); my %quotes = $q->vwd("847402","LU0309191491","971675","BOGUS"); ok(%quotes); # Check that the last and date values are defined. ok($quotes{"847402","success"}); ok($quotes{"847402","last"} > 0); ok(length($quotes{"847402","date"}) > 0); ok(substr($quotes{"847402","isodate"},0,4) == $year || substr($quotes{"847402","isodate"},0,4) == $lastyear); ok(substr($quotes{"847402","date"},6,4) == $year || substr($quotes{"847402","date"},6,4) == $lastyear); ok($quotes{"847402","currency"} eq "EUR"); # Check that the last and date values are defined. ok($quotes{"LU0309191491","success"}); ok($quotes{"LU0309191491","last"} > 0); ok(length($quotes{"LU0309191491","date"}) > 0); ok(substr($quotes{"LU0309191491","isodate"},0,4) == $year || substr($quotes{"LU0309191491","isodate"},0,4) == $lastyear); ok(substr($quotes{"LU0309191491","date"},6,4) == $year || substr($quotes{"LU0309191491","date"},6,4) == $lastyear); ok($quotes{"LU0309191491","currency"} eq "EUR"); # Check that the last and date values are defined. stock 971675 ok($quotes{"971675","success"}); ok($quotes{"971675","last"} > 0); ok(length($quotes{"971675","date"}) > 0); ok(substr($quotes{"971675","isodate"},0,4) == $year || substr($quotes{"971675","isodate"},0,4) == $lastyear); ok(substr($quotes{"971675","date"},6,4) == $year || substr($quotes{"971675","date"},6,4) == $lastyear); ok($quotes{"971675","currency"} eq "DKK","Currency for 971675 (".$quotes{"971675","currency"}.") = DKK"); # Check that a bogus fund returns no-success. ok($quotes{"BOGUS","success"} == 0); ok($quotes{"BOGUS","errormsg"} eq "Parse error"); # invalid symbols not detected anymore Finance-Quote-1.38/t/yahoo.t000755 000765 000024 00000002121 12566055631 015414 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 11; # Test Yahoo functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->yahoo("IBM","CSCO","BOGUS"); ok(%quotes); # Check the last values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"IBM","last"} > 0); ok($quotes{"IBM","success"}); ok($quotes{"IBM", "currency"} eq "USD"); ok(($quotes{"IBM", "currency"} eq "USD") && !defined($quotes{"IBM","currency_set_by_fq"})); ok(substr($quotes{"IBM","isodate"},0,4) == $year || substr($quotes{"IBM","isodate"},0,4) == $lastyear); ok(substr($quotes{"IBM","date"},6,4) == $year || substr($quotes{"IBM","date"},6,4) == $lastyear); ok($quotes{"CSCO","last"} > 0); ok($quotes{"CSCO","success"}); # Make sure there are no spurious % signs. ok($quotes{"CSCO","p_change"} !~ /%/); # Check that bogus stocks return failure: ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/yahoo_asia.t000755 000765 000024 00000001776 12566055631 016430 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 9; # Test Yahoo_europe functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->asia("C76.SI","BOGUS.SI"); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"C76.SI","last"} > 0); ok(length($quotes{"C76.SI","name"}) > 0); ok($quotes{"C76.SI","success"}); ok($quotes{"C76.SI", "currency"} eq "SGD"); ok(substr($quotes{"C76.SI","isodate"},0,4) == $year || substr($quotes{"C76.SI","isodate"},0,4) == $lastyear); ok(substr($quotes{"C76.SI","date"},6,4) == $year || substr($quotes{"C76.SI","date"},6,4) == $lastyear); # Make sure we don't have spurious % signs. ok($quotes{"C76.SI","p_change"} !~ /%/); # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS.SI","success"}); Finance-Quote-1.38/t/yahoo_australia.t000755 000765 000024 00000002453 12566055631 017471 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 13; # Test Yahoo_europe functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->yahoo_australia("BHP","BOGUS"); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"BHP","last"} > 0); ok(length($quotes{"BHP","name"}) > 0); ok($quotes{"BHP","success"}); ok($quotes{"BHP", "currency"} eq "AUD"); ok(substr($quotes{"BHP","isodate"},0,4) == $year || substr($quotes{"BHP","isodate"},0,4) == $lastyear); ok(substr($quotes{"BHP","date"},6,4) == $year || substr($quotes{"BHP","date"},6,4) == $lastyear); # Make sure we don't have spurious % signs. ok($quotes{"BHP","p_change"} !~ /%/); TODO: { local $TODO = "Get quotes when '.AX' suffix is added"; my %suffix_quotes = $q->yahoo_australia("BHP.AX"); ok(%suffix_quotes); ok($suffix_quotes{"BHP.AX","last"} == $quotes{"BHP","last"}); ok($suffix_quotes{"BHP.AX","name"} eq $quotes{"BHP","name"}); ok($suffix_quotes{"BHP.AX","success"}); } # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/yahoo_brasil.t000755 000765 000024 00000002213 12566055631 016752 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 23; # Test Yahoo_europe functions. my $q = Finance::Quote->new(); my @stocks = ("PDGR3","PETR4","BAZA3"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->fetch("yahoo_brasil", @stocks); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. foreach my $stock (@stocks) { ok($quotes{$stock,"success"}); ok($quotes{$stock,"last"} > 0); ok(length($quotes{$stock,"name"}) > 0); ok($quotes{$stock, "currency"} eq "BRL"); ok((substr($quotes{$stock,"isodate"},0,4) == $year) || (substr($quotes{$stock,"isodate"},0,4) == $lastyear)); ok((substr($quotes{$stock,"date"},6,4) == $year) || (substr($quotes{$stock,"date"},6,4) == $lastyear)); # Make sure we don't have spurious % signs. ok($quotes{$stock,"p_change"} !~ /%/); } # Check that a bogus stock returns no-success. %quotes = $q->yahoo_brasil("BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/yahoo_europe.t000755 000765 000024 00000007672 12566055631 017013 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 34; # Test Yahoo_europe functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->yahoo_europe("UG.PA","BOGUS.L"); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"UG.PA","last"} > 0); ok(length($quotes{"UG.PA","name"}) > 0); ok($quotes{"UG.PA","success"}); ok($quotes{"UG.PA", "currency"} eq "EUR"); ok(substr($quotes{"UG.PA","isodate"},0,4) == $year || substr($quotes{"UG.PA","isodate"},0,4) == $lastyear); ok(substr($quotes{"UG.PA","date"},6,4) == $year || substr($quotes{"UG.PA","date"},6,4) == $lastyear); # Make sure we don't have spurious % signs. ok($quotes{"UG.PA","p_change"} !~ /%/); # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS","success"}); # London stocks can be returned in a variety of currencies my %londonquotes = $q->fetch("yahoo_europe","RDSB.L"); ok($londonquotes{"RDSB.L","success"}); ok($londonquotes{"RDSB.L","currency"} eq "GBP"); ok(($londonquotes{"RDSB.L","currency"} eq "GBP") && !defined($londonquotes{"RDSB.L","currency_set_by_fq"})); %londonquotes = $q->fetch("yahoo_europe","CCR.L"); ok($londonquotes{"CCR.L","success"}); ok($londonquotes{"CCR.L","currency"} eq "EUR"); ok(($londonquotes{"CCR.L","currency"} eq "EUR") && !defined($londonquotes{"CCR.L","currency_set_by_fq"})); # Copenhangen stocks should be returned in Danisk Krone (DKK). my %copenhagenquotes = $q->fetch("yahoo_europe","TDC.CO"); ok($copenhagenquotes{"TDC.CO","success"}); ok($copenhagenquotes{"TDC.CO","currency"} eq "DKK"); ok(($copenhagenquotes{"TDC.CO","currency"} eq "DKK") && !defined($copenhagenquotes{"TDC.CO","currency_set_by_fq"})); # Two stocks from the German XETRA. One in EUR and one in USD. my %xetraquotes = $q->fetch("yahoo_europe","DBK.DE", "ERM.DE"); ok($xetraquotes{"DBK.DE","success"}); ok($xetraquotes{"DBK.DE","currency"} eq "EUR"); ok(($xetraquotes{"DBK.DE","currency"} eq "EUR") && !defined($xetraquotes{"DBK.DE","currency_set_by_fq"})); # a stock from the Belgium Euronext market. my %belgiumquotes = $q->fetch("yahoo_europe","SOLB.BR"); ok($belgiumquotes{"SOLB.BR","success"}); ok($belgiumquotes{"SOLB.BR","currency"} eq "EUR"); ok(($belgiumquotes{"SOLB.BR","currency"} eq "EUR") && !defined($belgiumquotes{"SOLB.BR","currency_set_by_fq"})); ok($belgiumquotes{"SOLB.BR","last"}>=50); # this expected trades around 60-200 EUR ok($belgiumquotes{"SOLB.BR","last"}<=200); # Check if close is between year_range for LTI.L (expressed in GBp) for checking if conversion is correct my %ltiquotes = $q->fetch("yahoo_europe","LTI.L"); ok($ltiquotes{"LTI.L","success"}); my ($min,$max) = (50,50000); # change this if quotes are not supposed to be in this range anymore if ($ltiquotes{"LTI.L","year_range"}=~ m/([\d\.]+)\s*-\s*([\d\.]+)/) { my ($year_low,$year_high) = ($1,$2) ; ok (($year_low >= $min) && ($year_high <= $max)); # print "$year_low - $year_high\n"; } ok (($ltiquotes{"LTI.L","close"} >= $min) && ($ltiquotes{"LTI.L","close"} <= $max)); # check that A0GFY7.SG returns correctly the currency (reported by GnuCash user) %xetraquotes = $q->fetch("yahoo_europe","A0GFY7.SG"); ok($xetraquotes{"A0GFY7.SG","success"}); ok($xetraquotes{"A0GFY7.SG","currency"} eq "EUR"); ok(($xetraquotes{"A0GFY7.SG","currency"} eq "EUR") && !defined($xetraquotes{"A0GFY7.SG","currency_set_by_fq"})); TODO: { # Yahoo does not provide retrieval of ^DJI.US quotes since it lost # license for it. ^DJI can only be viewed on the html page anymore. We # need to write a HTML page scraper for this case local $TODO = "^DJI not returned by yahoo anymore."; %xetraquotes = $q->fetch("yahoo_europe","%40%5EDJI.US"); ok($xetraquotes{"^DJI","success"}); ok($xetraquotes{"^DJI","currency"} eq "USD"); } Finance-Quote-1.38/t/yahoo_nz.t000755 000765 000024 00000001732 12566055631 016132 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 9; # Test Yahoo_nz functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->yahoo_nz("AIA","BOGUS"); ok(%quotes); # Check the nav values are defined. These are the most # used and most reliable indicators of success. ok($quotes{"AIA","last"} > 0); ok(length($quotes{"AIA","name"}) > 0); ok($quotes{"AIA","success"}); ok($quotes{"AIA", "currency"} eq "NZD"); ok(substr($quotes{"AIA","isodate"},0,4) == $year || substr($quotes{"AIA","isodate"},0,4) == $lastyear); ok(substr($quotes{"AIA","date"},6,4) == $year || substr($quotes{"AIA","date"},6,4) == $lastyear); # Make sure we don't have spurious % signs. ok($quotes{"AIA","p_change"} !~ /%/); # Check that a bogus stock returns no-success. ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/t/yahoo_speed.t000644 000765 000024 00000002072 12566055631 016576 0ustar00ecstaff000000 000000 use strict; use warnings; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } my $q = Finance::Quote->new(); my @q = qw/ AAPL ADSK AFAM AFSI AHS AIG ALG AMBA AMT AMZN AN AP APOG ARCO ARO ASR ATHN ATVI AVAV BBY BIDU BIIB BKE BLX BMC BOOM BPI BR BRK-B BWLD CACC CBRL CBST CGA CINF CME COH COO COST CRH CROX CTAS CVA DDD DGS DNR DOW DVA DVN EBAY EBIX ERJ ESRX EXEL FB FLPKX GD GHDX GILD GOOG GOOGL GTI HAS HI HY IART IBKR ICON INFN INTC INVN IPGP IRM ISCA IYR JACK JBT KMX KNX KORS LDL LF LL LLL LNKD LOW LTM MA MCD MCF MCO MDP MDT MKL MOD MOV MSFT NFLX NOC NOK NVDA O OME ORCL OTEX PACR PAYX PCAR PEB PERY PHYS PNW POT PRAA RLI ROIC RPXC RRGB SAFM SBUX SCTY SE SH SHFL SINA SKX SLAB SNV SONC SPY SSW STON SUP SWPPX SYNA SZYM TECUA TGH TOL TSLA TTC TTS TUP TWI ULTA UNH USMO VIIIX WFC WFM WM WMT WU XLK YONG ZINC /; my %quotes = $q->yahoo( @q ); ok(%quotes, "Quote hash defined" ); foreach my $q (@q) { my $last = $quotes{$q,"last"}; ok( $last > 0, "$q: $last>0" ); } done_testing( 1+@q ); Finance-Quote-1.38/t/yahoojson.t000644 000765 000024 00000003755 12566055631 016321 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # A test script to check for working of the YahooJSON module. use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 52; my $q = Finance::Quote->new(); #List of stocks to fetch. Feel free to change this during testing my @stocks = ( "SUZLON.BO", "ANDHRABANK.BO", "RECLTD.NS", "AMZN", "SOLB.BR", "^DJI", "BEL20.BR" ); my %quotes = $q->fetch( "yahoo_json", @stocks ); ok( %quotes, "Data returned" ); foreach my $stock (@stocks) { my $name = $quotes{ $stock, "name" }; ok( $quotes{ $stock, "success" }, "Retrieved $stock" ); if ( !$quotes{ $stock, "success" } ) { my $errmsg = $quotes{ $stock, "errormsg" }; warn "Error Message:\n$errmsg\n"; } else { ok( $name, "Name is defined : $name" ); my $exchange = $quotes{ $stock, "exchange" }; ok( $exchange eq 'Sourced from Yahoo Finance (as JSON)', "correctly retrieved through YahooJSON" ); my $fetch_method = $quotes{ $stock, "method" }; ok( $fetch_method eq 'yahoo_json', "fetch_method is yahoo_json" ); my $last = $quotes{ $stock, "last" }; ok( $last > 0, "Last $last > 0" ); my $volume = $quotes{ $stock, "volume" }; ok( $volume > 0, "Volume $volume > 0" ) if ( $stock ne "BEL20.BR" ); my $type = $quotes{ $stock, "type" }; ok( $type, "Symbol type $type" ); #TODO: Add a test to raise a warning if the quote is excessively old my $isodate = $quotes{ $stock, "isodate" }; # print "ISOdate: $isodate "; my $date = $quotes{ $stock, "date" }; # currency for .BO stocks ok( $quotes { $stock, "currency" } eq 'INR', 'Bombay stocks have currency INR' ) if $stock =~ /\.BO$/ ; # print "Date: $date "; } } # Check that a bogus stock returns no-success. %quotes = $q->fetch( "yahoo_json", "BOGUS" ); ok( !$quotes{ "BOGUS", "success" }, "BOGUS failed" ); Finance-Quote-1.38/t/za.t000755 000765 000024 00000002434 12566055631 014716 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 17; # Test za functions. my $q = Finance::Quote->new("ZA"); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->za("AGL","AMS","BOGUS"); ok(%quotes); # Check that the last and date values are defined. ok($quotes{"AGL","success"}); ok($quotes{"AGL","last"} > 0); ok($quotes{"AGL","high"} > 0); ok($quotes{"AGL","low"} > 0); ok(length($quotes{"AGL","date"}) > 0); ok(substr($quotes{"AGL","isodate"},0,4) == $year || substr($quotes{"AGL","isodate"},0,4) == $lastyear); ok(substr($quotes{"AGL","date"},6,4) == $year || substr($quotes{"AGL","date"},6,4) == $lastyear); ok($quotes{"AGL","currency"} eq "ZAR"); ok($quotes{"AMS","success"}); ok($quotes{"AMS","last"} > 0); ok(length($quotes{"AMS","date"}) > 0); ok(substr($quotes{"AMS","isodate"},0,4) == $year || substr($quotes{"AMS","isodate"},0,4) == $lastyear); ok(substr($quotes{"AMS","date"},6,4) == $year || substr($quotes{"AMS","date"},6,4) == $lastyear); ok($quotes{"AMS","currency"} eq "ZAR"); # Check that a bogus fund returns no-success. ok($quotes{"BOGUS","success"} == 0); ok($quotes{"BOGUS","errormsg"} eq "Parse error"); Finance-Quote-1.38/t/za_unittrusts.t000644 000765 000024 00000002251 12566055631 017234 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use Test::More; use Finance::Quote; if (not $ENV{ONLINE_TEST}) { plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test'; } plan tests => 10; # Test za_unittrusts functions. my $q = Finance::Quote->new(); my $year = (localtime())[5] + 1900; my $lastyear = $year - 1; my %quotes = $q->za_unittrusts("15740"); ok(%quotes); # Check the last values are defined. These are the most used and most # reliable indicators of success. ok($quotes{"15740","last"} > 0); ok($quotes{"15740","success"}); ok(substr($quotes{"15740","date"},6,4) == $year || substr($quotes{"15740","date"},6,4) == $lastyear); # Exercise the fetch function a little. %quotes = $q->fetch("za_unittrusts","15740"); ok(%quotes); ok($quotes{"15740","last"} > 0); ok($quotes{"15740","success"} > 0); # Check that we're getting currency information. ok($quotes{"15740", "currency"} eq "ZAR"); # Check we're not getting bogus percentage signs. $quotes{"15740","p_change"} ||= ""; # Avoid warning if undefined. ok($quotes{"15740","p_change"} !~ /%/); # Check that looking up a bogus stock returns failure: %quotes = $q->za_unittrusts("BOGUS"); ok(! $quotes{"BOGUS","success"}); Finance-Quote-1.38/lib/Finance/000755 000765 000024 00000000000 12566055631 015757 5ustar00ecstaff000000 000000 Finance-Quote-1.38/lib/Finance/Quote/000755 000765 000024 00000000000 12566055631 017054 5ustar00ecstaff000000 000000 Finance-Quote-1.38/lib/Finance/Quote.pm000644 000765 000024 00000115130 12566055631 017413 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Paul Fenwick # Copyright (C) 2000, Brent Neal # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash package Finance::Quote; require 5.005; use strict; use Exporter (); use Carp; use Finance::Quote::UserAgent; use HTTP::Request::Common; use Encode; # use Data::Dumper; use vars qw/@ISA @EXPORT @EXPORT_OK @EXPORT_TAGS $TIMEOUT %MODULES %METHODS $AUTOLOAD $YAHOO_CURRENCY_URL $USE_EXPERIMENTAL_UA/; # Call on the Yahoo API: # - "f=l1" should return a single value - the "Last Trade (Price Only)" # - "s=" the value of s should be "=X" # where and are currencies # Excample: http://finance.yahoo.com/d/quotes.csv?f=l1&s=AUDGBP=X # Documentation can be found here: # http://code.google.com/p/yahoo-finance-managed/wiki/csvQuotesDownload $YAHOO_CURRENCY_URL = "http://finance.yahoo.com/d/quotes.csv?e=.csv&f=l1&s="; @ISA = qw/Exporter/; @EXPORT = (); @EXPORT_OK = qw/yahoo yahoo_europe fidelity troweprice asx tiaacref currency_lookup/; @EXPORT_TAGS = ( all => [@EXPORT_OK]); our $VERSION = '1.38'; # VERSION $USE_EXPERIMENTAL_UA = 0; # Autoload method for obsolete methods. This also allows people to # call methods that objects export without having to go through fetch. sub AUTOLOAD { my $method = $AUTOLOAD; $method =~ s/.*:://; # Force the dummy object (and hence default methods) to be loaded. _dummy(); # If the method we want is in %METHODS, then set up an appropriate # subroutine for it next time. if (exists($METHODS{$method})) { eval qq[sub $method { my \$this; if (ref \$_[0]) { \$this = shift; } \$this ||= _dummy(); \$this->fetch("$method",\@_); }]; carp $@ if $@; no strict 'refs'; # So we can use &$method return &$method(@_); } carp "$AUTOLOAD does not refer to a known method."; } # _load_module (private class method) # _load_module loads a module(s) and registers its various methods for # use. sub _load_modules { my $class = shift; my $baseclass = ref $class || $class; my @modules = @_; # Go to each module and use them. Also record what methods # they support and enter them into the %METHODS hash. foreach my $module (@modules) { my $modpath = "${baseclass}::${module}"; unless (defined($MODULES{$modpath})) { # Have to use an eval here because perl doesn't # like to use strings. eval "use $modpath;"; carp $@ if $@; $MODULES{$modpath} = 1; # Methodhash will continue method-name, function ref # pairs. my %methodhash = $modpath->methods; my %labelhash = $modpath->labels; # Find the labels that we can do currency conversion # on. my $curr_fields_func = $modpath->can("currency_fields") || \&default_currency_fields; my @currency_fields = &$curr_fields_func; # @currency_fields may contain duplicates. # This following chunk of code removes them. my %seen; @currency_fields=grep {!$seen{$_}++} @currency_fields; foreach my $method (keys %methodhash) { push (@{$METHODS{$method}}, { function => $methodhash{$method}, labels => $labelhash{$method}, currency_fields => \@currency_fields}); } } } } # ======================================================================= # new (public class method) # # Returns a new Finance::Quote object. If methods are asked for, then # it will load the relevant modules. With no arguments, this function # loads a default set of methods. sub new { my $self = shift; my $class = ref($self) || $self; my $this = {}; bless $this, $class; my @modules = (); my @reqmodules = (); # Requested modules. # If there's no argument list, but we have the appropriate # environment variable set, we'll use that instead. if ($ENV{FQ_LOAD_QUOTELET} and !@_) { @reqmodules = split(' ',$ENV{FQ_LOAD_QUOTELET}); } else { @reqmodules = @_; } # If we get an empty new(), or one starting with -defaults, # then load up the default methods. if (!@reqmodules or $reqmodules[0] eq "-defaults") { shift(@reqmodules) if (@reqmodules); # Default modules @modules = qw/AEX AIAHK ASEGR ASX BMONesbittBurns BSERO Bourso Cdnfundlibrary Citywire CSE Currencies Deka DWS FTPortfolios Fidelity FidelityFixed FinanceCanada Fool FTfunds HU GoldMoney HEX IndiaMutual LeRevenu ManInvestments Morningstar MorningstarJP MStaruk NZX Platinum SEB SIXfunds SIXshares StockHouseCanada TSP TSX Tdefunds Tdwaterhouse Tiaacref TNetuk Troweprice Trustnet Union USFedBonds VWD ZA Cominvest Finanzpartner YahooJSON Yahoo::Asia Yahoo::Australia Yahoo::Brasil Yahoo::Europe Yahoo::NZ Yahoo::USA YahooYQL ZA_UnitTrusts/; } $this->_load_modules(@modules,@reqmodules); $this->{TIMEOUT} = $TIMEOUT if defined($TIMEOUT); $this->{FAILOVER} = 1; $this->{REQUIRED} = []; return $this; } # ======================================================================= # _dummy (private function) # # _dummy returns a Finance::Quote object. I'd really rather not have # this, but to maintain backwards compatibility we hold on to it. { my $dummy_obj; sub _dummy { return $dummy_obj ||= Finance::Quote->new; } } # ======================================================================= # sources (public object method) # # sources returns a list of sources which can be passed to fetch to # obtain information. # # Usage: @sources = $quoter->sources(); # $sourceref = $quoter->sources(); sub sources { return(wantarray ? keys %METHODS : [keys %METHODS]); } # ======================================================================= # currency (public object method) # # currency allows the conversion of one currency to another. # # Usage: $quoter->currency("USD","AUD"); # $quoter->currency("15.95 USD","AUD"); # # undef is returned upon error. sub currency { my $this = shift if (ref($_[0])); $this ||= _dummy(); my ($from, $to) = @_; return undef unless ($from and $to); $from =~ s/^\s*(\d*\.?\d*)\s*//; my $amount = $1 || 1; # Don't know if these have to be in upper case, but it's # better to be safe than sorry. $to = uc($to); $from = uc($from); return $amount if ($from eq $to); # Trivial case. my $ua = $this->user_agent; # The response should be a single value (the exchange rate) my $data = $ua->request(GET "${YAHOO_CURRENCY_URL}${from}${to}=X")->content; my $exchange_rate = $data; $exchange_rate =~ s/,// ; # solve a bug when conversion rate # involves thousands. yahoo inserts # a comma when thousands occur { local $^W = 0; # Avoid undef warnings. # We force this to a number to avoid situations where # we may have extra cruft, or no amount. return undef unless ($exchange_rate+0); } if ( $exchange_rate < 0.001 ) { # exchange_rate is too little. we'll get more accuracy by using # the inverse rate and inverse it my $inverse_rate = $this->currency( $to, $from ); { local $^W = 0; return undef unless ( $exchange_rate + 0 ); } $exchange_rate = int( 100000000 / $inverse_rate + .5 ) / 100000000; } return ($exchange_rate * $amount); } # ======================================================================= # currency_lookup (public object method) # # search for available currency codes # # Usage: $quoter->currency_lookup({ name => qr/australia/i }); # $quoter->currency_lookup( code => 'EU' ); # $quoter->currency_lookup( name => 'Euro', code => qr/eu/i ); # $quoter->currency_lookup(); # # If more than one lookup parameter is given all must match for # a currency to match. # # undef is returned upon error. sub currency_lookup { my $this = shift if (ref $_[0]); $this ||= _dummy(); # Validate parameters my %valid_params = map { $_ => 1 } qw( name code ); my %params = @_; my $param_errors = 0; for my $key ( keys %params ) { if ( ! exists $valid_params{$key} ) { warn "Invalid parameter: ${key}"; $param_errors++; } } return undef if $param_errors > 0; # Retrieve known currencies my $known_currencies = Finance::Quote::Currencies::known_currencies(); # Return currencies based on parameters my $returned_currencies = {}; if ( scalar keys %params == 0 ) { $returned_currencies = $known_currencies; } else { for my $code ( keys %{$known_currencies} ) { # Make sure all parameters match my $matched = 0; if ( exists $params{name} && _smart_compare( $known_currencies->{$code}->{name}, $params{name} ) ) { $matched++; } if ( exists $params{code} && _smart_compare( $code, $params{code} ) ) { $matched++; } if ( $matched == scalar keys %params ) { $returned_currencies->{$code} = $known_currencies->{$code} } } } return $returned_currencies; } # _smart_compare (private method function) # # This function compares values where the method depends on the # type of the second parameter. # regex : compare as regex # scalar : test for substring match sub _smart_compare { my ($val1, $val2) = @_; if ( ref $val2 eq 'Regexp' ) { return $val1 =~ $val2; } else { return index($val1, $val2) > -1 } } # ======================================================================= # set_currency (public object method) # # set_currency allows information to be requested in the specified # currency. If called with no arguments then information is returned # in the default currency. # # Requesting stocks in a particular currency increases the time taken, # and the likelyhood of failure, as additional operations are required # to fetch the currency conversion information. # # This method should only be called from the quote object unless you # know what you are doing. sub set_currency { my $this = shift if (ref $_[0]); $this ||= _dummy(); unless (defined($_[0])) { delete $this->{"currency"}; } else { $this->{"currency"} = $_[0]; } } # default_currency_fields (public method) # # This is a list of fields that will be automatically converted during # currency conversion. If a module provides a currency_fields() # function then that list will be used instead. sub default_currency_fields { return qw/last high low net bid ask close open day_range year_range eps div cap nav price/; } # _convert (private object method) # # This function converts between one currency and another. It expects # to receive a hashref to the information, a reference to a list # of the stocks to be converted, and a reference to a list of fields # that conversion should apply to. { my %conversion; # Conversion lookup table. sub _convert { my $this = shift; my $info = shift; my $stocks = shift; my $convert_fields = shift; my $new_currency = $this->{"currency"}; # Skip all this unless they actually want conversion. return unless $new_currency; foreach my $stock (@$stocks) { my $currency; # Skip stocks that don't have a currency. next unless ($currency = $info->{$stock,"currency"}); # Skip if it's already in the same currency. next if ($currency eq $new_currency); # Lookup the currency conversion if we haven't # already. unless (exists $conversion{$currency,$new_currency}) { $conversion{$currency,$new_currency} = $this->currency($currency,$new_currency); } # Make sure we have a reasonable currency conversion. # If we don't, mark the stock as bad. unless ($conversion{$currency,$new_currency}) { $info->{$stock,"success"} = 0; $info->{$stock,"errormsg"} = "Currency conversion failed."; next; } # Okay, we have clean data. Convert it. Ideally # we'd like to just *= entire fields, but # unfortunately some things (like ranges, # capitalisation, etc) don't take well to that. # Hence we pull out any numbers we see, convert # them, and stick them back in. That's pretty # yucky, but it works. foreach my $field (@$convert_fields) { next unless (defined $info->{$stock,$field}); $info->{$stock,$field} = $this->scale_field($info->{$stock,$field},$conversion{$currency,$new_currency}); } # Set the new currency. $info->{$stock,"currency"} = $new_currency; } } } # ======================================================================= # Helper function that can scale a field. This is useful because it # handles things like ranges "105.4 - 108.3", and not just straight fields. # # The function takes a string or number to scale, and the factor to scale # it by. For example, scale_field("1023","0.01") would return "10.23". sub scale_field { shift if ref $_[0]; # Shift off the object, if there is one. my ($field, $scale) = @_; my @chunks = split(/([^0-9.])/,$field); for (my $i=0; $i < @chunks; $i++) { next unless $chunks[$i] =~ /\d/; $chunks[$i] *= $scale; } return join("",@chunks); } # ======================================================================= # Timeout code. If called on a particular object, then it sets # the timout for that object only. If called as a class method # (or as Finance::Quote::timeout) then it sets the default timeout # for all new objects that will be created. sub timeout { if (@_ == 1 or !ref($_[0])) { # Direct or class call. return $TIMEOUT = $_[0]; } # Otherwise we were called through an object. Yay. # Set the timeout in this object only. my $this = shift; return $this->{TIMEOUT} = shift; } # ======================================================================= # failover (public object method) # # This sets/gets whether or not it's acceptable to use failover techniques. sub failover { my $this = shift; my $value = shift; return $this->{FAILOVER} = $value if (defined($value)); return $this->{FAILOVER}; } # ======================================================================= # require_labels (public object method) # # Require_labels indicates which labels are required for lookups. Only methods # that have registered all the labels specified in the list passed to # require_labels() will be called. # # require_labels takes a list of required labels. When called with no # arguments, the require list is cleared. # # This method always succeeds. sub require_labels { my $this = shift; my @labels = @_; $this->{REQUIRED} = \@labels; return; } # _require_test (private object method) # # This function takes an array. It returns true if all required # labels appear in the arrayref. It returns false otherwise. # # This function could probably be made more efficient. sub _require_test { my $this = shift; my %available; @available{@_} = (); # Ooooh, hash-slice. :) my @required = @{$this->{REQUIRED}}; return 1 unless @required; for (my $i = 0; $i < @required; $i++) { return 0 unless exists $available{$required[$i]}; } return 1; } # ======================================================================= # fetch (public object method) # # Fetch is a wonderful generic fetcher. It takes a method and stuff to # fetch. It's a nicer interface for when you have a list of stocks with # different sources which you wish to deal with. sub fetch { my $this = shift if ref ($_[0]); $this ||= _dummy(); my $method = lc(shift); my @stocks = @_; unless (exists $METHODS{$method}) { carp "Undefined fetch-method $method passed to ". "Finance::Quote::fetch"; return; } # Failover code. This steps through all availabe methods while # we still have failed stocks to look-up. This loop only # runs a single time unless FAILOVER is defined. my %returnhash = (); foreach my $methodinfo (@{$METHODS{$method}}) { my $funcref = $methodinfo->{"function"}; next unless $this->_require_test(@{$methodinfo->{"labels"}}); my @failed_stocks = (); %returnhash = (%returnhash,&$funcref($this,@stocks)); foreach my $stock (@stocks) { push(@failed_stocks,$stock) unless ($returnhash{$stock,"success"}); } $this->_convert(\%returnhash,\@stocks, $methodinfo->{"currency_fields"}); last unless $this->{FAILOVER}; last unless @failed_stocks; @stocks = @failed_stocks; } return wantarray() ? %returnhash : \%returnhash; } # ======================================================================= # user_agent (public object method) # # Returns a LWP::UserAgent which conforms to the relevant timeouts, # proxies, and other settings on the particular Finance::Quote object. # # This function is mainly intended to be used by the modules that we load, # but it can be used by the application to directly play with the # user-agent settings. sub user_agent { my $this = shift; return $this->{UserAgent} if $this->{UserAgent}; my $ua; if ($USE_EXPERIMENTAL_UA) { $ua = Finance::Quote::UserAgent->new; } else { $ua = LWP::UserAgent->new; } $ua->timeout($this->{TIMEOUT}) if defined($this->{TIMEOUT}); $ua->env_proxy; $this->{UserAgent} = $ua; return $ua; } # ======================================================================= # parse_csv (public object method) # # Grabbed from the Perl Cookbook. Parsing csv isn't as simple as you thought! # sub parse_csv { shift if (ref $_[0]); # Shift off the object if we have one. my $text = shift; # record containing comma-separated values my @new = (); push(@new, $+) while $text =~ m{ # the first part groups the phrase inside the quotes. # see explanation of this pattern in MRE "([^\"\\]*(?:\\.[^\"\\]*)*)",? | ([^,]+),? | , }gx; push(@new, undef) if substr($text, -1,1) eq ','; return @new; # list of values that were comma-separated } # ======================================================================= # parse_csv_semicolon (public object method) # # Grabbed from the Perl Cookbook. Parsing csv isn't as simple as you thought! # sub parse_csv_semicolon { shift if (ref $_[0]); # Shift off the object if we have one. my $text = shift; # record containing comma-separated values my @new = (); push(@new, $+) while $text =~ m{ # the first part groups the phrase inside the quotes. # see explanation of this pattern in MRE "([^\"\\]*(?:\\.[^\"\\]*)*)";? | ([^;]+);? | ; }gx; push(@new, undef) if substr($text, -1,1) eq ';'; return @new; # list of values that were comma-separated } # ======================================================================= # store_date (public object method) # # Given the various pieces of a date, this functions figure out how to # store them in both the pre-existing US date format (mm/dd/yyyy), and # also in the ISO date format (yyyy-mm-dd). This function expects to # be called with the arguments: # # (inforef, symbol_name, data_hash) # # The components of date hash can be any of: # # usdate - A date in mm/dd/yy or mm/dd/yyyy # eurodate - A date in dd/mm/yy or dd/mm/yyyy # isodate - A date in yy-mm-dd or yyyy-mm-dd # year - The year in yyyy # month - The month in mm or mmm format (i.e. 07 or Jul) # day - The day # today - A flag to indicate todays date should be used. # # The separator for the *date forms is ignored. It can be any # non-alphanumeric character. Any combination of year, month, and day # values can be provided. Missing fields are filled in based upon # today's date. # sub store_date { my $this = shift; my $inforef = shift; my $symbol = shift; my $piecesref = shift; my ($year, $month, $day, $this_month, $year_specified); my %mnames = (jan => 1, feb => 2, mar => 3, apr => 4, may => 5, jun => 6, jul => 7, aug => 8, sep => 9, oct =>10, nov =>11, dec =>12); # printf "In store_date\n"; # print "inforef $inforef\n"; # print "piecesref $piecesref\n"; # foreach my $key (keys %$piecesref) { # printf (" %s: %s\n", $key, $piecesref->{$key}); # } # Default to today's date. ($month, $day, $year) = (localtime())[4,3,5]; $month++; $year += 1900; $this_month = $month; $year_specified = 0; # Proces the inputs if (defined $piecesref->{isodate}) { ($year, $month, $day) = ($piecesref->{isodate} =~ m/(\d+)\W+(\w+)\W+(\d+)/); $year += 2000 if $year < 100; $year_specified = 1; $inforef->{$symbol, "a"} = sprintf ("Defaults: Year %d, Month %s, Day %d\n", $year, $month, $day); # printf ("ISO Date %s: Year %d, Month %s, Day %d\n", $piecesref->{isodate}, $year, $month, $day); } if (defined $piecesref->{usdate}) { ($month, $day, $year) = ($piecesref->{usdate} =~ /(\w+)\W+(\d+)\W+(\d+)/); $year += 2000 if $year < 100; $year_specified = 1; # printf ("US Date %s: Month %s, Day %d, Year %d\n", $piecesref->{usdate}, $month, $day, $year); } if (defined $piecesref->{eurodate}) { ($day, $month, $year) = ($piecesref->{eurodate} =~ /(\d+)\W+(\w+)\W+(\d+)/); $year += 2000 if $year < 100; $year_specified = 1; # printf ("Euro Date %s: Day %d, Month %s, Year %d\n", $piecesref->{eurodate}, $day, $month, $year); } if (defined ($piecesref->{year})) { $year = $piecesref->{year}; $year += 2000 if $year < 100; $year_specified = 1; } $month = $piecesref->{month} if defined ($piecesref->{month}); $month = $mnames{lc(substr($month,0,3))} if ($month =~ /\D/); $day = $piecesref->{day} if defined ($piecesref->{day}); $year-- if (($year_specified == 0) && ($this_month < $month)); $inforef->{$symbol, "date"} = sprintf "%02d/%02d/%04d", $month, $day, $year; $inforef->{$symbol, "isodate"} = sprintf "%04d-%02d-%02d", $year, $month, $day; } sub isoTime { my ($self,$timeString) = @_ ; $timeString =~ tr/ //d ; $timeString = uc $timeString ; my $retTime = "00:00"; # return zero time if unparsable input if ($timeString=~m/^(\d+)[\.:UH](\d+)(AM|PM)?/) { my ($hours,$mins)= ($1-0,$2-0) ; $hours-=12 if ($hours==12); $hours+=12 if ($3 && ($3 eq "PM")) ; if ($hours>=0 && $hours<=23 && $mins>=0 && $mins<=59 ) { $retTime = sprintf ("%02d:%02d", $hours, $mins) ; } } return $retTime; } # If $str ends with a B like "20B" or "1.6B" then expand it as billions like # "20000000000" or "1600000000". # # This is done with string manipulations so floating-point rounding doesn't # produce spurious digits for values like "1.6" which aren't exactly # representable in binary. # # Is "B" for billions the only abbreviation from Yahoo? # Could extend and rename this if there's also millions or thousands. # # For reference, if the value was just for use within perl then simply # substituting to exponential "1.5e9" might work. But expanding to full # digits seems a better idea as the value is likely to be printed directly # as a string. sub B_to_billions { my ($self,$str) = @_; ### B_to_billions(): $str if ($str =~ s/B$//i) { $str = $self->decimal_shiftup ($str, 9); } return $str; } # $str is a number like "123" or "123.45" # return it with the decimal point moved $shift places to the right # must have $shift>=1 # eg. decimal_shiftup("123",3) -> "123000" # decimal_shiftup("123.45",1) -> "1234.5" # decimal_shiftup("0.25",1) -> "2.5" # sub decimal_shiftup { my ($self, $str, $shift) = @_; # delete decimal point and set $after to count of chars after decimal. # Leading "0" as in "0.25" is deleted too giving "25" so as not to end up # with something that might look like leading 0 for octal. my $after = ($str =~ s/(?:^0)?\.(.*)/$1/ ? length($1) : 0); $shift -= $after; # now $str is an integer and $shift is relative to the end of $str if ($shift >= 0) { # moving right, eg. "1234" becomes "12334000" return $str . ('0' x $shift); # extra zeros appended } else { # negative means left, eg. "12345" becomes "12.345" # no need to prepend zeros since demanding initial $shift>=1 substr ($str, $shift,0, '.'); # new '.' at shifted spot from end return $str; } } # Dummy destroy function to avoid AUTOLOAD catching it. sub DESTROY { return; } 1; __END__ =head1 NAME Finance::Quote - Get stock and mutual fund quotes from various exchanges =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; $q->timeout(60); $conversion_rate = $q->currency("AUD","USD"); $q->set_currency("EUR"); # Return all info in Euros. $q->require_labels(qw/price date high low volume/); $q->failover(1); # Set failover support (on by default). %quotes = $q->fetch("nasdaq",@stocks); $hashref = $q->fetch("nyse",@stocks); =head1 DESCRIPTION This module gets stock quotes from various internet sources, including Yahoo! Finance, Fidelity Investments, and the Australian Stock Exchange. There are two methods of using this module -- a functional interface that is deprecated, and an object-orientated method that provides greater flexibility and stability. With the exception of straight currency exchange rates, all information is returned as a two-dimensional hash (or a reference to such a hash, if called in a scalar context). For example: %info = $q->fetch("australia","CML"); print "The price of CML is ".$info{"CML","price"}; The first part of the hash (eg, "CML") is referred to as the stock. The second part (in this case, "price") is referred to as the label. =head2 LABELS When information about a stock is returned, the following standard labels may be used. Some custom-written modules may use labels not mentioned here. If you wish to be certain that you obtain a certain set of labels for a given stock, you can specify that using require_labels(). name Company or Mutual Fund Name last Last Price high Highest trade today low Lowest trade today date Last Trade Date (MM/DD/YY format) time Last Trade Time net Net Change p_change Percent Change from previous day's close volume Volume avg_vol Average Daily Vol bid Bid ask Ask close Previous Close open Today's Open day_range Day's Range year_range 52-Week Range eps Earnings per Share pe P/E Ratio div_date Dividend Pay Date div Dividend per Share div_yield Dividend Yield cap Market Capitalization ex_div Ex-Dividend Date. nav Net Asset Value yield Yield (usually 30 day avg) exchange The exchange the information was obtained from. success Did the stock successfully return information? (true/false) errormsg If success is false, this field may contain the reason why. method The module (as could be passed to fetch) which found this information. type The type of equity returned If all stock lookups fail (possibly because of a failed connection) then the empty list may be returned, or undef in a scalar context. =head1 INSTALLATION To install this module, run the following commands: perl Makefile.PL make make test make install For more detailed instructions, please see the INSTALL file. =head1 SUPPORT AND DOCUMENTATION After installing, you can find documentation for this module with the perldoc command. perldoc Finance::Quote You can also look for information at: =over =item RT, CPAN's request tracker http://rt.cpan.org/NoAuth/Bugs.html?Dist=Finance-Quote =item AnnoCPAN, Annotated CPAN documentation http://annocpan.org/dist/Finance-Quote =item CPAN Ratings http://cpanratings.perl.org/d/Finance-Quote =item Search CPAN http://search.cpan.org/dist/Finance-Quote =item The Finance::Quote home page http://finance-quote.sourceforge.net/ =item The Finance::YahooQuote home page http://www.padz.net/~djpadz/YahooQuote/ =item The GnuCash home page http://www.gnucash.org/ =back =head1 AVAILABLE METHODS =head2 NEW my $q = Finance::Quote->new; my $q = Finance::Quote->new("ASX"); my $q = Finance::Quote->new("-defaults", "CustomModule"); With no arguents, this creates a new Finance::Quote object with the default methods. If the environment variable FQ_LOAD_QUOTELET is set, then the contents of FQ_LOAD_QUOTELET (split on whitespace) will be used as the argument list. This allows users to load their own custom modules without having to change existing code. If you do not want users to be able to load their own modules at run-time, pass an explicit argumetn to ->new() (usually "-defaults"). When new() is passed one or more arguments, an object is created with only the specified modules loaded. If the first argument is "-defaults", then the default modules will be loaded first, followed by any other specified modules. Note that the FQ_LOAD_QUOTELET environment variable must begin with "-defaults" if you wish the default modules to be loaded. Any modules specified will automatically be looked for in the Finance::Quote:: module-space. Hence, Finance::Quote->new("ASX") will load the module Finance::Quote::ASX. Please read the Finance::Quote hacker's guide for information on how to create new modules for Finance::Quote. =head2 FETCH my %stocks = $q->fetch("usa","IBM","MSFT","LNUX"); my $hashref = $q->fetch("usa","IBM","MSFT","LNUX"); Fetch takes an exchange as its first argument. The second and remaining arguments are treated as stock-names. In the standard Finance::Quote distribution, the following exchanges are recognised: australia Australan Stock Exchange dwsfunds Deutsche Bank Gruppe funds fidelity Fidelity Investments tiaacref TIAA-CREF troweprice T. Rowe Price europe European Markets canada Canadian Markets usa USA Markets nyse New York Stock Exchange nasdaq NASDAQ uk_unit_trusts UK Unit Trusts vanguard Vanguard Investments vwd Vereinigte Wirtschaftsdienste GmbH When called in an array context, a hash is returned. In a scalar context, a reference to a hash will be returned. The structure of this hash is described earlier in this document. The fetch method automatically arranges for failover support and currency conversion if requested. If you wish to fetch information from only one particular source, then consult the documentation of that sub-module for further information. =head2 SOURCES my @sources = $q->sources; my $listref = $q->sources; The sources method returns a list of sources that have currently been loaded and can be passed to the fetch method. If you're providing a user with a list of sources to choose from, then it is recommended that you use this method. =head2 CURRENCY_LOOKUP $currencies_by_name = $q->currency_lookup( name => 'Australian' ); $currencies_by_code = $q->currency_lookup( code => qr/^b/i ); $currencies_by_both = $q->currency_lookup( name => qr/pound/i , code => 'GB' ); The currency_lookup method provides a search against the known currencies. The list of currencies is based on the available currencies in the Yahoo Currency Converter (the list is stored within the module as the list should be fairly static). The lookup can be done by currency name (ie "Australian Dollar"), by code (ie "AUD") or both. You can pass either a scalar or regular expression as a search value - scalar values are matched by substring while regular expressions are matched as-is (no changes are made to the expression). See L (and the C test file) for a way to make sure that the stored currency list is up to date. =head2 CURRENCY $conversion_rate = $q->currency("USD","AUD"); The currency method takes two arguments, and returns a conversion rate that can be used to convert from the first currency into the second. In the example above, we've requested the factor that would convert US dollars into Australian dollars. The currency method will return a false value if a given currency conversion cannot be fetched. At the moment, currency rates are fetched from Yahoo!, and the information returned is governed by Yahoo!'s terms and conditions. See Finance::Quote::Yahoo for more information. =head2 SET_CURRENCY $q->set_currency("FRF"); # Get results in French Francs. The set_currency method can be used to request that all information be returned in the specified currency. Note that this increases the chance stock-lookup failure, as remote requests must be made to fetch both the stock information and the currency rates. In order to improve reliability and speed performance, currency conversion rates are cached and are assumed not to change for the duration of the Finance::Quote object. At this time, currency conversions are only looked up using Yahoo!'s services, and hence information obtained with automatic currency conversion is bound by Yahoo!'s terms and conditions. =head2 FAILOVER $q->failover(1); # Set automatic failover support. $q->failover(0); # Disable failover support. The failover method takes a single argument which either sets (if true) or unsets (if false) automatic failover support. If automatic failover support is enabled (default) then multiple information sources will be tried if one or more sources fail to return the requested information. Failover support will significantly increase the time spent looking for a non-existant stock. If the failover method is called with no arguments, or with an undefined argument, it will return the current failover state (true/false). =head2 USER_AGENT my $ua = $q->user_agent; The user_agent method returns the LWP::UserAgent object that Finance::Quote and its helpers use. Normally this would not be useful to an application, however it is possible to modify the user-agent directly using this method: $q->user_agent->timeout(10); # Set the timeout directly. =head2 SCALE_FIELD my $pounds = $q->scale_field($item_in_pence,0.01); The scale_field() function is a helper that can scale complex fields such as ranges (eg, "102.5 - 103.8") and other fields where the numbers should be scaled but any surrounding text preserved. It's most useful in writing new Finance::Quote modules where you may retrieve information in a non-ISO4217 unit (such as cents) and would like to scale it to a more useful unit (like dollars). =head2 ISOTIME $q->isoTime("11:39PM"); # returns "23:39" $q->isoTime("9:10 AM"); # returns "09:10" This function will return a isoformatted time =head1 ENVIRONMENT Finance::Quote respects all environment that your installed version of LWP::UserAgent respects. Most importantly, it respects the http_proxy environment variable. =head1 BUGS There are no ways for a user to define a failover list. The two-dimensional hash is a somewhat unwieldly method of passing around information when compared to references. A future release is planned that will allow for information to be returned in a more flexible $hash{$stock}{$label} style format. There is no way to override the default behaviour to cache currency conversion rates. =head1 COPYRIGHT & LICENSE Copyright 1998, Dj Padzensky Copyright 1998, 1999 Linas Vepstas Copyright 2000, Yannick LE NY (update for Yahoo Europe and YahooQuote) Copyright 2000-2001, Paul Fenwick (updates for ASX, maintainence and release) Copyright 2000-2001, Brent Neal (update for TIAA-CREF) Copyright 2000 Volker Stuerzl (DWS and VWD support) Copyright 2000 Keith Refson (Trustnet support) Copyright 2001 Rob Sessink (AEX support) Copyright 2001 Leigh Wedding (ASX updates) Copyright 2001 Tobias Vancura (Fool support) Copyright 2001 James Treacy (TD Waterhouse support) Copyright 2008 Erik Colson (isoTime) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Currency information fetched through this module is bound by Yahoo!'s terms and conditons. Other copyrights and conditions may apply to data fetched through this module. Please refer to the sub-modules for further information. =head1 AUTHORS Dj Padzensky , PadzNet, Inc. Linas Vepstas Yannick LE NY Paul Fenwick Brent Neal Volker Stuerzl Keith Refson Rob Sessink Leigh Wedding Tobias Vancura James Treacy Bradley Dean Erik Colson The Finance::Quote home page can be found at http://finance-quote.sourceforge.net/ The Finance::YahooQuote home page can be found at http://www.padz.net/~djpadz/YahooQuote/ The GnuCash home page can be found at http://www.gnucash.org/ =head1 SEE ALSO Finance::Quote::AEX, Finance::Quote::ASX, Finance::Quote::Cdnfundlibrary, Finance::Quote::DWS, Finance::Quote::Fidelity, Finance::Quote::FinanceCanada, Finance::Quote::Fool, Finance::Quote::FTPortfolios, Finance::Quote::Tdefunds, Finance::Quote::Tdwaterhouse, Finance::Quote::Tiaacref, Finance::Quote::Troweprice, Finance::Quote::Trustnet, Finance::Quote::VWD, Finance::Quote::Yahoo::Australia, Finance::Quote::Yahoo::Europe, Finance::Quote::Yahoo::USA, LWP::UserAgent You should have also received the Finance::Quote hacker's guide with this package. Please read it if you are interested in adding extra methods to this package. The hacker's guide can also be found on the Finance::Quote website, http://finance-quote.sourceforge.net/ =cut Finance-Quote-1.38/lib/Finance/Quote/AEX.pm000644 000765 000024 00000016712 12566055631 020036 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Paul Fenwick # Copyright (C) 2000, Brent Neal # Copyright (C) 2001, Rob Sessink # Copyright (C) 2003, Pawel Konieczny # Copyright (C) 2004, Johan van Oostrum # Copyright (C) 2009, Herman van Rink # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash require 5.005; use strict; package Finance::Quote::AEX; use vars qw( $AEX_URL); use LWP::UserAgent; use HTTP::Request::Common qw(POST); use HTML::TableExtract; use CGI; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information my $AEX_URL = "http://www.euronext.com/search/download/trapridownloadpopup.jcsv?pricesearchresults=actif&filter=1&belongsToList=market_EURLS&mep=8626&lan=NL&resultsTitle=Amsterdam+-+Euronext&cha=1800&format=txt&formatDecimal=.&formatDate=dd/MM/yy"; sub methods { return (dutch => \&aex, aex => \&aex) } { my @labels = qw/name symbol price last date time p_change bid ask offer open high low close volume currency method exchange/; sub labels { return (dutch => \@labels, aex => \@labels) } } # ============================================================================== ######################################################################## # Stocks and indices sub aex { my $quoter = shift; my @symbols = @_; return unless @symbols; my (%info,$url,$reply,$te); my ($row, $datarow, $matches); my ($time); $url = $AEX_URL; # base url # Create a user agent object and HTTP headers my $ua = new LWP::UserAgent(agent => 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)'); # Compose POST request my $request = new HTTP::Request("GET", $url); $reply = $ua->request( $request ); #print Dumper $reply; if ($reply->is_success) { # Write retreived data to temp file for debugging use POSIX; my $filename = tmpnam(); open my $fw, ">", $filename or die "$filename: $!"; print $fw $reply->content; close $fw; # Open reply to read lins open FP, "<", \$reply->content or die "Unable to read data: $!"; # Open temp file instead while debugging #open FP, "<", $filename or die "Unable to read data: $!"; # Skip the first 4 lines, which are not CSV my $dummy = ; # Typical content: Stocks $dummy = ; # Typical content: Amsterdam - Euronext $dummy = ; # Typical content: $dummy = ; # Typical content: Instrument's name;ISIN;Euronext code;Market;Symbol;ICB Sector (Level 4);Handelsvaluta;Laatst;Aantal;D/D-1 (%);Datum-tijd (CET);Omzet;Totaal aantal aandelen;Capitalisation;Trading mode;Dag Open;Dag Hoog;Dag Hoog / Datum-tijd (CET);Dag Laag;Dag Laag / Datum-tijd (CET); 31-12/Change (%); 31-12/Hoog; 31-12/Hoog/Datum; 31-12/Laag; 31-12/Laag/Datum; 52 weken/Change (%); 52 weken/Hoog; 52 weken/Hoog/Datum; 52 weken/Laag; 52 weken/Laag/Datum;Suspended;Suspended / Datum-tijd (CET);Reserved;Reserved / Datum-tijd (CET) while (my $line = ) { #print Dumper $line; my @row_data = $quoter->parse_csv_semicolon($line); #print Dumper \@row_data; my $row = \@row_data; #print Dumper $row; next unless @row_data; foreach my $symbol (@symbols) { my $found = 0; # Match Fund's name, ISIN or symbol my $currentSymbol = 0; foreach my $i (0,1,4) { $currentSymbol = ( @$row[$i] eq $symbol ) if defined(@$row[$i]); last if $currentSymbol; } if ( $currentSymbol ) { $info {$symbol, "exchange"} = "Amsterdam Euronext eXchange"; $info {$symbol, "method"} = "aex"; $info {$symbol, "symbol"} = @$row[4]; ($info {$symbol, "last"} = @$row[7]) =~ s/\s*//g; $info {$symbol, "bid"} = undef; $info {$symbol, "offer"} = undef; $info {$symbol, "low"} = @$row[18]; $info {$symbol, "close"} = undef; $info {$symbol, "p_change"} = @$row[9]; ($info {$symbol, "high"} = @$row[16]) =~ s/\s*//g; ($info {$symbol, "volume"} = @$row[8]) =~ s/\s*//g; # Split the date and time from one table entity my $dateTime = @$row[10]; # Check for "dd mmm yyyy hh:mm" date/time format like "01 Aug 2004 16:34" if ($dateTime =~ m/(\d{2})\/(\d{2})\/(\d{2}) \s (\d{2}:\d{2})/xi ) { $quoter->store_date(\%info, $symbol, {month => $2, day => $1, year => $3}); } $info {$symbol, "currency"} = "EUR"; $info {$symbol, "success"} = 1; } } } } foreach my $symbol (@symbols) { unless ( !defined($info {$symbol, "success"}) || $info {$symbol, "success"} == 1 ) { $info {$symbol,"success"} = 0; $info {$symbol,"errormsg"} = "Fund name $symbol not found"; next; } } #print Dumper \%info; return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::AEX Obtain quotes from Amsterdam Euronext eXchange =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("aex","AAB 93-08 7.5"); # Only query AEX %info = Finance::Quote->fetch("dutch","AAB 93-08 7.5"); # Failover to other sources OK =head1 DESCRIPTION This module fetches information from the "Amsterdam Euronext eXchange AEX" http://www.aex.nl. Only local Dutch investment funds and all traded here options and futures are available. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "AEX" in the argument list to Finance::Quote->new(). Information obtained by this module may be covered by www.aex.nl terms and conditions See http://www.aex.nl/ for details. =head2 Stocks And Indices This module provides both the "aex" and "dutch" fetch methods for fetching stock and index quotes. Please use the "dutch" fetch method if you wish to have failover with future sources for Dutch stocks. Using the "aex" method will guarantee that your information only comes from the Euronext Amsterdam website. Note that options and futures are not supported by this module. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::AEX : name, last, date, p_change, bid, offer, open, high, low, close, volume, currency, method, exchange, time. =head1 SEE ALSO Amsterdam Euronext eXchange, http://www.aex.nl =cut Finance-Quote-1.38/lib/Finance/Quote/AIAHK.pm000644 000765 000024 00000012154 12566055631 020232 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # This module is based on a perl script from Wouter van Marle # and on the existing # Finance::Quote::ASEGR module. # # The two were compined by David Hampton to # be able to retrieve stock information from the American # International Assurance website in Hong Kong. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA require 5.005; use strict; package Finance::Quote::AIAHK; use vars qw( $AIAHK_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION $AIAHK_URL = 'http://www.aia.com.hk/daily/fund_mst_rightb.asp?cat=BR_AC'; sub methods { return (aiahk => \&aiahk); } { my @labels = qw/name code date isodate price bid offer p_change_3m p_change_1y p_change_3y currency method exchange/; sub labels { return (aiahk => \@labels); } } sub aiahk { my $quoter = shift; my @funds = @_; my (%info,$reply,$url,$te,$fund); my $ua = $quoter->user_agent(); $url=$AIAHK_URL; $reply = $ua->request(GET $url); if (!$reply->is_success) { print("1\n"); foreach my $fund (@funds) { print("2\n"); $info{$fund, "success"}=0; $info{$fund, "errormsg"}="Error retreiving fund quote page."; } return wantarray() ? %info : \%info; } #print($reply->content, "\n"); # Now parse the data table contained in the result. This is the # inner of two tables. There are no headers on this table as they # are part of the iframe containing this page. $te= new HTML::TableExtract(depth => 1); $te->parse($reply->content); unless ($te->tables) { foreach $fund (@funds) { $info {$fund,"success"} = 0; $info {$fund,"errormsg"} = "Error parsing fund table"; } return wantarray() ? %info : \%info; } # Was there a parse failure? If so, record an error for each # requested find and get out now. my @rows; unless (@rows = $te->rows) { foreach $fund (@funds) { $info {$fund,"success"} = 0; $info {$fund,"errormsg"} = "Parse error"; } return wantarray() ? %info : \%info; } # Now find the data for the requested funds. This is an O(n^^2) # algorithm; no way around it. foreach $fund (@funds) { my $found = 0; foreach my $row (@rows) { next if $$row[1] ne $fund; my $tmp; $info{$fund, "success"}=1; $info{$fund, "exchange"}="American International Assurance, Hong Kong"; $info{$fund, "method"}="aiahk"; $info{$fund, "name"}=$$row[0]; $info{$fund, "name"} =~ s/^\s*(.*)\s*$/$1/; $info{$fund, "symbol"}=$fund; $quoter->store_date(\%info, $fund, {usdate => $$row[2]}); if ($$row[3] =~ /yield/i) { ($info{$fund, "yield"}) = $$row[3] =~ m/yield = ([0-9.%]+)/i; } else { ($tmp=$$row[3]) =~ s/\s*//g; ($info{$fund, "currency"}, $info{$fund, "bid"}) = $tmp =~ m/([A-Z]+)[^0-9]+([0-9.]+)/; ($tmp=$$row[4]) =~ s/\s*//g; ($tmp, $info{$fund, "offer"}) = $tmp =~ m/([A-Z]+)[^0-9]+([0-9.]+)/; $info{$fund, "price"} = $info{$fund, "bid"}; $info{$fund,"currency"}="USD" if $info{$fund,"currency"} eq "US"; $info{$fund,"currency"}="HKD" if $info{$fund,"currency"} eq "HK"; $info{$fund,"currency"}="JPY" if $info{$fund,"currency"} eq "YEN"; } # $info{$fund, "p_change_3m"}=$$row[5]; # $info{$fund, "p_change_1y"}=$$row[6]; # $info{$fund, "p_change_3y"}=$$row[7]; $found = 1; last; } $info{$fund, "success"}=$found; $info{$fund, "errormsg"}="Fund $fund not found in list " if !$found; } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::AIAHK Obtain quotes from American International Assurance =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("aiahk","SCH-HKEQ"); =head1 DESCRIPTION This module fetches information from the American International Assurance http://www.aia.com.hk. All funds are available. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "AIAHK" in the argument list to Finance::Quote->new(). Information obtained by this module may be covered by www.aia.com.hk terms and conditions See http://www.aia.com.hk/ for details. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::AIAHK : name code date isodate price bid offer p_change_3m p_change_1y p_change_3y currency method exchange =head1 SEE ALSO American International Assurance, http://www.aia.com.hk =cut Finance-Quote-1.38/lib/Finance/Quote/ASEGR.pm000644 000765 000024 00000010473 12566055631 020260 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # This modules is based on the Finance::Quote::AEX module # # The code has been modified by Morten Cools to be able to # retrieve stock information from the Athens Exchange in Greece. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA require 5.005; use strict; package Finance::Quote::ASEGR; use vars qw( $ASEGR_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION my $ASEGR_URL = 'http://www.ase.gr/content/en/MarketData/Stocks/Prices/Share_SearchResults.asp?'; sub methods { return ( greece => \&asegr, asegr => \&asegr, europe => \&asegr); } { my @labels = qw/name last date isodate p_change open high low close volume currency method exchange/; sub labels { return (greece => \@labels, asegr => \@labels, europe => \@labels); } } sub asegr { my $quoter = shift; my @stocks = @_; my (%info,$reply,$url,$te); my $ua = $quoter->user_agent(); $url=$ASEGR_URL; foreach my $stocks (@stocks) { $reply = $ua->request(GET $url.join('',"share=",$stocks)); if ($reply->is_success) { $te= new HTML::TableExtract( headers => [("Date","Price","\%Change","Volume","Max","Min","Value","Trades","Open")]); $te->parse($reply->content); unless ( $te->tables) { $info {$stocks,"success"} = 0; $info {$stocks,"errormsg"} = "Stock name $stocks not found"; next; } my @rows; unless (@rows = $te->rows) { $info {$stocks,"success"} = 0; $info {$stocks,"errormsg"} = "Parse error"; next; } $info{$stocks, "success"}=1; $info{$stocks, "exchange"}="Athens Stock Exchange"; $info{$stocks, "method"}="asegr"; $info{$stocks, "name"}=$stocks; ($info{$stocks, "last"}=$rows[0][1]) =~ s/\s*//g; ($info{$stocks, "close"}=$rows[1][1]) =~ s/\s*//g; ($info{$stocks, "p_change"}=$rows[0][2]) =~ s/\s*//g; ($info{$stocks, "volume"}=$rows[0][3]) =~ s/\s*//g; ($info{$stocks, "high"}=$rows[0][4]) =~ s/\s*//g; ($info{$stocks, "low"}=$rows[0][5]) =~ s/\s*//g; ($info{$stocks, "nav"}=$rows[0][6]) =~ s/\s*//g; ($info{$stocks, "open"}=$rows[0][8]) =~ s/\s*//g; $quoter->store_date(\%info, $stocks, {eurodate => $rows[0][0]}); $info{$stocks,"currency"}="EUR"; } else { $info{$stocks, "success"}=0; $info{$stocks, "errormsg"}="Error retreiving $stocks "; } } return wantarray() ? %info : \%info; return \%info; } 1; =head1 NAME Finance::Quote::ASEGR Obtain quotes from Athens Stock Exchange. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("asegr","minoa"); # Only query ASEGR %info = Finance::Quote->fetch("greece","aaak"); # Failover to other sources OK. =head1 DESCRIPTION This module fetches information from the "Athens Stock Exchange", http://www.ase.gr. All stocks are available. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "ASEGR" in the argument list to Finance::Quote->new(). This module provides both the "asegr" and "greece" fetch methods. Please use the "greece" fetch method if you wish to have failover with future sources for Greek stocks. Using the "asegr" method will guarantee that your information only comes from the Athens Stock Exchange. Information obtained by this module may be covered by www.ase.gr terms and conditions See http://www.ase.gr/ for details. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::ASEGR : name, last, date, p_change, open, high, low, close, volume, currency, method, exchange. =head1 SEE ALSO Athens Stock Exchange, http://www.ase.gr =cut Finance-Quote-1.38/lib/Finance/Quote/ASX.pm000644 000765 000024 00000015613 12566055631 020053 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Brent Neal # Copyright (C) 2001, Leigh Wedding # Copyright (C) 2000-2004, Paul Fenwick # Copyright (C) 2014, Chris Good # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash require 5.005; use strict; package Finance::Quote::ASX; use HTTP::Request::Common; use LWP::UserAgent; use HTML::TableExtract; use Encode; use vars qw/$ASX_URL /; our $VERSION = '1.38'; # VERSION $ASX_URL = 'http://www.asx.com.au/asx/markets/priceLookup.do?by=asxCodes&asxCodes='; sub methods {return (australia => \&asx,asx => \&asx)} { my @labels = qw/name last p_change bid offer high low volume price method exchange/; sub labels { return (australia => \@labels, asx => \@labels); } } # Australian Stock Exchange (ASX) # The ASX provides free delayed quotes through their webpage. # # Maintainer of this section is Paul Fenwick # 5-May-2001 Updated by Leigh Wedding # 24-Feb-2014 Updated by Chris Good sub asx { my $quoter = shift; my @all_stocks = @_; return unless @all_stocks; my @stocks; my %info; my $ua = $quoter->user_agent; # ASX webpage only handles up to 10 quote requests at once while (@stocks = splice(@all_stocks, 0, 10)) { my $response = $ua->request(GET $ASX_URL.join("%20",@stocks)); unless ($response->is_success) { foreach my $stock (@stocks, @all_stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "HTTP session failed"; } return wantarray() ? %info : \%info; } my $te = HTML::TableExtract->new( automap => 0, headers => ["Code", "Last", '\+/-', "Bid", "Offer", "Open", "High", "Low", "Vol"]); $te->parse(decode('utf-8',$response->content)); # Extract table contents. my @rows; unless (($te->tables > 0) && ( @rows = $te->rows)) { foreach my $stock (@stocks, @all_stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "Failed to parse HTML table."; } return wantarray() ? %info : \%info; } # Pack the resulting data into our structure. foreach my $row (@rows) { my $stock = shift(@$row); # Skip any blank lines. next unless $stock; # Delete spaces and '*' which sometimes appears after the code. # Also delete high bit characters. $stock =~ tr/* \200-\377//d; # Delete any whitespace characters $stock =~ s/\s//g; $info{$stock,'symbol'} = $stock; foreach my $label (qw/last p_change bid offer open high low volume/) { $info{$stock,$label} = shift(@$row); # Again, get rid of nasty high-bit characters. $info{$stock,$label} =~ tr/ \200-\377//d unless ($label eq "name"); } # If that stock does not exist, it will have a empty # string for all the fields. The "last" price should # always be defined (even if zero), if we see an empty # string here then we know we've found a bogus stock. if ($info{$stock,'last'} eq '') { $info{$stock,'success'} = 0; $info{$stock,'errormsg'}="Stock does not exist on ASX."; next; } # Drop commas from volume. $info{$stock,"volume"} =~ tr/,//d; # The ASX returns zeros for a number of things if there # has been no trading. This not only looks silly, but # can break things later. "correct" zero'd data. foreach my $label (qw/open high low/) { if ($info{$stock,$label} == 0) { $info{$stock,$label} = $info{$stock,"last"}; } } # We get a dollar plus/minus change, rather than a # percentage change, so we convert this into a # percentage change, as required. We should never have # zero opening price, but if we do warn about it. if ($info{$stock,"open"} == 0) { warn "Zero opening price in p_change calcuation for ". "stock $stock. P_change set to zero."; $info{$stock,"p_change"} = 0; } else { $info{$stock,"p_change"} = sprintf("%.2f", ($info{$stock,"p_change"}*100)/ $info{$stock,"open"}); } # Australian indexes all begin with X, so don't tag them # as having currency info. $info{$stock, "currency"} = "AUD" unless ($stock =~ /^X/); $info{$stock, "method"} = "asx"; $info{$stock, "exchange"} = "Australian Stock Exchange"; $info{$stock, "price"} = $info{$stock,"last"}; $info{$stock, "success"} = 1; } } # All done. return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::ASX - Obtain quotes from the Australian Stock Exchange. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("asx","BHP"); # Only query ASX. %stockinfo = $q->fetch("australia","BHP"); # Failover to other sources OK. =head1 DESCRIPTION This module obtains information from the Australian Stock Exchange http://www.asx.com.au/. All Australian stocks and indicies are available. Indexes start with the letter 'X'. For example, the All Ordinaries is "XAO". This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "ASX" in the argument list to Finance::Quote->new(). This module provides both the "asx" and "australia" fetch methods. Please use the "australia" fetch method if you wish to have failover with other sources for Australian stocks (such as Yahoo). Using the "asx" method will guarantee that your information only comes from the Australian Stock Exchange. Information returned by this module is governed by the Australian Stock Exchange's terms and conditions. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::ASX: date, bid, ask, open, high, low, last, close, p_change, volume, and price. =head1 SEE ALSO Australian Stock Exchange, http://www.asx.com.au/ Finance::Quote::Yahoo::Australia. =cut Finance-Quote-1.38/lib/Finance/Quote/BMONesbittBurns.pm000644 000765 000024 00000016374 12566055631 022405 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Copyright (C) 2003, Rob Clark # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # require 5.005; use strict; package Finance::Quote::BMONesbittBurns; use vars qw( $BMO_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information my $BMO_URL = 'http://bmonesbittburns.com/QuickQuote/QuickQuote.asp?Symbol='; sub methods { return (bmonesbittburns => \&bmonesbittburns) } sub labels { return (bmonesbittburns => [qw/name last p_change bid offer open high low volume currency method exchange date isodate time/]) }; # ============================================================================== sub bmonesbittburns { my $quoter = shift; my @symbols = @_; return unless @symbols; my($url, $reply, $te); my(%info); my $ua = $quoter->user_agent; # user_agent $url = $BMO_URL; # base url foreach my $symbol (@symbols) { $reply = $ua->request(GET $url.join('',$symbol)); if ($reply->is_success) { #print STDERR $reply->content,"\n"; $te = new HTML::TableExtract( depth => 2); # parse table $te->parse($reply->content); # check for a page without tables. # This gets returned when a bad symbol name is given. unless ( $te->tables ) { $info {$symbol,"succes"} = 0; $info {$symbol,"errormsg"} = "Fund name $symbol not found, bad symbol name"; next; } if (0) { my ($table, $row); # Old style, using top level methods rather than table state objects. foreach $table ($te->tables) { print "Table (", join(',', $te->table_coords($table)), "):\n"; foreach $row ($te->rows($table)) { print join(',', @$row), "\n"; } } } # extract table contents my($ignored, $stock_info, $data) = $te->table_states; my(@rows) = $data->rows; unless ($stock_info && $rows[0][1] !~ /Error/) { $info {$symbol,"success"} = 0; $info {$symbol,"errormsg"} = "Parse error"; next; } my(@info_row) = $stock_info->rows; if ( $info_row[0][2] !~ /\w/ ) { # No text name associated with the stock, use the symbol name $info {$symbol, "name"} = $symbol; } else { $info {$symbol, "name"} = $info_row[0][2]; } # Strip leading and trailing spaces $info {$symbol, "name"} =~ s/^\s*//; $info {$symbol, "name"} =~ s/\s*$//; $info {$symbol, "success"} = 1; $info {$symbol, "exchange"} = "BMO Nesbitt Burns"; $info {$symbol, "method"} = "bmonesbittburns"; ($info {$symbol, "last"} = $rows[ 1][2]) =~ s/\s*//g; # Remove spaces ($info {$symbol, "p_change"} = $rows[ 2][5]) =~ s/\s*//g; ($info {$symbol, "close"} = $rows[ 3][5]) =~ s/\s*//g; ($info {$symbol, "bid"} = $rows[ 4][2]) =~ s/\s*//g; ($info {$symbol, "offer"} = $rows[ 4][5]) =~ s/\s*//g; ($info {$symbol, "open"} = $rows[ 6][2]) =~ s/\s*//g; ($info {$symbol, "volume"} = $rows[ 6][5]) =~ s/\s*//g; ($info {$symbol, "high"} = $rows[ 7][2]) =~ s/\s*//g; ($info {$symbol, "low"} = $rows[ 7][5]) =~ s/\s*//g; if ($#rows >= 9) { ($info {$symbol, "eps"} = $rows[10][2]) =~ s/\s*//g; ($info {$symbol, "pe"} = $rows[10][5]) =~ s/\s*//g; ($info {$symbol, "div_yield"} = $rows[12][5]) =~ s/\s*//g; $rows[9][2] =~ s/[^\d\.]*//g; # Strip spaces and funky 8-bit characters $rows[9][5] =~ s/[^\d\.]*//g; $info {$symbol, "year_range"} = $rows[9][5] . " - " . $rows[9][2]; } # This site appears to provide either a date or a time but not both my($dt) = $rows[3][2]; if ($dt =~ /:/) { ($info {$symbol, "time"} = "$dt:00") =~ s/\s*//g; $quoter->store_date(\%info, $symbol, {today => 1}); } else { my ($month, $day) = ($dt =~ /([0-9]+)\/([0-9]+)/); $quoter->store_date(\%info, $symbol, {day => $day, month => $month}); $info {$symbol, "time"} = "00:00:00"; } # If this was a US exchange, currency in US$ if ($symbol =~ /,X$/) { $info {$symbol, "currency"} = "USD"; } else { $info {$symbol, "currency"} = "CAD"; } $info {$symbol, "success"} = 1; # Walk through our fields and remove high-ascii # characters which may have snuck in. foreach (@{labels()}) { $info{$symbol,$_} =~ tr/\200-\377//d; } } else { $info {$symbol, "success"} = 0; $info {$symbol, "errormsg"} = "Error retreiving $symbol "; } } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::BMONesbittBurns Obtain quotes from the BMO NesbittBurns site =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("bmonesbittburns","NT,X"); =head1 DESCRIPTION This module fetches information from the "BMO NesbittBurns Quitre Qote" site. Most Canadiam and US stocks as well as Canadian Mutual Funds are available. The symbolm representing a stock or mutual fund is composed of the stock symbol, a comma, and then the index or type. The following indexes and types are supported: T Toronto Stock Exchange MF Canadian Mutaul Fund V Canadian venture Exchange I Index X U.S Stocks (most exchanges) This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "BMONesbittBurns" in the argument list to Finance::Quote->new(). Information obtained by this module may be covered by BMO Nesbitt Burns terms and conditions. See http://bmonesbittburns.com/ for details. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::BMONesbittBurns : name, last, date, p_change, bid, offer, open, high, low, volume, currency, method, exchange, time, date. =head1 SEE ALSO BMO Nesbitt-Burns http://bmonesbittburns.com/QuickQuote/QuickQuote.asp =cut Finance-Quote-1.38/lib/Finance/Quote/Bourso.pm000644 000765 000024 00000030571 12566055631 020671 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Paul Fenwick # Copyright (C) 2000, Brent Neal # Copyright (C) 2001, Rob Sessink # Copyright (C) 2005, Morten Cools # Copyright (C) 2006, Dominique Corbex # Copyright (C) 2008, Bernard Fuentes # Copyright (C) 2009, Erik Colson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # # Changelog # # 2014-01-12 Arnaud Gardelein # # * changes on website # # 2009-04-12 Erik Colson # # * Major site change. # # 2008-11-09 Bernard Fuentes # # * changes on website # # 2006-12-26 Dominique Corbex # # * (1.4) changes on web site # # 2006-09-02 Dominique Corbex # # * (1.3) changes on web site # # 2006-06-28 Dominique Corbex # # * (1.2) changes on web site # # 2006-02-22 Dominique Corbex # # * (1.0) iniial release # require 5.005; use strict; package Finance::Quote::Bourso; use vars qw( $Bourso_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TreeBuilder ; # Boursorama doesn't put data in table elements anymore but uses
our $VERSION = '1.38'; # VERSION my $Bourso_URL = 'http://www.boursorama.com/recherche/index.phtml'; sub methods { return ( france => \&bourso, bourso => \&bourso, europe => \&bourso ); } { my @labels = qw/name last date isodate p_change open high low close volume currency method exchange/; sub labels { return ( france => \@labels, bourso => \@labels, europe => \@labels ); } } sub bourso_to_number { my $x = shift(@_); $x =~ s/\s//g; # remove spaces etc in number return $x; } sub bourso { my $quoter = shift; my @stocks = @_; my ( %info, $reply, $url, $te, $ts, $row, $style ); my $ua = $quoter->user_agent(); $url = $Bourso_URL; foreach my $stocks (@stocks) { my $queryUrl = $url . join( '', "?q=", $stocks ) . "&search[type]=rapide&search[categorie]=STK&search[bourse]=country:33"; $reply = $ua->request( GET $queryUrl); # print "URL=".$queryUrl."\n"; if ( $reply->is_success ) { # print $reply->content; $info{ $stocks, "success" } = 1; my $tree = HTML::TreeBuilder->new_from_content( $reply->content ); # retrieve SYMBOL my @symbolline = $tree->look_down( 'class', 'fv-isin ellipsis' ); unless (@symbolline) { $info{ $stocks, "success" } = 0; $info{ $stocks, "errormsg" } = "Stock name $stocks not found"; next; } my $symbol = ( $symbolline[0]->content_list )[0]; ($symbol) = ( $symbol =~ m/(\w+)/ ); $info{ $stocks, "symbol" } = $symbol; # retrieve NAME my @nameline = $tree->look_down( 'class', 'fv-name' ); unless (@nameline) { $info{ $stocks, "success" } = 0; $info{ $stocks, "errormsg" } = "Stock name $stocks not retrievable"; next; } my $name = $nameline[0]->as_text; $info{ $stocks, "name" } = $name; # set method $info{ $stocks, "method" } = "bourso"; #holds table data my %tempinfo; # retrieve other data my $infoclass = ( $tree->look_down( 'class', 'fv-extras' ) )[0]; unless ($infoclass) { my $opcvm = ( $tree->look_down( 'class', 'opcvm-partners block' ) )[0]; unless ($opcvm) { $info{ $stocks, "success" } = 0; $info{ $stocks, "errormsg" } = "$stocks retrieval not supported."; next; } # the stock is a delayed OPCVM my $infoelem = ( $tree->look_down( 'id', 'quote-infos-page' ) )[0]; $infoelem = ( $infoelem->look_down( 'class', 'q-details span-1-2' ) ) [0]; my @rows = $infoelem->look_down( '_tag', 'tr' ); foreach my $i ( 0 .. $#rows ) { my $row = $rows[$i]; unless ( $row->attr('class') ) { next; } my @cells = $row->look_down( '_tag', 'td' ); my $keytext = ( $cells[0] )->as_text; my $valuetext = ( $cells[2] )->as_text; $tempinfo{$keytext} = $valuetext; } } else { # regular stock my $infoelem; my $quote_infos_page = ( $tree->look_down( 'id', 'quote-infos-page' ) )[0]; $infoelem = ( $quote_infos_page->look_down( 'class', 'q-details span-1-2' ) )[0]; $infoelem = ( $quote_infos_page->look_down( 'class', 'bd' ) )[0] if ( !defined $infoelem ); # needed for warrants my @rows = $infoelem->look_down( '_tag', 'tr' ); foreach my $i ( 0 .. $#rows ) { my $row = $rows[$i]; my @cells = $row->look_down( '_tag', 'td' ); my $j = 0; if ( $cells[0]->attr('rowspan') ) { $j = 1; } if ( $cells[0]->attr('colspan') ) { next; } my $keytext = ( $cells[$j] )->as_text; my $valuetext = ( $cells[ $j + 1 ] )->as_text; $tempinfo{$keytext} = $valuetext; } } foreach my $key ( keys %tempinfo ) { # print "$key -> $tempinfo{$key}\n"; ASSIGN: for ($key) { # OPCVM /Valeur liquidative/ && do { my ( $last, $currency ) = ( $tempinfo{$key} =~ m/(\d+(?:\s\d+)*(?:\.\d+)?)(?:\(c\))?(?:\s+(\w+))?/ ); $last = bourso_to_number($last); $info{ $stocks, "last" } = $last; $info{ $stocks, "currency" } = $currency; }; /Date/ && do { $info{ $stocks, "date" } = $tempinfo{$key}; $quoter->store_date( \%info, $stocks, { eurodate => $info{ $stocks, "date" } } ); }; /Variation Veille/ && do { $info{ $stocks, "p_change" } = $tempinfo{$key}; }; # REGULAR STOCK /Cours/ && do { my ( $last, $currency ) = ( $tempinfo{$key} =~ m/(\d+(?:\s\d+)*(?:\.\d+)?)(?:\(c\))?(?:\s+(\w+))?/ ); $last = bourso_to_number($last); $info{ $stocks, "last" } = $last; $info{ $stocks, "currency" } = $currency || "EUR"; # defaults to EUR my $exchange = $key; $exchange =~ s/.*Cours\s*(\w.*\w)\s*/$1/ ; # the exchange is in the $key here $info{ $stocks, "exchange" } = $exchange; }; /Variation/ && do { $info{ $stocks, "p_change" } = $tempinfo{$key}; }; /Dernier .change/ && do { my ( $day, $month, $year ) = ( $tempinfo{$key} =~ m|(\d\d)/(\d\d)/(\d\d)| ); $year += 2000; $info{ $stocks, "date" } = sprintf "%02d/%02d/%04d", $day, $month, $year; $quoter->store_date( \%info, $stocks, { eurodate => $info{ $stocks, "date" } } ); }; /Volume/ && do { $info{ $stocks, "volume" } = bourso_to_number( $tempinfo{$key} ); }; /Ouverture/ && do { $info{ $stocks, "open" } = bourso_to_number( $tempinfo{$key} ); }; /Haut/ && do { $info{ $stocks, "high" } = bourso_to_number( $tempinfo{$key} ); }; /Bas/ && do { $info{ $stocks, "low" } = bourso_to_number( $tempinfo{$key} ); }; /Cl.ture veille/ && do { $info{ $stocks, "previous" } = bourso_to_number( $tempinfo{$key} ); }; /Valorisation/ && do { $info{ $stocks, "cap" } = $tempinfo{$key}; $info{ $stocks, "cap" } =~ s/[A-Z\s]//g ; # remove spaces and 'M' (millions) and currency (when not EUR) $info{ $stocks, "cap" } =~ tr/,/./; # point instead of comma $info{ $stocks, "cap" } *= 1000000; # valorisation is in millions }; } } $tree->delete; } else { $info{ $stocks, "success" } = 0; $info{ $stocks, "errormsg" } = "Error retreiving $stocks "; } } return wantarray() ? %info : \%info; return \%info; } 1; =head1 NAME Finance::Quote::Bourso Obtain quotes from Boursorama. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("bourso","ml"); # Only query Bourso %info = Finance::Quote->fetch("france","af"); # Failover to other sources OK. =head1 DESCRIPTION This module fetches information from the "Paris Stock Exchange", http://www.boursorama.com. All stocks are available. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "bourso" in the argument list to Finance::Quote->new(). This module provides both the "bourso" and "france" fetch methods. Please use the "france" fetch method if you wish to have failover with future sources for French stocks. Using the "bourso" method will guarantee that your information only comes from the Paris Stock Exchange. Information obtained by this module may be covered by www.boursorama.com terms and conditions See http://www.boursorama.com/ for details. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Bourso : name, last, date, p_change, open, high, low, close, nav, volume, currency, method, exchange, symbol. =head1 SEE ALSO Boursorama (french web site), http://www.boursorama.com =cut Finance-Quote-1.38/lib/Finance/Quote/BSERO.pm000644 000765 000024 00000013064 12566055631 020270 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # This modules is based on the Finance::Quote::ASEGR module # # The code has been modified by Andrei Cipu to be able to # retrieve stock information from the Bucharest Exchange in Romania. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA require 5.005; use strict; package Finance::Quote::BSERO; use vars qw( $BSERO_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION my $BSERO_URL = 'http://www.bvb.ro/mobile/m_SecurityDetails.aspx?'; sub methods { return ( romania => \&bsero, bsero => \&bsero, europe => \&bsero); } { my @labels = qw/name last date isodate p_change open high low close volume currency method exchange/; sub labels { return (romania => \@labels, bsero => \@labels, europe => \@labels); } } sub bsero { my $quoter = shift; my @stocks = @_; my (%info,$reply,$url,$te,$ts,$row,@cells, $ce); my($my_date,$my_last,$my_p_change,$my_volume,$my_high,$my_low,$my_open); my $ua = $quoter->user_agent(); $url = $BSERO_URL; foreach my $stocks (@stocks) { $reply = $ua->request(GET $url.join('',"s=",$stocks)); if ($reply->is_success) { $te = new HTML::TableExtract(); $te->parse($reply->content); unless ( $te->tables) { $info {$stocks,"success"} = 0; $info {$stocks,"errormsg"} = "Stock name $stocks not found"; next; } $ts = $te->first_table_found(); foreach $row ($ts->rows) { @cells = @$row; # The date is not a number, so we don't bother modifying it if($cells[0] eq 'Data'){ $my_date = $cells[1]; } #The rest of the data needs to be modified else { foreach $ce (@cells) { next unless $ce; $ce =~ s/\.//; #remove thouthand separator $ce =~ s/,/\./g; #replace european decimal separator with american ones } #go through each row and get the data if($cells[0] eq 'Ultimul pret'){ $my_last = $cells[1]; } if($cells[0] eq 'Var (%)'){ $my_p_change = $cells[1]; } if($cells[0] eq 'Volum'){ $my_volume = $cells[1]; } if($cells[0] eq 'Pret maxim'){ $my_high = $cells[1]; } if($cells[0] eq 'Pret minim'){ $my_low = $cells[1]; } if($cells[0] eq 'Pret deschidere'){ $my_open = $cells[1]; } } } $info{$stocks, "success"} =1; $info{$stocks, "exchange"} ="Bucharest Stock Exchange"; $info{$stocks, "method"} ="bsero"; $info{$stocks, "name"} =$stocks; $info{$stocks, "last"} =$my_last; $info{$stocks, "close"} =$my_last; $info{$stocks, "p_change"} =$my_p_change; $info{$stocks, "volume"} =$my_volume; $info{$stocks, "high"} =$my_high; $info{$stocks, "low"} =$my_low; $info{$stocks, "open"} =$my_open; $quoter->store_date(\%info, $stocks, {eurodate => $my_date}); $info{$stocks,"currency"} = "RON"; } else { $info{$stocks, "success"}=0; $info{$stocks, "errormsg"}="Error retreiving $stocks "; } } return wantarray() ? %info : \%info; return \%info; } 1; =head1 NAME Finance::Quote::BSERO Obtain quotes from Bucharest Stock Exchange. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("bsero","tlv"); # Only query BSERO %info = Finance::Quote->fetch("romania","brd"); # Failover to other sources OK. =head1 DESCRIPTION This module fetches information from the "Bucharest Stock Exchange" (Bursa de Valori Bucuresti), http://www.bvb.ro. All stocks are available. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "BSERO" in the argument list to Finance::Quote->new(). This module provides both the "bsero" and "romania" fetch methods. Please use the "romania" fetch method if you wish to have failover with future sources for Romanian stocks. Using the "bsero" method will guarantee that your information only comes from the Bucharest Stock Exchange. Information obtained by this module may be covered by www.bvb.go terms and conditions See http://www.bvb.ro/ for details. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::BSERO : name, last, date, p_change, open, high, low, close, volume, currency, method, exchange. =head1 SEE ALSO Bucharest Stock Exchange, http://www.bvb.ro =cut Finance-Quote-1.38/lib/Finance/Quote/Cdnfundlibrary.pm000644 000765 000024 00000011232 12566055631 022357 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # Cdnfundlibrary.pm # # Version 0.6 retrieve more data via different fundlibrary.com url # Version 0.5 made functional again # Version 0.4 fixed up multiple lookup (March 3, 2001) # Version 0.3 fixed up yield lookup # Version 0.2 functional with Finance::Quote - added error-checking # Version 0.1 pre trial of parsing of info from www.fundlibrary.com package Finance::Quote::Cdnfundlibrary; require 5.004; use strict; use vars qw( $FUNDLIB_URL $FUNDLIB_MAIN_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $FUNDLIB_URL = ("http://www.fundlibrary.com/funds/db/_fundcard.asp?t=2&id="); $FUNDLIB_MAIN_URL=("http://www.fundlibrary.com"); sub methods { return (canadamutual => \&fundlibrary, fundlibrary => \&fundlibrary); } { my @labels = qw/method source link name currency last date isodate nav yield price net p_change/; sub labels { return (canadamutual => \@labels, fundlibrary => \@labels); } } # # ======================================================================= sub fundlibrary { my $quoter = shift; my @symbols = @_; # Make sure symbols are requested ##CAN exit more gracefully - add later## return unless @symbols; # Local Variables my(%fundquote, $mutual); my($ua, $url, $reply, $ts, $row, $rowhd, $te, @rows, @ts); $ua = $quoter->user_agent; foreach (@symbols) { $mutual = $_; $url = "$FUNDLIB_URL$mutual"; $reply = $ua->request(GET $url); $te = new HTML::TableExtract(headers => ["Date", "NAVPS"], slice_columns => 0); # Make sure something is returned ##CAN exit more gracefully - add later## return unless ($reply->is_success); $te->parse($reply->content); # Check for a page without tables # This gets returned when a bad symbol name is given unless ( $te->tables > 0 ) { $fundquote {$mutual,"success"} = 0; $fundquote {$mutual,"errormsg"} = "Fund name $mutual not found"; next; } # Fund name $reply->content =~ m#([^<]+)
#; $fundquote {$mutual, "name"} = $1; @rows = $te->rows; if(@rows) { $fundquote {$mutual, "symbol"} = $mutual; $fundquote {$mutual, "currency"} = "CAD"; $fundquote {$mutual, "source"} = $FUNDLIB_MAIN_URL; $fundquote {$mutual, "link"} = $url; $fundquote {$mutual, "method"} = "fundlibrary"; # Fund price and date $row = $rows[1]; $fundquote {$mutual, "price"} = $$row[2]; $fundquote {$mutual, "nav"} = $$row[2]; $fundquote {$mutual, "last"} = $$row[2]; $fundquote {$mutual, "net"} = $$row[3]; $fundquote {$mutual, "p_change"} = $$row[4]; $quoter->store_date(\%fundquote, $mutual, {usdate => $$row[0]}); # Assume things are fine here. $fundquote {$mutual, "success"} = 1; # Performance yield $fundquote {$mutual, "yield"} = $$row[5] if ($$row[5] ne "--"); } else { $fundquote {$mutual, "success"} = 0; $fundquote {$mutual, "errormsg"} = "Fund Not Found"; } } #end symbols return %fundquote if wantarray; return \%fundquote; } 1; =head1 NAME Finance::Quote::Cdnfundlibrary - Obtain mutual fund prices from www.fundlibrary.com =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("canadamutual","fundlib-code"); # Can failover to other methods %stockinfo = $q->fetch("fundlibrary","fundlib-code"); # Use this module only. # NOTE: currently no failover methods exist for canadamutual =head1 DESCRIPTION This module obtains information about Canadian Mutual Fund prices from www.fundlibrary.com. The information source "canadamutual" can be used if the source of prices is irrelevant, and "fundlibrary" if you specifically want to use www.fundlibrary.com. =head1 FUNDLIB-CODE In Canada a mutual fund does not have a unique global symbol identifier. This module uses an id that represents the mutual fund on an id used by www.fundlibrary.com. There is no easy way of fetching the id except to jump onto the fundlibrary website, look up the fund and view the url for clues to its id number. =head1 LABELS RETURNED Information available from fundlibrary may include the following labels: exchange method link source name currency yield last nav price. The link label will be a url location for a one page snapshot that fundlibrary provides on the fund. =head1 SEE ALSO Fundlibrary website - http://www.fundlibrary.com/ Finance::Quote =cut Finance-Quote-1.38/lib/Finance/Quote/Citywire.pm000644 000765 000024 00000027000 12566055631 021210 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # Citywire.pm # # Obtains quotes for UK Unit Trusts from http://morningstar.co.uk/ - please # refer to the end of this file for further information. # # author: Martin Sadler (martinsadler@users.sourceforge.net) # # version: 0.1 Initial version - 01 April 2013 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # package Finance::Quote::Citywire; require 5.005; use strict; use warnings; # Set DEBUG => 0 for no debug messages, => 1 for first level, => 2 for 2nd level, etc. use constant DEBUG => 0; # URLs use vars qw($VERSION $CITYWIRE_NEXT_URL $CITYWIRE_LOOK_UP $CITYWIRE_MAIN_URL); use LWP::Simple; use LWP::UserAgent; use HTTP::Request::Common; use HTTP::Cookies; use HTML::TokeParser; # use Data::Dumper; our $VERSION = '1.38'; # VERSION $CITYWIRE_MAIN_URL = "http://citywire.co.uk"; $CITYWIRE_LOOK_UP = "http://citywire.co.uk/money/search.aspx?phrase="; $CITYWIRE_NEXT_URL = ""; # FIXME - sub methods { return (citywire => \&citywire_fund, ukfunds => \&citywire_fund); } { my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/; sub labels { return (citywire => \@labels, ukfunds => \@labels); } } # # ======================================================================= sub citywire_fund { my $quoter = shift; my @symbols = @_; return unless @symbols; my %fundquote; my $ua = $quoter->user_agent; my $cj = HTTP::Cookies->new(); $ua->cookie_jar( $cj ); foreach (@symbols) { my $code = $_; my $code_type = "** Invalid **"; if ($code =~ m/^[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)/ && !$1) { $code_type = "ISIN"; } elsif ($code =~ m/^[a-zA-Z0-9]{6}\d(.*)/ && !$1 ) { $code_type = "SEDOL"; } elsif ($code =~ m/^[a-zA-Z]{4,6}(.*)/ && !$1) { $code_type = "MEXID"; } # current version can only use ISIN - report an error and exit if any other type if ($code_type ne "ISIN") { $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - invalid symbol"; next; } $fundquote {$code,"success"} = 1; # ever the optimist.... $fundquote {$code,"errormsg"} = "Success"; # perform the look-up - if not found, return with error my $webdoc = $ua->get($CITYWIRE_LOOK_UP.$code); if (!$webdoc->is_success) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data : HTTP Status = ",$webdoc->status_line; next; } $fundquote {$code, "symbol"} = $code; $fundquote {$code, "source"} = $CITYWIRE_MAIN_URL; DEBUG and print "\nTitle = ",$webdoc->title,"\n"; DEBUG and print "\nStatus = ",$webdoc->status_line, "\n"; DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n"; # Find name and next url using TokeParser my $htmlstream = HTML::TokeParser->new(\$webdoc->content); my ($name, $nexturl); while ( (my $tag = $htmlstream->get_tag('a')) && !$nexturl) { if ( $tag->[1]{'title'} ) { if ( $tag->[1]{'title'} eq 'view Fact Sheet' ) { $nexturl = $tag->[1]{'href'}; $name = $htmlstream->get_trimmed_text('/a'); } } } DEBUG and print "\nNext URL = ",$nexturl,"\n"; DEBUG and print "\bName = ",$name,"\n"; if (!defined($name)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find fund name"; $name = "*** UNKNOWN ***"; # ... and continue } $fundquote {$code, "name"} = $name; # set name if (!defined($nexturl)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data"; next; } # modify $nexturl to remove html escape encoding for the Ampersand (&) character $nexturl =~ s/&/&/; # Now need to look-up next page using $next_url $webdoc = $ua->get($CITYWIRE_MAIN_URL.$nexturl); if (!$webdoc->is_success) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data : HTTP Status = ",$webdoc->status_line; next; } DEBUG and print "\nTitle = ",$webdoc->title,"\n"; DEBUG and print "\nStatus = ",$webdoc->status_line, "\n"; DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n"; # Find date, currency and price using TokeParser my ($currency, $date, $price, $pchange); $htmlstream = HTML::TokeParser->new(\$webdoc->content); my $done = 0; while ( (my $tag = $htmlstream->get_tag('div')) && !$done) { if ( $tag->[1]{'class'} ) { if ( $tag->[1]{'class'} eq 'fundQuickInfo' ) { DEBUG and print "\nFound tag : ",$tag->[3],"\n"; $tag = $htmlstream->get_tag('h5'); my $text = $htmlstream->get_trimmed_text('/h5'); DEBUG and print "\nFound tag : ",$tag->[3],$text,"\n"; if ( $text eq "LATEST PRICE" ) { $tag = $htmlstream->get_tag('p'); $text = $htmlstream->get_trimmed_text('/p'); DEBUG and print "\nFound tag : ",$tag->[3],$text,"

\n"; if ( $text =~ m[.*([0-9]{2}/[0-9]{2}/[0-9]{4})] ) { $date = $1; } } $tag = $htmlstream->get_tag('li'); $text = $htmlstream->get_trimmed_text('/li'); DEBUG and print "\nFound tag : ",$tag->[3],$text,"\n"; DEBUG and print "\n\$text = ",$text,"\n"; if ( $tag->[1]{'class'} eq 'price currency' ) { if ( $text =~ m[([\D]+)([0-9\.]+)] ) { $price = $2; DEBUG and print "\n\$1 = ",$1,"\n"; DEBUG and print "\n\$2 = ",$2,"\n"; if ( $1 eq "£" ) { $currency = "GBP"; } else { if( $1 =~ m[([A-Z]{3})] ) { $currency = $1; } } } } $tag = $htmlstream->get_tag('h5'); $text = $htmlstream->get_trimmed_text('/h5'); DEBUG and print "\nFound tag : ",$tag->[3],$text,"\n"; if ( $text eq "CHANGE IN PRICE" ) { $tag = $htmlstream->get_tag('li'); $text = $htmlstream->get_trimmed_text('/li'); DEBUG and print "\nFound tag : ",$tag->[3],$text,"\n"; if ( $tag->[1]{'class'} =~ m[^price ([a-z]*)] ) { my $negate = $1; if ( $text =~ m[([0-9\.]+)\%] ) { $pchange = $1; } if ( $negate eq 'minus') { $pchange = 0 - $pchange; } } } } } } DEBUG and print "\n\%-age change = ",$pchange,"\n"; if (!defined($pchange)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find net or %-age change"; # set to (minus)zero $pchange = -0.00; # ... and continue } $fundquote {$code, "p_change"} = $pchange; # set %-change DEBUG and print "\nDate = ",$date,"\n"; if (!defined($date)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find a date"; # use today's date $quoter->store_date(\%fundquote, $code, {today => 1}); # ... and continue } else { $quoter->store_date(\%fundquote, $code, {eurodate => $date}); } DEBUG and print "\nPrice = ",$price,"\n"; if (!defined($price)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to find a price"; next; } DEBUG and print "\nCCY = ",$currency,"\n"; if (!defined($currency)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to find a currency"; next; } # defer setting currency and price until we've dealt with possible GBX currency... # Calculate net change - it's not included in the morningstar factsheets my $net = ($price * $pchange) / 100 ; # deal with GBX pricing of UK unit trusts if ($currency eq "GBX") { $currency = "GBP" ; $price = $price / 100 ; $net = $net / 100 ; } # now set prices and currency $fundquote {$code, "price"} = $price; $fundquote {$code, "last"} = $price; $fundquote {$code, "nav"} = $price; $fundquote {$code, "net"} = $net; $fundquote {$code, "currency"} = $currency; # Set a dummy time as gnucash insists on having a valid format my $time = "12:00"; # set to Midday if no time supplied ??? # gnucash insists on having a valid-format $fundquote {$code, "time"} = $time; # set time $fundquote {$code, "method"} = "citywire"; # set method } return wantarray ? %fundquote : \%fundquote; } 1; =head1 NAME Finance::Quote::citywire - Obtain UK Unit Trust quotes from morningstar.co.uk. =head1 SYNOPSIS $q = Finance::Quote->new; %info = Finance::Quote->fetch("citywire"," ..."); # Only query morningstar.co.uk using ISINs %info = Finance::Quote->fetch("ukfunds","|| ..."); # Failover to other sources =head1 DESCRIPTION This module fetches information from the Citywire Funds service, http://citywire.co.uk. There are many UK Unit Trusts and OEICs quoted, as well as many Offshore Funds and Exhange Traded Funds (ETFs). It converts any funds quoted in GBX (pence) to GBP, dividing the price by 100 in the process. Funds are identified by their ISIN code. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "citywire" in the argument list to Finance::Quote->new(). Information obtained by this module may be covered by citywire.co.uk terms and conditions See http://citywire.co.uk for details. =head2 Stocks And Indices This module provides both the "citywire" and "ukfunds" fetch methods for fetching UK and Offshore Unit Trusts and OEICs prices and other information from funds.ft.com. Please use the "ukfunds" fetch method if you wish to have failover with future sources for UK and Offshore Unit Trusts and OEICs - the author has plans to develop Finance::Quote modules for other sources providing uk unit trust prices. Using the "citywire" method will guarantee that your information only comes from the citywire.co.uk website. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Citywire : name, currency, last, date, time, price, nav, source, method, iso_date, net, p_change, success, errormsg. =head1 SEE ALSO =head1 AUTHOR Martin Sadler, Emartinsadler@users.sourceforge.netE =head1 COPYRIGHT AND LICENSE Copyright (C) 2010 by Martin Sadler This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.1 or, at your option, any later version of Perl 5 you may have available. =cut __END__ Finance-Quote-1.38/lib/Finance/Quote/Cominvest.pm000644 000765 000024 00000011467 12566055631 021372 0ustar00ecstaff000000 000000 # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Paul Fenwick # Copyright (C) 2000, Brent Neal # Copyright (C) 2007, Stephan Ebelt # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code initially derived from Padzensky's work on package # Finance::YahooQuote, but extends its capabilites to encompas a greater # number of data sources. # # This module (cominvest) derived from Finance::Quote::Fidelity because # it is technically very similar (they provide a list with all funds in # CSV format...). # # package Finance::Quote::Cominvest; require 5.005; use strict; use vars qw/$COMINVEST_URL /; use LWP::UserAgent; use HTTP::Request::Common; our $VERSION = '1.38'; # VERSION $COMINVEST_URL = ('http://www.cominvest.de/_applications/fonds_application/FondsInfos/FondsInfos_PreiseAktuell_CSVFile.asp?b2b=0&noindex=1&noindex=1&lang=49'); sub methods { return ( cominvest => \&cominvest, adig => \&cominvest ); } sub labels { my @labels = qw/exchange name symbol bid ask date isodate yield price method p_change/; return ( cominvest => \@labels, adig => \@labels ); } # ======================================================================== # the cominvest routine gets quotes from "cominvest Asset Management GmbH" # sub cominvest { my $quoter = shift; my @symbols = @_; return unless @symbols; my(%info, @q, $sym, $k, $ua, $reply); # Build a small hash of symbols people want, because it provides a # quick and easy way to only return desired symbols. my %symbolhash; %symbolhash = map{$_, 1} @symbols; # Cominvest serves colon separated values (sort of csv's) $ua = $quoter->user_agent; $reply = $ua->request(GET $COMINVEST_URL); if($reply->is_success) { foreach (split('\015?\012',$reply->content)) { my @q = split(/;/) or next; $sym = ''; # Skip symbols we didn't ask for. next unless ( (defined($symbolhash{$q[1]}) and $sym=$q[1]) # ISIN or (defined($symbolhash{$q[2]}) and $sym=$q[2]) # WKN ); # convert decimal separator to intl. format foreach(@q) { s/,/\./; } $info{$sym, 'exchange'} = 'Cominvest'; $info{$sym, 'method'} = 'cominvest'; $info{$sym, 'name'} = $q[0]; $info{$sym, 'symbol'} = $sym; ($info{$sym, 'p_change'} = $q[8]) =~ s/\%//; $info{$sym, 'yield'} = $q[9]; $info{$sym, 'price'} = $q[7]; $info{$sym, 'bid'} = $q[7]; $info{$sym, 'ask'} = $q[6]; $info{$sym, 'currency'} = $q[3]; $quoter->store_date(\%info, $sym, {eurodate => $q[5]}); $info{$sym, 'success'} = 1; } # always return a status for all requested symbols foreach my $s (@symbols) { if( !$info{$s, 'success'} ) { $info{$s, 'success'} = 0; $info{$s, 'errormsg'} = 'No data returned'; } } } else { # set error on all symbols foreach my $sym (@symbols) { $info{$sym, 'success'} = 0; $info{$sym, 'errormsg'} = 'HTTP error: ' . $reply->status_line; } } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::Cominvest - Obtain information from cominvest, formerly known as Adig Investment. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch('cominvest', '637256'); %info = Finance::Quote->fetch('adig', 'DE0006372568'); =head1 DESCRIPTION This module obtains information from cominvest Asset Management http://www.cominvest-am.de/ - a german mutual fund company. It was formerly known as Adig Investments and thus an alias 'adig' is also provided. The name with which this module is called does not change its behavior. It may be asked for german WKNs or international ISINs. Information returned by this module is governed by the terms and conditions of cominvest Asset Management GmbH. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Cominvest: exchange, name, bid, ask, date, yield, price, p_change. =head1 SEE ALSO cominvest Asset Management, http://www.cominvest-am.de/ =cut Finance-Quote-1.38/lib/Finance/Quote/CSE.pm000644 000765 000024 00000011753 12566055631 020033 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # This modules is based on the AEX module. The code has been modified by # Hiranya Samarasekera to be able to retrieve stock # information from the Colombo Stock Exchange (CSE) in Sri Lanka. # ---------------------------------------------------------------------- # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # require 5.005; use strict; package Finance::Quote::CSE; use vars qw($CSE_URL); use LWP::UserAgent; use HTTP::Request::Common qw(POST); use HTML::TableExtract; use CGI; our $VERSION = '1.38'; # VERSION my $CSE_URL = "http://www.cse.lk/trade_summary_report.do?reportType=CSV"; sub methods { return (cse => \&cse) } { my @labels = qw/ID SYMBOL NAME LAST_TRADE_QUANTITY TRADE_DATE PRICE SHAREVOLUME TRADEVOLUME TURNOVER HI_TRADE LO_TRADE CHANGE CHANGE_PERCENTAGE ISSUE_DATE CLOSING_PRICE PREVIOUS_CLOSE MARKET_CAP MARKET_CAP_PERCENTAGE OPEN currency method exchange/; sub labels { return (cse => \@labels) } } # Colombo Stock Exchange (CSE), Sri Lanka sub cse { my $quoter = shift; my @symbols = @_; return unless @symbols; my (%info,$url,$reply,$te); my ($row, $datarow, $matches); my ($time); $url = $CSE_URL; # base url # Create a user agent object and HTTP headers my $ua = new LWP::UserAgent(agent => 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)'); # Compose POST request my $request = new HTTP::Request("GET", $url); $reply = $ua->request( $request ); #print Dumper $reply; if ($reply->is_success) { # Write retreived data to temp file for debugging use POSIX; my $filename = tmpnam(); open my $fw, ">", $filename or die "$filename: $!"; print $fw $reply->content; close $fw; # Open reply to read lines open FP, "<", \$reply->content or die "Unable to read data: $!"; # Open temp file instead while debugging #open FP, "<", $filename or die "Unable to read data: $!"; while (my $line = ) { my @row_data = $quoter->parse_csv($line); #print Dumper \@row_data; my $row = \@row_data; #print Dumper $row; next unless @row_data; foreach my $symbol (@symbols) { my $found = 0; # Match stock symbol (e.g. JKH.N0000, HNB.X0000) if ( @$row[1] eq uc($symbol) ) { $info {$symbol, "exchange"} = "Colombo Stock Exchange, Sri Lanka"; $info {$symbol, "method"} = "cse"; $info {$symbol, "symbol"} = @$row[1]; $info {$symbol, "name"} = @$row[2]; ($info {$symbol, "last"} = @$row[5]) =~ s/\s*//g; $info {$symbol, "bid"} = undef; $info {$symbol, "offer"} = undef; $info {$symbol, "open"} = @$row[18]; $info {$symbol, "nav"} = undef; $info {$symbol, "price"} = @$row[5]; $info {$symbol, "low"} = @$row[10]; $info {$symbol, "close"} = @$row[15]; $info {$symbol, "p_change"} = @$row[12]; ($info {$symbol, "high"} = @$row[9]) =~ s/\s*//g; ($info {$symbol, "volume"} = @$row[6]) =~ s/,//g;; $quoter->store_date(\%info, $symbol, {today => 1}); $info {$symbol, "currency"} = "LKR"; $info {$symbol, "success"} = 1; } } } } foreach my $symbol (@symbols) { unless ( !defined($info {$symbol, "success"}) || $info {$symbol, "success"} == 1 ) { $info {$symbol,"success"} = 0; $info {$symbol,"errormsg"} = "Fund name $symbol not found"; next; } } #print Dumper \%info; return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::CSE Obtain quotes from Colombo Stock Exchange in Sri Lanka =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; @stocks = ("JKH.N0000", "HPWR.N0000", "HNB.X0000"); %info = Finance::Quote->fetch("cse", @stocks); =head1 DESCRIPTION This module retrieves information from the Colombo Stock Exchange (CSE) in Sri Lanka http://www.cse.lk. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "cse" in the argument list to Finance::Quote->new(). =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::CSE : symbol, name, last, open, price, low, close, p_change, high, volume, exchange, method =head1 SEE ALSO Colombo Stock Exchange (CSE), Sri Lanka, http://www.cse.lk =cut Finance-Quote-1.38/lib/Finance/Quote/Currencies.pm000644 000765 000024 00000034714 12566055631 021525 0ustar00ecstaff000000 000000 # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # package Finance::Quote::Currencies; use strict; use warnings; use base 'Exporter'; use vars qw/@EXPORT_OK $YAHOO_CURRENCY_CONV_URL/; @EXPORT_OK = qw( known_currencies fetch_live_currencies ); our $VERSION = '1.38'; # VERSION use HTTP::Request::Common; use LWP::UserAgent; use HTML::Parser; use Encode; # This is the URL used to extract the currency list $YAHOO_CURRENCY_CONV_URL = 'http://uk.finance.yahoo.com/currency-converter'; # ======================================================================= # methods used by Finance::Quote to import public functions sub methods { return ( known_currencies => \&known_currencies , fetch_live_currencies => \&fetch_live_currencies ); } sub labels { return () }; # ======================================================================= # The current static currency list. # This list is generated using fetch_live_currencies my %currencies = ( ALL => { name => qq{Albanian Lek} } , DZD => { name => qq{Algerian Dinar} } , XAL => { name => qq{Aluminium Ounces} } , ARS => { name => qq{Argentine Peso} } , AWG => { name => qq{Aruba Florin} } , AUD => { name => qq{Australian Dollar} } , BSD => { name => qq{Bahamian Dollar} } , BHD => { name => qq{Bahraini Dinar} } , BDT => { name => qq{Bangladesh Taka} } , BBD => { name => qq{Barbados Dollar} } , BYR => { name => qq{Belarus Ruble} } , BZD => { name => qq{Belize Dollar} } , BMD => { name => qq{Bermuda Dollar} } , BTN => { name => qq{Bhutan Ngultrum} } , BOB => { name => qq{Bolivian Boliviano} } , BWP => { name => qq{Botswana Pula} } , BRL => { name => qq{Brazilian Real} } , GBP => { name => qq{British Pound} } , BND => { name => qq{Brunei Dollar} } , BGN => { name => qq{Bulgarian Lev} } , BIF => { name => qq{Burundi Franc} } , KHR => { name => qq{Cambodia Riel} } , CAD => { name => qq{Canadian Dollar} } , CVE => { name => qq{Cape Verde Escudo} } , KYD => { name => qq{Cayman Islands Dollar} } , XOF => { name => qq{CFA Franc (BCEAO)} } , XAF => { name => qq{CFA Franc (BEAC)} } , CLP => { name => qq{Chilean Peso} } , CNY => { name => qq{Chinese Yuan} } , COP => { name => qq{Colombian Peso} } , KMF => { name => qq{Comoros Franc} } , XCP => { name => qq{Copper Pounds} } , CRC => { name => qq{Costa Rica Colon} } , HRK => { name => qq{Croatian Kuna} } , CUP => { name => qq{Cuban Peso} } , CZK => { name => qq{Czech Koruna} } , DKK => { name => qq{Danish Krone} } , DJF => { name => qq{Dijibouti Franc} } , DOP => { name => qq{Dominican Peso} } , XCD => { name => qq{East Caribbean Dollar} } , ECS => { name => qq{Ecuador Sucre} } , EGP => { name => qq{Egyptian Pound} } , SVC => { name => qq{El Salvador Colon} } , ERN => { name => qq{Eritrea Nakfa} } , EEK => { name => qq{Estonian Kroon} } , ETB => { name => qq{Ethiopian Birr} } , EUR => { name => qq{Euro} } , FKP => { name => qq{Falkland Islands Pound} } , FJD => { name => qq{Fiji Dollar} } , GMD => { name => qq{Gambian Dalasi} } , GHC => { name => qq{Ghanian Cedi} } , GIP => { name => qq{Gibraltar Pound} } , XAU => { name => qq{Gold Ounces} } , GTQ => { name => qq{Guatemala Quetzal} } , GNF => { name => qq{Guinea Franc} } , GYD => { name => qq{Guyana Dollar} } , HTG => { name => qq{Haiti Gourde} } , HNL => { name => qq{Honduras Lempira} } , HKD => { name => qq{Hong Kong Dollar} } , HUF => { name => qq{Hungarian Forint} } , ISK => { name => qq{Iceland Krona} } , INR => { name => qq{Indian Rupee} } , IDR => { name => qq{Indonesian Rupiah} } , IRR => { name => qq{Iran Rial} } , IQD => { name => qq{Iraqi Dinar} } , ILS => { name => qq{Israeli Shekel} } , JMD => { name => qq{Jamaican Dollar} } , JPY => { name => qq{Japanese Yen} } , JOD => { name => qq{Jordanian Dinar} } , KZT => { name => qq{Kazakhstan Tenge} } , KES => { name => qq{Kenyan Shilling} } , KRW => { name => qq{South Korean Won} } , KWD => { name => qq{Kuwaiti Dinar} } , LAK => { name => qq{Lao Kip} } , LVL => { name => qq{Latvian Lat} } , LBP => { name => qq{Lebanese Pound} } , LSL => { name => qq{Lesotho Loti} } , LRD => { name => qq{Liberian Dollar} } , LYD => { name => qq{Libyan Dinar} } , LTL => { name => qq{Lithuanian Lita} } , MOP => { name => qq{Macau Pataca} } , MKD => { name => qq{Macedonian Denar} } , MWK => { name => qq{Malawi Kwacha} } , MYR => { name => qq{Malaysian Ringgit} } , MVR => { name => qq{Maldives Rufiyaa} } , MTL => { name => qq{Maltese Lira} } , MRO => { name => qq{Mauritania Ougulya} } , MUR => { name => qq{Mauritius Rupee} } , MXN => { name => qq{Mexican Peso} } , MDL => { name => qq{Moldovan Leu} } , MNT => { name => qq{Mongolian Tugrik} } , MAD => { name => qq{Moroccan Dirham} } , MMK => { name => qq{Myanmar Kyat} } , NAD => { name => qq{Namibian Dollar} } , NPR => { name => qq{Nepalese Rupee} } , ANG => { name => qq{Neth Antilles Guilder} } , TRY => { name => qq{Turkish Lira} } , NZD => { name => qq{New Zealand Dollar} } , NIO => { name => qq{Nicaragua Cordoba} } , NGN => { name => qq{Nigerian Naira} } , KPW => { name => qq{North Korean Won} } , NOK => { name => qq{Norwegian Krone} } , OMR => { name => qq{Omani Rial} } , XPF => { name => qq{Pacific Franc} } , PKR => { name => qq{Pakistani Rupee} } , XPD => { name => qq{Palladium Ounces} } , PAB => { name => qq{Panama Balboa} } , PGK => { name => qq{Papua New Guinea Kina} } , PYG => { name => qq{Paraguayan Guarani} } , PEN => { name => qq{Peruvian Nuevo Sol} } , PHP => { name => qq{Philippine Peso} } , XPT => { name => qq{Platinum Ounces} } , PLN => { name => qq{Polish Zloty} } , QAR => { name => qq{Qatar Rial} } , RON => { name => qq{Romanian New Leu} } , RUB => { name => qq{Russian Rouble} } , RWF => { name => qq{Rwanda Franc} } , WST => { name => qq{Samoa Tala} } , STD => { name => qq{Sao Tome Dobra} } , SAR => { name => qq{Saudi Arabian Riyal} } , SCR => { name => qq{Seychelles Rupee} } , SLL => { name => qq{Sierra Leone Leone} } , XAG => { name => qq{Silver Ounces} } , SGD => { name => qq{Singapore Dollar} } , SKK => { name => qq{Slovak Koruna} } , SIT => { name => qq{Slovenian Tolar} } , SBD => { name => qq{Solomon Islands Dollar} } , SOS => { name => qq{Somali Shilling} } , ZAR => { name => qq{South African Rand} } , LKR => { name => qq{Sri Lanka Rupee} } , SHP => { name => qq{St Helena Pound} } , SZL => { name => qq{Swaziland Lilageni} } , SEK => { name => qq{Swedish Krona} } , CHF => { name => qq{Swiss Franc} } , SYP => { name => qq{Syrian Pound} } , TWD => { name => qq{Taiwan Dollar} } , TZS => { name => qq{Tanzanian Shilling} } , THB => { name => qq{Thai Baht} } , TOP => { name => qq{Tonga Pa'ang} } , TTD => { name => qq{Trinidad & Tobago Dollar} } , TND => { name => qq{Tunisian Dinar} } , USD => { name => qq{United States Dollar} } , AED => { name => qq{UAE Dirham} } , UGX => { name => qq{Ugandan Shilling} } , UAH => { name => qq{Ukraine Hryvnia} } , UYU => { name => qq{Uruguayan New Peso} } , VUV => { name => qq{Vanuatu Vatu} } , VEF => { name => qq{Venezuelan Bolivar Fuerte}} , VND => { name => qq{Vietnam Dong} } , YER => { name => qq{Yemen Riyal} } , ZMK => { name => qq{Zambian Kwacha} } , ZWD => { name => qq{Zimbabwe dollar} } , SDG => { name => qq{Sudanese Pound} } ); # ======================================================================= # known_currencies (public function) # # This function returns the known currency list. This is based on the # cached currency list in this module. Use fetch_live_currencies for the # live list. sub known_currencies { return \%currencies; } # ======================================================================= # fetch_live_currencies (public function) # # This function retrieved the live currency list from the Yahoo Finance # website. This function should really only be used to test if the known # currency list in this module is out of date. sub fetch_live_currencies { my $ua = LWP::UserAgent->new(); my $data = $ua->request(GET $YAHOO_CURRENCY_CONV_URL)->content; my $p = HTML::Parser->new( start_h => [\&_start_handler, "tagname, attr"] , end_h => [\&_end_handler, "tagname"] , text_h => [\&_text_handler, "dtext"] ); # Avoid the "Parsing of undecoded UTF-8 will give garbage when decoding # entities" warning by forcing utf mode and encoding to utf8 $p->utf8_mode(1); $p->parse( Encode::encode_utf8($data) ); return _live_currencies(); } # Store state variables in a closure { # The currency hash my %live_currencies = (); # Keep track of being within a valid option tag (for text gathering) my $in_currency_list = 0; my $in_currency_option = 0; my $currency_text = ''; my $currency_code = ''; # _start_handler (private function) # # This is a HTML::Parser start tag handler sub _start_handler { my ($tagname, $attr) = @_; if ( lc $tagname eq 'select' && exists $attr->{name} && lc $attr->{name} eq 'currency-1' ) { # Reset status %live_currencies = (); # We're in the list $in_currency_list = 1; } elsif ( $in_currency_list == 1 && lc $tagname eq 'option' ) { $in_currency_option = 1; $currency_code = $attr->{value}; $currency_text = ''; } } # _end_handler (private function) # # This is a HTML::Parser end tag handler sub _end_handler { my ($tagname) = @_; if ( lc $tagname eq 'select' && $in_currency_list == 1 ) { # We're leaving the currency list $in_currency_list = 0; } elsif ( $in_currency_list == 1 && $in_currency_option == 1 && lc $tagname eq 'option' ) { # We're leaving an option # Build currency list item (strip code from name) $currency_text =~ s/\s*\([A-Z]+\)\s*$//; $live_currencies{$currency_code} = { name => $currency_text }; $in_currency_option = 0; } } # _text_handler (private function) # # This is a HTML::Parser text handler sub _text_handler { my ($dtext) = @_; if ( $in_currency_list == 1 && $in_currency_option == 1 ) { $currency_text .= $dtext; } } # _live_currencies (private function) # # Return data from within the closure sub _live_currencies { return \%live_currencies; } } 1; =head1 NAME Finance::Quote::Currencies - List of currencies from Yahoo Finance =head1 SYNOPSIS use Finance::Quote::Currencies; my $currencies = Finance::Quote::Currencies::known_currencies(); # Grab the latest from Yahoo my $live_currencies = Finance::Quote::Currencies::fetch_live_currencies(); =head1 DESCRIPTION This module provides a list of known currencies from Yahoo Currency Converter. The converter website includes a list of known currencies - this module includes a stored list =head1 LAST EXTRACT The currency list stored in this module was last copied from the live site: Sun Feb 15 18:01:12 GMT 2009 =head1 LICENSE This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Currency information fetched through this module is bound by Yahoo!'s terms and conditons. =head1 AUTHORS Bradley Dean =head1 SEE ALSO Yahoo Currency Converter - http://uk.finance.yahoo.com/currency-converter =cut Finance-Quote-1.38/lib/Finance/Quote/Deka.pm000644 000765 000024 00000006500 12566055631 020257 0ustar00ecstaff000000 000000 # Finance::Quote Perl module to retrieve prices of Deka funds # Copyright (C) 2005 Knut Franke # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA package Finance::Quote::Deka; use strict; use HTML::TableExtract; require LWP::Protocol::https; our $VERSION = '1.38'; # VERSION my $DEKA_URL = "https://www.deka.de/dn/useCases/fundsearch/UCFundsSearch.shtml?ACTION_FIELD=quickSearch"; sub methods {return (deka => \&deka);} sub labels { return (deka=>[qw/name date price last method/]); } # Trim leading and tailing whitespaces (also non-breakable whitespaces) sub trim { $_ = shift(); s/^\s*//; s/\s*$//; s/ //g; return $_; } # Convert number separators to US values sub convert_price { $_ = shift; s/\./@/g; s/,/\./g; s/@/,/g; return $_; } sub deka { my $quoter = shift; # The Finance::Quote object. my @stocks = @_; my $ua = $quoter->user_agent(); my %info; foreach my $stock (@stocks) { my $response = $ua->get($DEKA_URL . "&isin=" . $stock); # print $response->content, "\n"; $info{$stock,"success"} = 0; if (!$response -> is_success()) { $info{$stock,"errormsg"} = "HTTP failure"; } else { my @headers = [qw(Name ISIN Whg Datum)]; my $te = new HTML::TableExtract(headers => @headers, slice_columns => 0); $te->parse($response->content); foreach my $ts ($te->table_states) { # foreach my $row ($ts->rows) { # next if !defined $$row[0] || !defined $$row[1]; # print "Row: ", join('|', @$row), "\n"; # } foreach my $row ($ts->rows) { next if !defined $$row[0] || !defined $$row[1]; $info{$stock,"name"} = $$row[0]; $info{$stock,"currency"} = $$row[2]; $quoter->store_date(\%info, $stock, {eurodate => $$row[6]}); $info{$stock,"price"} = convert_price(trim($$row[4])); $info{$stock,"last"} = $info{$stock,"price"}; $info{$stock,"success"} = 1; $info{$stock,"method"} = "deka"; $info{$stock,"symbol"} = $stock; } } $info{$stock,"errormsg"} = "Couldn't parse deka website" if ($info{$stock,"success"} == 0); } } return wantarray ? %info : \%info; } 1; =head1 NAME Finance::Quote::Deka - Obtain fonds quotes from DekaBank. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new("Deka"); %info = Finance::Quote->fetch("deka","DE0008474511"); =head1 DESCRIPTION This module obtains fund prices from DekaBank, http://www.deka.de/. Deka website supports retrieval by name, WKN or ISIN. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Deka: name, date, price, last, method. =head1 SEE ALSO DekaBank, http://www.deka.de/ Finance::Quote; =cut Finance-Quote-1.38/lib/Finance/Quote/DWS.pm000644 000765 000024 00000017166 12566055631 020062 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Paul Fenwick # Copyright (C) 2000, Brent Neal # Copyright (C) 2000, Volker Stuerzl # Copyright (C) 2006, Klaus Dahlke # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash # # $Id: DWS.pm,v 1.7 2006/04/08 19:54:55 hampton Exp $ package Finance::Quote::DWS; require 5.005; require LWP::Protocol::https; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; use LWP::Simple; use strict; use warnings; our $VERSION = '1.38'; # VERSION sub methods { return(dwsfunds => \&dwsfunds); } sub labels { return(dwsfunds => [qw/exchange name date isodate price method/]); } # ======================================================================= # The dwsfunds routine gets quotes of DWS funds (Deutsche Bank Gruppe) # On their website DWS provides a csv file in the format # symbol1,price1,date1 # symbol2,price2,date2 # ... # # This subroutine was written by Volker Stuerzl # # Version 2.0 as new webpage provides the data # 2006-03-19: Klaus Dahlke # Since DWS has changed its format and the data are not available via # csv-file download, the respective web-page is avaluated. There are # some limitations currently, especially with the name # # 2007-01-19: Stephan Ebelt # - fixed thousands and decimal separator handling # - check symbol against ISIN as well # - populate the exchange field with the DWS subsidiary that actually # runs the fund # - "improved" the name extraction (this fix is questionable, but does what I # want for the moment...), falls back to the string length assumption # from the last version if there is no match # - fixed indent # # 2007-01-26: Stephan Ebelt # - fixed 'unitialized value' warnings # sub dwsfunds { my $quoter = shift; my @funds = @_; return unless @funds; my $ua = $quoter->user_agent; my (%fundhash, @q, %info); my ( $html_string, $te, $ts, $row, @cells, $ce, @ce1, @ce2, @ce22, @ce4, $last, $wkn, $isin, $exchange, $date, $name, $type ); # define DWS 'Fondsart' (engl: classifications) as used on the page # - these strings are used to break down the real name later # - hardcoding at its best... but not much choice in order to get more # correct results my @dws_fund_classifications = ( 'Versicherungsfonds', 'Aktienfonds', 'Gemischte Fonds', 'Mitarbeiterfonds', 'Rentenfonds', 'Geldmarktnahe Fonds', 'Dachfonds', 'Kursgewinn-orientierte Fonds', 'AS-Fonds', 'Spezialit.ten', # note the dot ;-) 'Geldmarktfonds', 'Trading Fonds', 'DVG Fonds', 'Wandelanleihen-/ Genussscheinfonds', 'n/a' ); # create hash of all funds requested foreach my $fund (@funds) { $fundhash{$fund} = 0; } # get page containing the tables with prices etc my $DWS_URL = "https://www.deami.de/dps/ff/prices.aspx"; my $response = $ua->request(GET $DWS_URL); if ($response->is_success) { $html_string =$response->content; $te = new HTML::TableExtract->new( depth => 3, count => 1 ); $te->parse($html_string); $ts=$te->table_state(3,1); } else { # retrieval error - flag an error and return right away foreach my $fund (@funds) { %info = _dwsfunds_error(@funds, 'HTTP error: ' . $response->status_line); return wantarray() ? %info : \%info; } return wantarray() ? %info : \%info; } # # loop the table rows... # foreach $row ($ts->rows) { @cells =@$row; # replace line breaks # foreach $ce (@cells) { next unless $ce; $ce =~ s/\n/:/g; } # verify cell count if( $#cells != 4 ) { %info = _dwsfunds_error(@funds, "parse error: cells=$#cells, expected cells=4"); return wantarray() ? %info : \%info; } # get fond name and exchange # @ce1=split(/:/, $cells[1]); $name = $ce1[0]; $exchange = $ce1[1]; # get date and last price # @ce2=split(/:/, $cells[2]); $date = $ce2[0]; $last = $ce2[2]; # # wkn or isin is the source # @ce4=split(/:/, $cells[4]); $wkn=$ce4[1]; $isin=$ce4[2]; # match the fund by symbol foreach my $fund (@funds) { if ( ($wkn eq $fund) or ($isin eq $fund) ) { # attempt to separate the name-classification contruct my $name_ok = 0; foreach my $t (@dws_fund_classifications) { if( $name =~ /$t/ ) { $type = $t; my @n = split(/$t/, $name); $name = $n[0]; $name_ok = 1; last(); } } if( ! $name_ok ) { # fall back - the last 50 characters are either blanks or fond classification $name = substr($name, 0, length($name)-50); $info{$fund, "errormsg"} = "name-classification separation failed, guessing..."; } # mangle last price (thousands/decimal separators, ...) # - note the decimal separator is hardcoded to ',' (comma) # - keep arbitrary precision and any eventually following unit (%, $, ...) if( $last =~ /^(.*),(\d*.{1})$/ ) { my @tmp = ( $1, $2 ); $tmp[0] =~ s/\.//g; $last = join('.', @tmp); } # finaly, build up the result $info{$fund,"exchange"} = $exchange; $info{$fund,"symbol"} = $fund; $quoter->store_date(\%info, $fund, {eurodate => $date}); $info{$fund,"name"} = $name; $info{$fund,"last"} = $last; $info{$fund,"price"} = $last; $info{$fund,"method"} = "dwsfunds"; $info{$fund,"currency"} = "EUR"; $info{$fund,"success"} = 1; $fundhash{$fund} = 1; } } } # make sure a value is returned for every fund requested foreach my $fund (keys %fundhash) { if ($fundhash{$fund} == 0) { $info{$fund, "success"} = 0; $info{$fund, "errormsg"} = 'No data returned'; } } return wantarray() ? %info : \%info; } # - populate %info with errormsg and status code set for all requested symbols # - return a hash ready to pass back to fetch() sub _dwsfunds_error { my @symbols = shift; my $msg = shift; my %info; foreach my $s (@symbols) { $info{$s, "success"} = 0; $info{$s, "errormsg"} = $msg; } return(%info); } 1; =head1 NAME Finance::Quote::DWS - Obtain quotes from DWS (Deutsche Bank Gruppe). =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %fundinfo = $q->fetch("dwsfunds","847402", "DE0008474024", ...); =head1 DESCRIPTION This module obtains information about DWS managed funds. Query it with German WKN and/or international ISIN symbols. Information returned by this module is governed by DWS's terms and conditions. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::DWS: exchange, name, date, price, last. =head1 SEE ALSO DWS (Deutsche Bank Gruppe), http://www.dws.de/ =cut Finance-Quote-1.38/lib/Finance/Quote/Fidelity.pm000644 000765 000024 00000011277 12566055631 021173 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Paul Fenwick # Copyright (C) 2000, Brent Neal # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash package Finance::Quote::Fidelity; require 5.005; use strict; use vars qw/$FIDELITY_URL /; use LWP::UserAgent; use HTTP::Request::Common; our $VERSION = '1.38'; # VERSION $FIDELITY_URL = ("http://activequote.fidelity.com/nav/fulllist.csv"); sub methods {return (fidelity => \&fidelity, fidelity_direct => \&fidelity);} { my @labels = qw/exchange name number nav change ask date isodate yield price method/; sub labels { return (fidelity => \@labels, fidelity_direct => \@labels); } } # ======================================================================= # the fidelity routine gets quotes from fidelity investments # sub fidelity { my $quoter = shift; my @symbols = @_; return unless @symbols; my(%aa, @q, $sym, $k, $ua, $reply); # Build a small hash of symbols people want, because it provides a # quick and easy way to only return desired symbols. my %symbolhash; %symbolhash = map{$_, 1} @symbols; # the fidelity pages are comma-separated-values (csv's) # Grab the page with all funds listed $ua = $quoter->user_agent; $reply = $ua->request(GET $FIDELITY_URL); if ($reply->is_success) { foreach (split('\015?\012',$reply->content)) { my @q = $quoter->parse_csv($_) or next; $sym = $q[2] or next; $sym =~ s/^ +//; # Skip symbols we didn't ask for. next unless (defined($symbolhash{$sym})); $aa {$sym, "exchange"} = "Fidelity"; # Fidelity $aa {$sym, "method"} = "fidelity_direct"; ($aa {$sym, "name"} = $q[0]) =~ s/^\s+//; $aa {$sym, "name"} =~ s/\s+$//; $aa {$sym, "symbol"} = $sym; ($aa {$sym, "number"} = $q[1]) =~ s/^\s+//; ($aa {$sym, "nav"} = $q[4]) =~ s/^\s+// if defined($q[4]); ($aa {$sym, "div"} = $q[5]) =~ s/^\s+// if defined($q[5]); ($aa {$sym, "net"} = $q[6]) =~ s/^\s+// if defined($q[6]); ($aa {$sym, "p_change"} = $q[8]) =~ s/^\s+// if defined($q[8]); ($aa {$sym, "yield"} = $q[9]) =~ s/^\s+// if defined($q[9]); ($aa {$sym, "yield"} = $q[17]) =~ s/^\s+// if defined($q[17]); $aa {$sym, "price"} = $aa{$sym, "nav"} if defined($q[4]); $aa {$sym, "success"} = 1; $aa {$sym, "currency"} = "USD"; $quoter->store_date(\%aa, $sym, {usdate => $q[19]}); } } return %aa if wantarray; return \%aa; } 1; =head1 NAME Finance::Quote::Fidelity - Obtain information from Fidelity Investments. =head1 NOTE NOTE NOTE NOTE NOTE This module is currently non-functional. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("fidelity","FBGRX"); %info = Finance::Quote->fetch("fidelity_direct","FBGRX"); =head1 DESCRIPTION This module obtains information from Fidelity Investments, http://www.fidelity.com/. This module is loaded by default on the Finance::Quote object. It is also possible to load this module explicitly by passing "Fidelity" as one of Finance::Quote->new()'s parameters. The "fidelity" fetch method may make use of failover modules. The "fidelity_direct" method will only obtain information directly from Fidelity. Information returned by this module is governed by Fidelity Investment's terms and conditions. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Fidelity: exchange, name, number, nav, change, ask, date, yield, price. =head1 SEE ALSO Fidelity Investments, http://www.fidelity.com/ Finance::Quote::Yahoo::USA; =cut Finance-Quote-1.38/lib/Finance/Quote/FidelityFixed.pm000644 000765 000024 00000016704 12566055631 022153 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # FidelityFixed.pm # # Version 1.01 # Modification of Rolf Endres' Finance::Quote::ZA # # Peter Ratzlaff # 2012.01.04 package Finance::Quote::FidelityFixed; require 5.004; use strict; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION # e.g., http://fixedincome.fidelity.com/fi/FIIndividualBondsSearch?cusip=912810QT8 # This URL should really be "https://fixedincome.fidelity.com/", but that host name # maps to a number of different servers, some of which work with the Perl code and # some of which don't. So instead we pick one that we know works as of 6/3/2013. # This might change, in which case we'll have to find another one that works. One # way to do that is to try fixedincome.fidelity.com repeadedly while watching with # WireShark until you find one that works. my $FIDELITY_MAINURL = ("https://fixedincome6800rtp.fidelity.com/"); my $FIDELITY_URL = ($FIDELITY_MAINURL."ftgw/fi/FIIndividualBondsSearch?cusip="); my $FIDELITY_URL2 = ($FIDELITY_MAINURL."ftgw/fi/FILastTradeData?cusip="); sub methods { return (fidelityfixed => \&fidelityfixed); } sub labels { my @labels = qw/ method source name symbol coupon bid bidyield askyield ask date isodate time price /; return (fidelityfixed => \@labels); } sub fidelityfixed { my $quoter = shift; my @symbols = @_; my %info; my ($te, $ts, $row); my @rows; return unless @symbols; my $ua = $quoter->user_agent; $ua->ssl_opts(verify_hostname => 0); foreach my $symbol (@symbols) { my $url = $FIDELITY_URL.$symbol; #print "[debug]: ", $url, "\n"; my $response = $ua->request(GET $url); #print "[debug]: ", $response->content, "\n"; if (!$response->is_success) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Error contacting URL"; next; } $te = new HTML::TableExtract(); $te->parse($response->content); #print "[debug]: (parsed HTML)",$te, "\n"; unless ($te->first_table_found()) { #print STDERR "no tables on this page\n"; $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Parse error"; next; } # Debug to dump all tables in HTML... =begin comment print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== START OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n"; foreach $ts ($te->table_states) {; printf "\n \n \n \n[debug]: //// \\\\ //// \\\\ //// \\\\ //// \\\\ START OF TABLE %d,%d //// \\\\ //// \\\\ //// \\\\ //// \\\\ \n \n \n \n", $ts->depth, $ts->count; foreach $row ($ts->rows) { print '[debug]: ', join('|', @$row), "\n"; } } print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== END OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n"; =cut # GENERAL FIELDS $info{$symbol, "method"} = "fidelityfixed"; $info{$symbol, "symbol"} = $symbol; $info{$symbol, "source"} = $FIDELITY_MAINURL; # OTHER INFORMATION $ts = $te->table_state(0,1); if($ts) { (@rows) = $ts->rows; my $n = 3; if ($rows[$n][1] =~ /Fidelity is not currently offering this security/) { $n = 4; } if ( $rows[$n][1] !~ /do not match/ and $rows[$n][1] !~ /return to the previous page/ and 1 ) { $info{$symbol, 'success'} = 1; $info{$symbol, 'name'} = $rows[$n][1]; $info{$symbol, 'coupon'} = $rows[$n][2]; $info{$symbol, 'maturity'} = $rows[$n][3]; $info{$symbol, 'bidyield'} = $rows[$n][6]; $info{$symbol, 'bid'} = $rows[$n][7]; $info{$symbol, 'ask'} = $rows[$n][8]; $info{$symbol, 'askyield'} = $rows[$n][9]; if ($rows[$n][12] =~ "View") { # price data is in a spearate window $url = $FIDELITY_URL2.$symbol; #print "[debug URL2]: ", $url, "\n"; $response = $ua->request(GET $url); #print "[debug]: ", $response->content, "\n"; if (!$response->is_success) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Error contacting URL"; next; } $te->parse($response->content); #print "[debug]: (parsed HTML)",$te, "\n"; unless ($te->first_table_found()) { #print STDERR "no tables on this page\n"; $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Parse error"; next; } #$te->tables_dump(1, "|"); $ts = $te->table_state(0,4); if ($ts) { (@rows) = $ts->rows; if ($rows[0][0] =~ "Price" and $rows[0][3] =~ "Date/Time") { $info{$symbol, 'recent'} = $rows[1][0]; if ($rows[1][3] =~ /(\d+)\/(\d+)\/(\d+) (\d+)\:(\d+):(\d+)/) { $info{$symbol, 'date'} = "$1/$2/$3"; $info{$symbol, 'isodate'} = "$3-$2-$1"; $info{$symbol, 'time'} = $6 eq 'a' ? "$4:$5" : ($4+12).":$5"; } } } } else { $info{$symbol, 'recent'} = $rows[$n][11]; if ($response->content =~ /As of (\d+)\/(\d+)\/(\d+) at (\d+)\:(\d+) ([ap])\.m\./) { $info{$symbol, 'date'} = "$1/$2/$3"; $info{$symbol, 'isodate'} = "$3-$2-$1"; $info{$symbol, 'time'} = $6 eq 'a' ? "$4:$5" : ($4+12).":$5"; } } $info{$symbol,'bid'} = ($info{$symbol,'bid'} =~ /^\s*(\d+(?:\.\d+)?)/) ? $1 : undef ; $info{$symbol,'ask'} = ($info{$symbol,'ask'} =~ /^\s*(\d+(?:\.\d+)?)/) ? $1 : undef ; $info{$symbol,'recent'} = ($info{$symbol,'recent'} =~ /^\s*(\d+(?:\.\d+)?)/) ? $1 : undef ; if (!$info{$symbol,'bid'} || !$info{$symbol,'ask'} ) { $info{$symbol, 'price'} = $info{$symbol, 'recent'}; } else { $info{$symbol, 'price'} = sprintf("%.2f", 0.5*($info{$symbol, 'bid'} + $info{$symbol, 'ask'})); } $info{$symbol, 'currency'} = 'USD'; # clean things up a bit $info{$symbol, 'name'} =~ s/^\s+//; $info{$symbol, 'name'} =~ s/\s+$//; ($_) = /(\d+\.\d+)/ for $info{$symbol, 'price'}; } else { $info{$symbol, "errormsg"} = "no match"; } }; } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::FidelityFixed- Obtain individual bond quotes from Fidelity =head1 NOTE This is not a 'fixed' version of the Fidelity.pm module =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; # Don't know anything about failover yet... =head1 DESCRIPTION This module obtains individual bond quotes by CUSIP from fixedincome.fidelity.com =head1 LABELS RETURNED Information available from FidelityFixed may include the following labels: method source name symbol coupon bid bidyield askyield ask date isodate time price =head1 SEE ALSO fidelity.com https://www.fidelity.com/fixed-income-bonds/overview Finance::Quote =cut Finance-Quote-1.38/lib/Finance/Quote/FinanceCanada.pm000644 000765 000024 00000013427 12566055631 022054 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # FinanceCanada.pm # # Version 0.1 Initial version # # Version 0.2 Rewrite by David Hampton for # changed web site. # package Finance::Quote::FinanceCanada; require 5.004; use strict; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION my $FINANCECANADA_MAINURL = ("http://finance.canada.com/"); my $FINANCECANADA_URL = "http://stockgroup.canada.com/sn_overview.asp?symbol=T."; sub methods { return (canada => \&financecanada, financecanada => \&financecanada); } sub labels { my @labels = qw/method source name symbol currency last date isodate nav price/; return (canada => \@labels, financecanada => \@labels); } sub financecanada { my $quoter = shift; my @symbols = @_; my %info; return unless @symbols; my $ua = $quoter->user_agent; foreach my $symbol (@symbols) { my ($day_high, $day_low, $year_high, $year_low); $info{$symbol, "success"} = 0; $info{$symbol, "symbol"} = $symbol; $info{$symbol, "method"} = "financecanada"; $info{$symbol, "source"} = $FINANCECANADA_MAINURL; # Pull the data from the web site my $url = $FINANCECANADA_URL.$symbol; # print $url; my $response = $ua->request(GET $url); # print $response->content; if (!$response->is_success) { $info{$symbol, "errormsg"} = "Error contacting URL"; next; } # Parse the page looking for the table containing the full # name of the stock my $te = new HTML::TableExtract( depth => 2, count => 0); $te->parse($response->content); # debug # foreach my $ts ($te->table_states) { # print "\n***\n*** Table (", join(',', $ts->coords), "):\n***\n"; # foreach my $row ($ts->rows) { # print join(',', @$row), "\n"; # } # } foreach my $ts ($te->table_states) { my $row = $ts->row(0); $info{$symbol, "name"} = $row->[0] if ($row->[0] =~ s/^.([\w\s]+).*/$1/); } if (!defined($info{$symbol, "name"})) { $info{$symbol, "errormsg"} = "Invalid symbol"; next; } # Parse the page looking for the table containing the quote # details $te = new HTML::TableExtract(headers => [qw(Quote)], slice_columns => 0); $te->parse($response->content); # debug # foreach my $ts ($te->table_states) { # print "\n***\n*** Table (", join(',', $ts->coords), "):\n***\n"; # foreach my $row ($ts->rows) { # print join(',', @$row), "\n"; # } # } # Now parse the quote details. This method of parsing is # independent of which row contains which data item, so if the # web site reorders these it won't impact this code. foreach my $ts ($te->table_states) { foreach my $row ($ts->rows) { # Remove leading and trailing white space $row->[0] =~ s/^\s*(.+?)\s*$/$1/ if defined($row->[0]); $row->[1] =~ s/^\s*(.+?)\s*$/$1/ if defined($row->[1]); # Map the row into our data array for ($row->[0]) { /^Last Traded/ && do { s/Last Traded: (.*) ../$1/; $quoter->store_date(\%info, $symbol, { usdate => $_}); }; /^Last$/ && do { $info{$symbol, "last"} = $row->[1]; $info{$symbol, "price"} = $row->[1]; $info{$symbol, "nav"} = $row->[1]; last; }; /^Open$/ && do { $info{$symbol, "open"} = $row->[1]; last; }; /^Bid$/ && do { $info{$symbol, "bid"} = $row->[1]; last; }; /^Ask$/ && do { $info{$symbol, "ask"} = $row->[1]; last; }; /^% Change/ && do { $info{$symbol, "p_change"} = $row->[1]; $info{$symbol, "p_change"} =~ s/%//; last; }; /^Volume/ && do { $info{$symbol, "volume"} = $row->[1]; last; }; /^Close/ && do { $info{$symbol, "close"} = $row->[1]; last; }; /^Day High$/ && do { $info{$symbol, "high"} = $row->[1]; last; }; /^Day Low$/ && do { $info{$symbol, "low"} = $row->[1]; last; }; /^Year High$/ && do { $year_high = $row->[1]; last; }; /^Year Low$/ && do { $year_low = $row->[1]; last; }; $info{$symbol, "success"} = 1; }; } } if ($info{$symbol, "success"} == 1) { $info{$symbol, "currency"} = "CAD"; foreach (keys %info) { $info{$_} =~ s/\$//; } $info{$symbol, "day_range"} = $info{$symbol, "low"} . " - " . $info{$symbol, "high"} if (defined($info{$symbol, "high"}) && defined($info{$symbol, "low"})); if (defined($year_high) && defined($year_low)) { $info{$symbol, "year_range"} = "$year_low - $year_high"; } } else { $info{$symbol, "errormsg"} = "Cannot parse quote data"; } } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::FinanceCanada - Obtain stock and mutual fund prices from finance.canada.com =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; # Can failover to other methods %quotes = $q->fetch("canada", "stock_fund-code"); # Use this module only %quotes = $q->fetch("financecanada", "stock_fund-code"); =head1 DESCRIPTION This module obtains information about Canadian Stock and Mutual Funds from finanace.canada.com. The information source "canada" can be used if the information source is unimportant, or "financecanada" to specifically use finance.canada.com. =head1 STOCK_FUND-CODE Canadian stocks/mutual funds do not have a unique symbol identifier. This module uses the symbols as used on finance.canada.com. The simplest way to fetch the ID for a particular stock/fund is to go to finance.canada.com, search for your particular stock or mutual fund, and note the symbol ID. This is helpfully provided by the site in their returned HTML quote. =head1 LABELS RETURNED Information available from financecanada may include the following labels: method source name symbol currency date nav last price =head1 SEE ALSO Finance Canada.com website - http://finance.canada.com/ Finance::Quote =cut Finance-Quote-1.38/lib/Finance/Quote/Finanzpartner.pm000644 000765 000024 00000006267 12566055631 022246 0ustar00ecstaff000000 000000 # Finance::Quote Perl module to retrieve quotes from Finanzpartner.de # Copyright (C) 2007 Jan Willamowius # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA package Finance::Quote::Finanzpartner; use strict; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION my $FINANZPARTNER_URL = "http://www.finanzpartner.de/fi/"; sub methods {return (finanzpartner => \&finanzpartner);} sub labels { return (finanzpartner=>[qw/name date price last method/]); } # TODO # Trim leading and tailing whitespaces (also non-breakable whitespaces) sub trim { $_ = shift(); s/^\s*//; s/\s*$//; s/ //g; return $_; } # Convert number separators to US values sub convert_price { $_ = shift; tr/.,/,./ ; return $_; } sub finanzpartner { my $quoter = shift; # The Finance::Quote object. my @stocks = @_; my $ua = $quoter->user_agent(); my %info; foreach my $stock (@stocks) { $ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)'); my $response = $ua->get($FINANZPARTNER_URL . $stock . '/'); $info{$stock,"success"} = 0; if (!$response -> is_success()) { $info{$stock,"errormsg"} = "HTTP failure"; } else { my $te = new HTML::TableExtract(depth => 0, count => 2); $te->parse($response->content); my $table = $te->first_table_found; if (trim($table->cell(1,0)) ne 'Fondsname:') { $info{$stock,"errormsg"} = "Couldn't parse website"; } else { $info{$stock,"name"} = $table->cell(1,1); my $quote = $table->cell(6,1); my @part = split(/\s/, $quote); $info{$stock,"currency"} = $part[1]; $part[2] =~ s/\(//g; $part[2] =~ s/\)//g; $quoter->store_date(\%info, $stock, {eurodate => $part[2]}); $info{$stock,"price"} = convert_price(trim($part[0])); $info{$stock,"last"} = $info{$stock,"price"}; $info{$stock,"success"} = 1; $info{$stock,"method"} = "finanzpartner"; $info{$stock,"symbol"} = $stock; } } } return wantarray ? %info : \%info; } 1; =head1 NAME Finance::Quote::Finanzpartner - Obtain quotes from Finanzpartner.de. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new("Finanzpartner"); %info = $q->fetch("finanzpartner","LU0055732977"); =head1 DESCRIPTION This module obtains quotes from Finanzpartner.de (http://www.finanzpartner.de) by WKN or ISIN. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Finanzpartner: name, date, price, last, method. =head1 SEE ALSO Finanzpartner, http://www.finanzpartner.de/ Finance::Quote; =cut Finance-Quote-1.38/lib/Finance/Quote/Fool.pm000644 000765 000024 00000010671 12566055631 020316 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Paul Fenwick # Copyright (C) 2000, Brent Neal # Copyright (C) 2001, Tobias Vancura # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash require 5.005; use strict; package Finance::Quote::Fool; use HTTP::Request::Common; use LWP::UserAgent; use Exporter; use vars qw/$FOOL_URL @FIELDS $MAX_REQUEST_SIZE @ISA/; our $VERSION = '1.38'; # VERSION $FOOL_URL = 'http://quote.fool.com/quotes.csv?symbols='; # This is the maximum number of stocks we'll batch into one operation. # If this gets too big (>50 or thereabouts) things will break because # some proxies and/or webservers cannot handle very large URLS. $MAX_REQUEST_SIZE = 40; @FIELDS = qw/symbol price change open close high low yhigh ylow div yield vol avg_vol pe/; sub methods {return (fool => \&fool)} # The follow methods are valid, but not enabled for this release until further # testing has been performed. # usa => \&fool, # nasdaq => \&fool, # nyse => \&fool )} # { my @labels = (base_fool_labels(), "p_change", "currency", "method"); sub labels { return (fool => \@labels); } } sub base_fool_labels { return (@FIELDS) } # Query the stocks from the Motley Fool website (www.fool.com). The # data is returned as comma separated values, similar to Yahoo!Finance sub fool { my $quoter = shift; my @stocks = splice(@_, 0, $MAX_REQUEST_SIZE); return unless @stocks; my %info; my $ua = $quoter->user_agent; my $response = $ua->request(GET $FOOL_URL.join(",",@stocks)); return unless $response->is_success; # Okay, the data is here my $reply = $response->content; my $i=0; foreach (split('\x0D', $reply)) { if ( $i++ ) { # the first line only contains info about # the requested data, so we just skip it. my @q = $quoter->parse_csv($_); my $symbol = $q[0]; # print "Symbol: $symbol\n"; if ($#q != 13) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Stock lookup failed"; # print "ERROR\n"; } else { for (my $j=1; $j < @FIELDS; $j++) { # print "j = $j, $FIELDS[$j], $q[$j]\n"; $info{$symbol, $FIELDS[$j]} = $q[$j]; } $info{$symbol, "currency"} = "USD"; $info{$symbol, "method"} = "fool"; # change_p = change / prev_cl * 100% $info{$symbol, "p_change"} = $q[2]/$q[4]*100; } } } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Fool - Obtain quotes from the Motley Fool web site. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("fool","GE", "INTC"); =head1 DESCRIPTION This module obtains information from the Motley Fool website (www.fool.com). The site provides date from NASDAQ, NYSE and AMEX. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "Fool" in the argument list to Finance::Quote->new(). Information returned by this module is governed by the Motley Fool's terms and conditions. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Fool: symbol, price, change, open, close, high, low, yhigh, ylow, div, yield, vol, avg_vol, pe, change_p, currency, method. =head1 SEE ALSO Motley Fool, http://www.fool.com Finance::Quote. =cut Finance-Quote-1.38/lib/Finance/Quote/FTfunds.pm000644 000765 000024 00000027112 12566055631 020766 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # ftfunds.pm # # Obtains quotes for UK Unit Trusts from http://funds.ft.com/ - please # refer to the end of this file for further information. # # author: Martin Sadler (martinsadler@users.sourceforge.net) # # Version 0.1 Initial version - 06 Sep 2010 # # Version 0.2 Better look-up - 19 Sep 2010 # # Version 0.3 name changed to "ftfunds" # (all lower case) and tidy-up - 31 Jan 2011 # # Version 0.4 Allows alphanumerics MEXIDs # and back to "FTfunds" - 28 Feb 2011 # # Version 1.0 Changed to work with the new # format of funds.ft.com - 14 Sep 2011 # # Version 2.0 Changed to work with the latest # format of funds.ft.com - 31 Mar 2013 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # package Finance::Quote::FTfunds; require 5.005; use strict; use warnings; # Set DEBUG => 1 for no debug messages, => 1 for first level, => 2 for 2nd level, etc. use constant DEBUG => 0; # URLs use vars qw($VERSION $FTFUNDS_LOOK_UD $FTFUNDS_LOOK_LD $FTFUNDS_MAIN_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTTP::Cookies; use HTML::TokeParser; # use Data::Dumper; our $VERSION = '1.38'; # VERSION $FTFUNDS_MAIN_URL = "http://funds.ft.com"; $FTFUNDS_LOOK_LD = "http://funds.ft.com/UK/Tearsheet/Summary?s="; $FTFUNDS_LOOK_UD = "http://funds.ft.com/UnlistedTearsheet/Summary?s="; # this will work with ISIN codes only. # FIXME - sub methods { return (ftfunds => \&ftfunds_fund, ukfunds => \&ftfunds_fund); } { my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/; sub labels { return (ftfunds => \@labels, ukfunds => \@labels); } } # # ======================================================================= sub ftfunds_fund { my $quoter = shift; my @symbols = @_; return unless @symbols; my %fundquote; my $ua = $quoter->user_agent; my $cj = HTTP::Cookies->new(); $ua->cookie_jar( $cj ); foreach (@symbols) { my $code = $_; my $code_type = "** Invalid **"; if ($code =~ m/^[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)/ && !$1) { $code_type = "ISIN"; } elsif ($code =~ m/^[a-zA-Z0-9]{6}\d(.*)/ && !$1 ) { $code_type = "SEDOL"; } elsif ($code =~ m/^[a-zA-Z0-9]{4,6}(.*)/ && !$1) { $code_type = "MEXID"; } # current version can only use ISIN - report an error and exit if any other type if ($code_type ne "ISIN") { $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - invalid symbol"; next; } $fundquote {$code,"success"} = 1; # ever the optimist.... $fundquote {$code,"errormsg"} = "Success"; # perform the look-up - if not found, return with error # try listed funds first... my $webdoc = $ua->get($FTFUNDS_LOOK_LD.$code); if (!$webdoc->is_success) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data : HTTP status = ".$webdoc->status_line; next; } DEBUG and print "\nTitle = ",$webdoc->title,"\n"; DEBUG and print "\nStatus = ",$webdoc->status_line, "\n"; DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n"; $fundquote {$code, "source"} = $FTFUNDS_LOOK_LD.$code; # if page contains "

0 results

" it's not found... # ... try unlisted funds... if ($webdoc->content =~ m[

(0 results)

] ) { DEBUG and print "\nTrying unlisted funds for ",$code," : ",$1,"\n"; $webdoc = $ua->get($FTFUNDS_LOOK_UD.$code); if (!$webdoc->is_success) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data : HTTP status = ".$webdoc->status_line; next; } DEBUG and print "\nTitle = ",$webdoc->title,"\n"; DEBUG and print "\nStatus = ",$webdoc->status_line, "\n"; DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n"; $fundquote {$code, "source"} = $FTFUNDS_LOOK_UD.$code; } $fundquote {$code, "symbol"} = $code; # Find name by simple regexp my $name; if ($webdoc->content =~ m[(.*) Summary - FT.com] ) { $name = $1 ; } if (!defined($name)) { # not a serious error - don't report it .... # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find fund name"; $name = "*** UNKNOWN ***"; # ... and continue } $fundquote {$code, "name"} = $name; # set name # Find price my $price; if ($webdoc->content =~ m[<div class="contains wsodModuleContent"><table><tbody><tr><td class="text first">([\.\,0-9]*)</td>] ) { $price = $1; } if (!defined($price)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to find a price"; next; } if ($price =~ m[([0-9]*),([\.0-9]*)]) { $price = $1 * 1000 + $2; } # Find net and percent-age change my $net; my $pchange; if ($webdoc->content =~ m[<span class="(pos|neg) color ">([\.0-9]*) / ([\.0-9]*)%</span>] ) { $net = $2 ; # allow for alternates in match string $pchange = $3; } if (!defined($net)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find a net change."; $net = "-0.00"; # ???? is this OK ???? # ... and continue } if (!defined($pchange)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find a %-change"; $pchange = "-0.00"; # ???? is this OK ???? # ... and continue } if ($net =~ m[([0-9]*),([\.0-9]*)]) { $net = $1 * 1000 + $2; } if ($pchange =~ m[([0-9]*),([\.0-9]*)]) { $pchange = $1 * 1000 + $2; } # Find the currency my $currency; if ($webdoc->content =~ m[<th>(Price currency)</th><td>([A-Z]{3})</td>] ) { $currency = $2; } if (!defined($currency)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to find a currency"; next; } # deal with GBX pricing of UK unit trusts if ($currency eq "GBX") { $currency = "GBP" ; $price = $price / 100 ; $net = $net / 100 ; } # now set prices, net change and currency $fundquote {$code, "price"} = $price; $fundquote {$code, "last"} = $price; $fundquote {$code, "nav"} = $price; $fundquote {$code, "net"} = $net; $fundquote {$code, "currency"} = $currency; $fundquote {$code, "p_change"} = $pchange; # set %-change # Find time # NB. version 2.0 - there is no time quoted on the current (31/3/2013) factsheet page for unit trusts # ... this code left in in case it is available in later revisions of the page my $time; if ($webdoc->content =~ m[......... some string that will identify the time ............] ) { if ($1 =~ m[(\d\d:\d\d)] ) # strip any trailing text (Timezone, etc.) { $time = $1; } } if (!defined($time)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find a time"; $time = "17:00"; # set to 17:00 if no time supplied ??? # gnucash insists on having a valid-format # ... and continue } $fundquote {$code, "time"} = $time; # set time # Find date my $date; if ($webdoc->content =~ m[([A-Za-z]{3}) ([0-9]{2}) ([0-9]{4})] ) { $date = "$2/$1/$3" ; } if (!defined($date)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find a date"; # use today's date $quoter->store_date(\%fundquote, $code, {today => 1}); # ... and continue } else { $quoter->store_date(\%fundquote, $code, {eurodate => $date}); } $fundquote {$code, "method"} = "ftfunds"; # set method sleep 1; # go to sleep for a while to give the web-site a breather } # end of "foreach (@symbols)" return wantarray ? %fundquote : \%fundquote; } 1; =head1 NAME Finance::Quote::FTfunds - Obtain UK Unit Trust quotes from FT.com (Financial Times). =head1 SYNOPSIS $q = Finance::Quote->new; %info = Finance::Quote->fetch("ftfunds","<isin> ..."); # Only query FT.com using ISINs =head1 DESCRIPTION This module fetches information from the Financial Times Funds service, http://funds.ft.com. There are over 47,000 UK Unit Trusts and OEICs quoted, as well as many Offshore Funds and Exhange Traded Funds (ETFs). It converts any funds quoted in GBX (pence) to GBP, dividing the price by 100 in the process. Funds are identified by their ISIN code, a 12 character alphanumeric code. Although the web site also allows searching by fund name, this version of Finance::Quote::FTfunds only implements ISIN lookup. To determine the ISIN for funds of interest to you, visit the funds.ft.com site and use the flexible search facilities to identify the funds of interest. The factsheet display for any given fund displays the ISIN along with other useful information. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "ftfunds" in the argument list to Finance::Quote->new(). Information obtained by this module may be covered by funds.ft.com terms and conditions See http://funds.ft.com/ and http://ft.com for details. =head2 Stocks And Indices This module provides both the "ftfunds" and "ukfunds" fetch methods for fetching UK and Offshore Unit Trusts and OEICs prices and other information from funds.ft.com. Please use the "ukfunds" fetch method if you wish to have failover with future sources for UK and Offshore Unit Trusts and OEICs - the author has plans to develop Finance::Quote modules for the London Stock Exchange and Morningstar unit trust services. Using the "ftfunds" method will guarantee that your information only comes from the funds.ft.com website. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::ftfunds : name, currency, last, date, time, price, nav, source, method, iso_date, net, p_change, success, errormsg. =head1 SEE ALSO Financial Times websites, http://ft.com and http://funds.ft.com =head1 AUTHOR Martin Sadler, E<lt>martinsadler@users.sourceforge.netE<gt> =head1 COPYRIGHT AND LICENSE Copyright (C) 2010 by Martin Sadler This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.1 or, at your option, any later version of Perl 5 you may have available. =cut __END__ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/FTPortfolios.pm������������������������������������������������000644 �000765 �000024 �00000013245 12566055631 022011� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2000, Keith Refson <Keith.Refson@earth.ox.ac.uk> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> package Finance::Quote::FTPortfolios; require 5.004; use strict; use vars qw( $FTPORTFOLIOS_URL $FTPORTFOLIOS_ALL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $FTPORTFOLIOS_URL = ('http://www.ftportfolios.com/retail/productsearch.aspx'); $FTPORTFOLIOS_ALL="http://www.ftportfolios.com"; sub methods { return (ftportfolios => \&ftportfolios, ftportfolios_direct => \&ftportfolios); } { my @labels = qw/exchange method source name currency nav pop price/; sub labels { return (ftportfolios => \@labels, ftportfolios_direct => \@labels); } } # ======================================================================= sub ftportfolios { my $quoter = shift; my @symbols = @_; return unless @symbols; my(@q,%aa,$ua,$url,$sym,$ts,$date,$price,$currency,$reply,$trust); my ($row, $datarow, $matches); my %curr_iso = ("\$" => "USD"); my %symbolhash; @symbolhash{@symbols} = map(1,@symbols); # for (@symbols) { my $te = new HTML::TableExtract( ); $trust = $_; $url = "$FTPORTFOLIOS_URL"; # print STDERR "Retrieving \"$trust\" from $url\n"; $ua = $quoter->user_agent; # The web site now redirects to a different page which uses a # fund code number instead of the ticker symbol. push @{ $ua->requests_redirectable }, 'POST'; $reply = $ua->request(POST $url, [searchfor => $trust]); return unless ($reply->is_success); # print STDERR $reply->content,"\n"; $te->utf8_mode(1); $te->parse($reply->content); # foreach $ts ($te->table_states) { # print "***\n***Table (", join(',', $ts->coords), "):\n***\n"; # foreach $row ($ts->rows) { # print join(',', @$row), "\n"; # } # } $aa {$trust, "symbol"} = $trust; # Parse the fund name and the ticker symbol. $ts = $te->table(2, 2); if( !defined ($ts)) { $aa {$trust, "success"} = 0; $aa {$trust, "errormsg"} = "Fund name $trust is not found. See \"$FTPORTFOLIOS_ALL\""; next; } my $row = $ts->row(0); my ($a, $b) = (@$row[0]) =~ /^([-+.,\w\s]+).*Ticker: ([\w]+)/; # print STDERR "name |$a|, ticker |$b|\n"; if (!defined($a)) { $aa {$trust, "success"} = 0; $aa {$trust, "errormsg"} = "Failure parsing fund name."; next; } $aa {$trust, "name"} = $a; # Now parse the NAV and POP values $ts = $te->table(6, 1); foreach $row ($ts->rows) { # Remove leading and trailing white space $row->[0] =~ s/^\s*(.+?)\s*$/$1/ if defined($row->[0]); $row->[1] =~ s/^\s*(.+?)\s*$/$1/ if defined($row->[1]); # Map the row into our data array for ($row->[0]) { /^NAV/ && do { $aa{$trust, "nav"} = $row->[1]; last; }; /^POP/ && do { $aa{$trust, "pop"} = $row->[1]; $aa{$trust, "price"} = $row->[1]; last; }; $aa{$trust, "success"} = 1; }; } $aa {$trust, "exchange"} = "Ftportfolios"; $aa {$trust, "method"} = "ftportfolios"; $aa {$trust, "source"} = "http://www.ftportfolios.com/"; if ($aa{$trust, "success"} == 1) { $aa{$trust, "currency"} = "USD"; $aa{$_} =~ s/\$// foreach (keys %aa); # Parse out the transaction date. $reply->content =~ m/Trade Date:[^0-9]+([0-9\/]+)/s; # print STDERR "Date: $1\n"; $quoter->store_date(\%aa, $trust, {usdate => $1}); } else { $aa{$trust, "errormsg"} = "Cannot parse quote data"; } } return %aa if wantarray; return \%aa; } 1; =head1 NAME Finance::Quote::FTPortfolios - Obtain unit trust prices from www.ftportfolios.com =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("ftportfolios","FKYGTX"); # Can failover to other methods %stockinfo = $q->fetch("ftportfolios_direct","FKYGTX"); # Use this module only. =head1 DESCRIPTION This module obtains information about unit trust prices from www.ftportfolios.com. The information source "ftportfolios" can be used if the source of prices is irrelevant, and "ftportfolios_direct" if you specifically want to use ftportfolios.com. =head1 LABELS RETURNED Information available from Ftportfolios may include the following labels: exchange method source name currency nav pop price. =head1 SEE ALSO First Trust Portfolios website - http://www.ftportfolios.com/ =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/GoldMoney.pm���������������������������������������������������000644 �000765 �000024 �00000017244 12566055631 021317� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de> # Copyright (C) 2006, Klaus Dahlke <klaus.dahlke@gmx.de> # Copyright (C) 2008, Stephan Ebelt <stephan.ebelt@gmx.de> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # $Id: $ package Finance::Quote::GoldMoney; require 5.005; use HTTP::Request::Common; use JSON; use strict; use warnings; our $VERSION = '1.38'; # VERSION sub methods { return ( goldmoney => \&goldmoney ); } sub labels { return ( goldmoney => [qw/exchange name date isodate price method/] ); } # goldmoney($quoter, @symbols) # # - get 'gold' and 'silver' spot rates from goldmoney.com # - error out properly (that is: ignore) all other symbols # sub goldmoney { my $quoter = shift; my @symbols = @_; return unless @symbols; my $ua = $quoter->user_agent; # Set the ua to be blank. GoldMOney are using CloudFlare who block # the default useragent. $ua->agent(''); my ( %symbolhash, @q, %info ); my ( $html_string, $te, $table_gold, $table_silver, $table_platinum, $gold_gg, $gold_oz, $silver_oz, $platinum_oz, $platinum_pg, $currency ); my $_want_gold = 0; my $_want_silver = 0; my $_want_platinum = 0; # - feed all requested symbols into %info (to be returned later) # - set error state to false by default # - see if a gold or silver rate is requested foreach my $s (@symbols) { $info{ $s, 'success' } = 0; $info{ $s, 'exchange' } = 'goldmoney.com'; $info{ $s, 'method' } = 'goldmoney'; $info{ $s, 'symbol' } = $s; if ( $s eq 'gold' ) { $_want_gold = 1; } elsif ( $s eq 'silver' ) { $_want_silver = 1; } elsif ( $s eq 'platinum' ) { $_want_platinum = 1; } else { $info{ $s, 'errormsg' } = "No data returned (note: this module only works for 'gold' and 'silver')"; } } # get the JSON of the prices. Currently getting sell price, if ( $_want_gold or $_want_silver or $_want_platinum ) { my $currency = $quoter->{"currency"} || 'EUR'; my $GOLDMONEY_URL = "http://www.goldmoney.com/metal/prices/currentSpotPrices?currency=" . lc($currency) . "&units=grams&price=bid"; my $response = $ua->request( GET $GOLDMONEY_URL); if ( $response->is_success ) { $html_string = $response->content; my $json = from_json($html_string); $table_gold = $json->{spotPrices}[0]; $table_silver = $json->{spotPrices}[1]; $table_platinum = $json->{spotPrices}[2]; } else { # retrieval error - flag an error and return right away foreach my $s (@symbols) { %info = _goldmoney_error( @symbols, 'HTTP error: ' . $response->status_line ); return wantarray() ? %info : \%info; } return wantarray() ? %info : \%info; } # get gold rate # if ($_want_gold) { # assemble final dataset # - take "now" as date/time as the site is always current and does # not provide this explicitly - so there is a time-slip $quoter->store_date( \%info, 'gold', { isodate => _goldmoney_time('isodate') } ); $info{ 'gold', 'time' } = _goldmoney_time('time'); $info{ 'gold', 'name' } = 'Gold Spot'; $info{ 'gold', 'last' } = $table_gold->{spotPrice}; $info{ 'gold', 'price' } = $table_gold->{spotPrice}; $info{ 'gold', 'currency' } = $currency; $info{ 'gold', 'success' } = 1; } # get silver rate # if ($_want_silver) { $quoter->store_date( \%info, 'silver', { isodate => _goldmoney_time('isodate') } ); $info{ 'silver', 'time' } = _goldmoney_time('time'); $info{ 'silver', 'name' } = 'Silver Spot'; $info{ 'silver', 'last' } = $table_silver->{spotPrice}; $info{ 'silver', 'price' } = $table_silver->{spotPrice}; $info{ 'silver', 'currency' } = $currency; $info{ 'silver', 'success' } = 1; } # get platinum rate # if ($_want_platinum) { # assemble final dataset # - take "now" as date/time as the site is always current and does # not provide this explicitly - so there is a time-slip $quoter->store_date( \%info, 'platinum', { isodate => _goldmoney_time('isodate') } ); $info{ 'platinum', 'time' } = _goldmoney_time('time'); $info{ 'platinum', 'name' } = 'Platinum Spot'; $info{ 'platinum', 'last' } = $table_platinum->{spotPrice}; $info{ 'platinum', 'price' } = $table_platinum->{spotPrice}; $info{ 'platinum', 'currency' } = $currency; $info{ 'platinum', 'success' } = 1; } } return wantarray() ? %info : \%info; } # - populate %info with errormsg and status code set for all requested symbols # - return a hash ready to pass back to fetch() sub _goldmoney_error { my @symbols = shift; my $msg = shift; my %info; foreach my $s (@symbols) { $info{ $s, "success" } = 0; $info{ $s, "errormsg" } = $msg; } return (%info); } # - return current 'isodate' and 'time' string sub _goldmoney_time { my $want = shift; my @now = localtime(); my $str; if ( $want eq 'isodate' ) { $str = sprintf( '%4d-%02d-%02d', $now[5] + 1900, $now[4] + 1, $now[3] ); } elsif ( $want eq 'time' ) { $str = sprintf( '%02d:%02d:%02d', $now[2], $now[1], $now[0] ); } return ($str); } 1; =head1 NAME Finance::Quote::GoldMoney - obtain spot rates from GoldMoney. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %rates = $q->fetch('goldmoeny','gold', 'silver', 'platinum'); =head1 DESCRIPTION This module obtains current spot rates for 'gold', 'silver' and 'platinum' from Goldmoney (http://www.goldmoney.com). All other symbols are ignored. Information returned by this module is governed by Net Transactions Ltd.'s terms and conditions. This module is *not* affiliated with the company in any way. Use at your own risk. =head1 LABELS RETURNED The following labels are returned by Finance::Quote::GoldMoney: - exchange - name - date, time - price (per gram), - currency =head1 SEE ALSO GoldMoney (Net Transactions Ltd.), http://www.goldmoney.com/ =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/HEX.pm���������������������������������������������������������000644 �000765 �000024 �00000013115 12566055631 020037� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2001, Leigh Wedding <leigh.wedding@telstra.com> # Copyright (C) 2006, Mika Laari <mika.laari@iki.fi> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> require 5.005; use strict; package Finance::Quote::HEX; use HTTP::Request::Common; use LWP::UserAgent; use HTML::TableExtract; use vars qw/$HEX_URL /; our $VERSION = '1.38'; # VERSION $HEX_URL = 'http://omxgroup.is-teledata.com/html/securitypricelistequities.html?language=fi'; # XXX Europe should probably be removed since this module provides only # the Finnish quotes. sub methods {return ('europe' => \&hex, 'finland' => \&hex,'hex' => \&hex)} { my @labels = qw/name last high low date isodate time p_change volume bid ask price method exchange/; sub labels { return ('europe' => \@labels, 'finland' => \@labels, 'hex' => \@labels); } } # Helsinki Stock Exchange (HEX) # The HEX provides free delayed quotes through their webpage. # This module is heavily based on the ASX.pm. # # Maintainer of this section is Mika Laari <laari@iki.fi>. sub hex { my $quoter = shift; my @stocks = @_; return unless @stocks; my %info; my $ua = $quoter->user_agent; my $url = $HEX_URL; my $response = $ua->request(GET $url); unless ($response->is_success) { foreach my $stock (@stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "HTTP session failed"; } return wantarray() ? %info : \%info; } # Get a table containing information for all the stocks. my $te = HTML::TableExtract->new(); $te->parse($response->content); # Extract table contents. my @rows; unless (@rows = $te->rows) { foreach my $stock (@stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "Failed to parse HTML table."; } return wantarray() ? %info : \%info; } # Prepare an array for checking whether a symbol is among the wanted ones. my %is_stock = (); for (@stocks) { $is_stock{uc($_)} = 1 } # Pack the resulting data into our structure. foreach my $row (@rows) { my $stock = $$row[1]; next unless $stock; # Delete spaces and high bit characters. $stock =~ tr/ \200-\377//d; next unless $is_stock{$stock}; $info{$stock,'symbol'} = $stock; $info{$stock,'name'} = $$row[0]; $info{$stock,'name'} =~ s/^\s*(.*?)\s*$/$1/; $info{$stock,'p_change'} = $$row[3]; # Remove possible plus and other unnecessary characters. $info{$stock,'p_change'} =~ s/\+?(-?\d+,\d+)%/$1/; $info{$stock,'bid'} = $$row[4]; $info{$stock,'ask'} = $$row[5]; $info{$stock,'high'} = $$row[6]; $info{$stock,'low'} = $$row[7]; $info{$stock,'last'} = $$row[8]; # Again, get rid of nasty high-bit characters. #$info{$stock,'last'} =~ tr/ \200-\377//d; $info{$stock,'volume'} = $$row[9]; $info{$stock,'volume'} =~ tr/ \200-\377//d; # Use deciman point instead of comma. foreach my $label (qw/last bid ask high low p_change/) { $info{$stock,$label} =~ s/,/./; } $info{$stock, "currency"} = "EUR"; $quoter->store_date(\%info, $stock, {today => 1}); # $info{$stock, "time"} = $time; $info{$stock, "method"} = "hex"; $info{$stock, "exchange"} = "Helsinki Stock Exchange"; $info{$stock, "price"} = $info{$stock,"last"}; $info{$stock, "success"} = 1; } # All done. return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::HEX - Obtain quotes from the Helsinki Stock Exchange. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("hex","NOK1V"); # Only query ASX. %stockinfo = $q->fetch("finland","NOK1V"); # Failover to other sources OK. =head1 DESCRIPTION This module obtains information from the Helsinki Stock Exchange http://www.hex.com/. All Finnish stocks are available. This module is not loaded by default on a Finance::Quote object. It's possible to load it explicity by placing "HEX" in the argument list to Finance::Quote->new(). This module provides both the "hex" and "finland" fetch methods. Please use the "finland" fetch method if you wish to have failover with other sources for Finnish stocks. Using the "hex" method will guarantee that your information only comes from the Helsinki Stock Exchange. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::HEX: name, last, high, low, date, time, p_change, volume, bid, ask, price, method and exchange. =head1 SEE ALSO Helsinki Stock Exchange, http://www.hex.com/ =cut ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/HU.pm����������������������������������������������������������000644 �000765 �000024 �00000015260 12566055631 017732� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # HU.pm # # Version 0.3 - Fixed BAMOSZ website scraping and download stocks # directly from www.BET.hu # This version based on ZA.pm module # # Zoltan Levardy <zoltan at levardy dot org> 2008, 2009 # Kristof Marussy <kris7topher at gmail dot com> 2014 package Finance::Quote::HU; require 5.005; use strict; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; use Encode; our $VERSION = '1.38'; # VERSION my $BAMOSZ_MAINURL = "http://www.bamosz.hu/"; my $BAMOSZ_URL = $BAMOSZ_MAINURL . "alapoldal?isin="; my $BSE_MAINURL = "http://www.bet.hu/"; my $BSE_URL = $BSE_MAINURL . "topmenu/kereskedesi_adatok/product_search?isinquery="; sub methods { return ( hufund => \&bamosz, bamosz => \&bamosz, hustock => \&bse, bse => \&bse, bet => \&bse, hu => \&hu, hungary => \&hu ); } sub labels { my @fundlabels = qw/symbol method source name currency isin date isodate price last/; my @stocklabels = qw/symbol method source currency isin date isodate price open close high low p_change last/; my @alllabels = ( @stocklabels, "name" ); return ( hufund => \@fundlabels, bamosz => \@fundlabels, hustock => \@stocklabels, bse => \@stocklabels, bet => \@stocklabels, hu => \@alllabels, hungary => \@alllabels ); } sub hu { my $quoter = shift; my @symbols = @_; my %info; for my $symbol (@symbols) { my %bse_info = bse( $quoter, $symbol ); if ( $bse_info{ $symbol, "success" } ) { %info = ( %info, %bse_info ); next; } my %bamosz_info = bamosz( $quoter, $symbol ); if ( $bamosz_info{ $symbol, "success" } ) { %info = ( %info, %bamosz_info ); next; } $info{ $symbol, "success" } = 0; $info{ $symbol, "errormsg" } = "Fetch from bse or bamosz failed"; } return wantarray() ? %info : \%info; } sub bse { my $quoter = shift; my @symbols = @_; my %info; my $ua = $quoter->user_agent; for my $symbol (@symbols) { $info{ $symbol, "method" } = "bse"; $info{ $symbol, "source" } = $BSE_MAINURL; $info{ $symbol, "success" } = 0; my $url = $BSE_URL . $symbol; my $response = $ua->request( GET $url); unless ( $response->is_success ) { $info{ $symbol, "errormsg" } = "Request error"; next; } my $te = HTML::TableExtract->new( attribs => { class => "InsAdat_table" } ); $te->parse( decode_utf8( $response->content ) ); unless ( $te->first_table_found ) { $info{ $symbol, "errormsg" } = "No InsAdat_table found"; next; } my @found; TABLE_LOOP: for my $ts ( $te->tables ) { for my $row ( $ts->rows ) { my @trimmed_row = map { trim($_) } @$row; if ( $symbol eq $trimmed_row[1] || $symbol eq $trimmed_row[2] ) { @found = @trimmed_row; last TABLE_LOOP; } } } unless (@found) { $info{ $symbol, "errormsg" } = "No ticker or ISIN found"; next; } # I don't trade stocks, so I am unsure whether the data # extracted here is sensible. Please do improve this if # needed! $info{ $symbol, "symbol" } = $found[1]; $info{ $symbol, "isin" } = $found[2]; $info{ $symbol, "price" } = hu_decimal( $found[3] ); $info{ $symbol, "open" } = hu_decimal( $found[8] ); $info{ $symbol, "close" } = hu_decimal( $found[9] ); $info{ $symbol, "currency" } = $found[10]; $info{ $symbol, "low" } = hu_decimal( $found[13] ); $info{ $symbol, "high" } = hu_decimal( $found[14] ); $info{ $symbol, "p_change" } = hu_decimal( $found[16] ); $info{ $symbol, "last" } = hu_decimal( $found[17] ); $quoter->store_date( \%info, $symbol, { isodate => $found[18] } ); $info{ $symbol, "success" } = 1; } return wantarray() ? %info : \%info; } sub bamosz { my $quoter = shift; my @symbols = @_; my %info; my $ua = $quoter->user_agent; for my $symbol (@symbols) { $info{ $symbol, "method" } = "bamosz"; $info{ $symbol, "source" } = $BAMOSZ_MAINURL; $info{ $symbol, "success" } = 0; my $url = $BAMOSZ_URL . $symbol; my $response = $ua->request( GET $url); unless ( $response->is_success ) { $info{ $symbol, "errormsg" } = "Request error"; next; } my $te = HTML::TableExtract->new( attribs => { class => "dataTable" } ); $te->parse( decode_utf8( $response->content ) ); unless ( $te->first_table_found ) { $info{ $symbol, "errormsg" } = "No dataTable found"; next; } my $ts = $te->table( 0, 0 ); $info{ $symbol, "name" } = $ts->cell( 0, 1 ); my $isin = $ts->cell( 2, 1 ); $info{ $symbol, "symbol" } = $isin; $info{ $symbol, "isin" } = $isin; $info{ $symbol, "currency" } = $ts->cell( 3, 1 ); my $price = hu_decimal( $ts->cell( 5, 1 ) ); $info{ $symbol, "price" } = $price; $info{ $symbol, "last" } = $price; my $date = $ts->cell( 6, 1 ); $quoter->store_date( \%info, $symbol, { isodate => $date } ); $info{ $symbol, "success" } = 1; } return wantarray() ? %info : \%info; } sub trim { my $s = shift; if ($s) { $s =~ s/^\s+//; $s =~ s/\s+$//; return $s; } else { return ''; } } sub hu_decimal { my $s = shift; if ($s) { $s =~ s/[^\d,-]//g; $s =~ s/,/./; return $s; } else { return ''; } } 1; =head1 NAME Finance::Quote::HU - Obtain Hungarian Securities from www.bet.hu and www.bamosz.hu =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; # Don't know anything about failover yet... =head1 DESCRIPTION This module obtains information about Hungarian Securities. Share fetched from www.bet.hu, while mutual funds retrieved from www.bamosz.hu. Stocks may be searched by either ticker or ISIN, while mutual funds may only be search be ISIN. =head1 LABELS RETURNED Information available may include the following labels: method source name symbol currency date last price low high open close p_change =head1 SEE ALSO Budapest Stock Exchange (BET) website - http://www.bet.hu BAMOSZ website - http://www.bamosz.hu/ Finance::Quote =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/IndiaMutual.pm�������������������������������������������������000644 �000765 �000024 �00000011047 12566055631 021631� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # Version 0.1 preliminary version using Cdnfundlibrary.pm v0.4 as an example package Finance::Quote::IndiaMutual; require 5.010; use strict; use vars qw( $AMFI_URL $AMFI_NAV_LIST $AMFI_MAIN_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTTP::Status; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $AMFI_MAIN_URL = ("http://www.amfiindia.com/"); $AMFI_URL = ("http://portal.amfiindia.com/NAVReport.aspx?type=0"); #$AMFI_URL = ("http://portal.amfiindia.com/spages/NAV0.txt"); #This page seems to do the job also. Keep for reference # amfinavlist.txt is a cache-file. keep it until updated on the website since this is a 1meg file. my $cachedir = $ENV{TMPDIR} // $ENV{TEMP} // '/tmp/'; $AMFI_NAV_LIST = $cachedir."amfinavlist.txt"; sub methods { return (indiamutual => \&amfiindia, amfiindia => \&amfiindia); } { my @labels = qw/method source link name currency date isodate nav rprice sprice/; sub labels { return (indiamutual => \@labels, amfiindia => \@labels); } } # # ======================================================================= sub amfiindia { my $quoter = shift; my @symbols = @_; # Make sure symbols are requested ##CAN exit more gracefully - add later## return unless @symbols; # Local Variables my(%fundquote, %allquotes); my($ua, $url, $reply); $ua = $quoter->user_agent; $url = "$AMFI_URL"; $reply = $ua->mirror($url, $AMFI_NAV_LIST); # Make sure something is returned unless ($reply->is_success or $reply->code == RC_NOT_MODIFIED) { foreach my $symbol (@symbols) { $fundquote{$symbol,"success"} = 0; $fundquote{$symbol,"errormsg"} = "HTTP failure"; } return wantarray ? %fundquote : \%fundquote; } open NAV, $AMFI_NAV_LIST or die "Unexpected error in opening file: $!\n"; #Scheme Code;ISIN Div Payout/ ISIN Growth;ISIN Div Reinvestment;Scheme Name;Net Asset Value;Repurchase Price;Sale Price;Date while (<NAV>) { next if !/\;/; chomp; s/\r//; my ($symbol1, $symbol2, $symbol3, @data) = split /\s*\;\s*/; $allquotes{$symbol1} = \@data; if ($symbol2 ne "-") { $allquotes{$symbol2} = \@data; } if ($symbol3 ne "-") { $allquotes{$symbol3} = \@data; } } close(NAV); foreach my $symbol (@symbols) { $fundquote{$symbol, "symbol"} = $symbol; $fundquote{$symbol, "currency"} = "INR"; $fundquote{$symbol, "source"} = $AMFI_MAIN_URL; $fundquote{$symbol, "link"} = $url; $fundquote{$symbol, "method"} = "amfitable"; my $data = $allquotes{$symbol}; if ($data) { $fundquote{$symbol, "name"} = $data->[0]; $fundquote{$symbol, "nav"} = $data->[1]; $fundquote{$symbol, "rprice"} = $data->[2]; $fundquote{$symbol, "sprice"} = $data->[3]; $quoter->store_date(\%fundquote, $symbol, {eurodate => $data->[4]}); $fundquote{$symbol, "success"} = 1; } else { $fundquote{$symbol, "success"} = 0; $fundquote{$symbol, "errormsg"} = "Fund not found"; } } return wantarray ? %fundquote : \%fundquote; } 1; =head1 NAME Finance::Quote::IndiaMutual - Obtain Indian mutual fund prices from amfiindia.com =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("indiamutual", "amfiindia-code"); # Can failover to other methods %stockinfo = $q->fetch("amfiindia", "amfiindia-code"); # Use this module only. # NOTE: currently no failover methods exist for indiamutual =head1 DESCRIPTION This module obtains information about Indian Mutual Fund prices from the Association of Mutual Funds India website amfiindia.com. The information source "indiamutual" can be used if the source of prices is irrelevant, and "amfiindia" if you specifically want to use information downloaded from amfiindia.com. =head1 AMFIINDIA-CODE/ISIN In India, not all funds have an ISIN. However, they do have a scheme code. You can use those if you can't find the ISIN. See AMFI site for details. http://www.amfiindia.com/nav-history-download =head1 LABELS RETURNED Information available from amfiindia may include the following labels: method link source name currency nav rprice sprice. The link label will be a url location for the NAV list table for all funds. =head1 NOTES AMFI provides a link to download a text file containing all the NAVs. This file is mirrored in a local file /tmp/amfinavlist.txt. The local mirror serves only as a cache and can be safely removed. =head1 SEE ALSO AMFI india website - http://www.amfiindia.com/ Finance::Quote =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/LeRevenu.pm����������������������������������������������������000644 �000765 �000024 �00000030541 12566055631 021142� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2001, Rob Sessink <rob_ses@users.sourceforge.net> # Copyright (C) 2005, Morten Cools <morten@cools.no> # Copyright (C) 2006, Dominique Corbex <domcox@sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # require 5.005; use strict; package Finance::Quote::LeRevenu; use vars qw( $LR_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION my $LR_URL = 'http://bourse.lerevenu.com/recherchenom.hts'; sub methods { return ( france => \&lerevenu, lerevenu => \&lerevenu); } { my @labels = qw/name last date isodate p_change open high low close volume currency method exchange/; sub labels { return (france => \@labels, lerevenu => \@labels); } } sub lerevenu { my $quoter = shift; my @stocks = @_; my (%info,$reply,$url,$te,$ts,$row,$style); my $ua = $quoter->user_agent(); foreach my $stocks (@stocks) { $url="$LR_URL?recherchenom=$stocks&p=20"; $reply = $ua->request(GET $url); if ($reply->is_success) { # print STDERR $reply->content,"\n"; $te= new HTML::TableExtract( ); $te->parse($reply->content); unless ( $te->tables) { $info {$stocks,"success"} = 0; $info {$stocks,"errormsg"} = "Stock name $stocks not found"; next; } my @rows; unless (@rows = $te->rows) { $info {$stocks,"success"} = 0; $info {$stocks,"errormsg"} = "Parse error"; next; } # debug # foreach $ts ($te->table_states) { # print "Table (", join(',', $ts->coords), "):\n"; # foreach $row ($ts->rows) { # print join(',', @$row), "\n"; # } # } # style foreach $ts ($te->table_state(2, 0)){ @rows=$ts->rows; ($style=$rows[1][1]) =~ s/[>\n\s]*//g; } SWITCH: for ($style){ # style=stock /Actions/ && do { foreach $ts ($te->table_state(5, 0)){ @rows=$ts->rows; $info{$stocks, "name"}=$rows[0][0]; } foreach $ts ($te->table_state(8, 1)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ) { /Dernier/ && do { ($info{$stocks, "last"}=@$row[1]) =~ s/[^0-9.-]*//g; ($info{$stocks, "close"}=@$row[2]) =~ s/[^0-9.-]*//g; $info{$stocks, "success"}=1; $info{$stocks, "exchange"}="Euronext Paris"; $info{$stocks, "method"}="lerevenu"; $info{$stocks,"currency"}="EUR"; last ASSIGN; }; /Date/ && do { $quoter->store_date(\%info, $stocks, {eurodate => @$row[1]}); last ASSIGN; }; /Var %/ && do { ($info{$stocks, "p_change"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; /Volume/ && do { ($info{$stocks, "volume"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; /Premier/ && do { ($info{$stocks, "open"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; / Haut/ && do { ($info{$stocks, "high"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; / Bas/ && do { ($info{$stocks, "low"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; } } } foreach $ts ($te->table_state(6, 5)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /Isin/ && do { # GnuCash $info{$stocks, "symbol"}=@$row[1]; last ASSIGN; }; } } } last SWITCH; }; # style=bond /Obligations/ && do { foreach $ts ($te->table_state(5, 0)){ @rows=$ts->rows; $info{$stocks, "name"}=$rows[0][0]; } foreach $ts ($te->table_state(8, 0)){ @rows=$ts->rows; foreach $row ($ts->rows) { ($info{$stocks, "last"}=@$row[1]) =~ s/[^0-9.-]*//g; ($info{$stocks, "close"}=@$row[1]) =~ s/[^0-9.-]*//g; $info{$stocks, "success"}=1; $info{$stocks, "exchange"}="Euronext Paris"; $info{$stocks, "method"}="lerevenu"; $info{$stocks,"currency"}="EUR"; } } foreach $ts ($te->table_state(7, 1)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /Date/ && do { $quoter->store_date(\%info, $stocks, {eurodate => @$row[1]}); last ASSIGN; }; /Var %/ && do { ($info{$stocks, "p_change"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; /Volume/ && do { ($info{$stocks, "volume"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; /Premier/ && do { ($info{$stocks, "open"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; / haut/ && do { ($info{$stocks, "high"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; / bas/ && do { ($info{$stocks, "low"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; } } } foreach $ts ($te->table_state(8, 3)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /Isin/ && do { # GnuCash $info{$stocks, "symbol"}=@$row[1]; last ASSIGN; }; } } } last SWITCH; }; # style=fund /SICAVetFCP/ && do { my $myquote; my @mycurrency; foreach $ts ($te->table_state(6, 0)){ @rows=$ts->rows; $info{$stocks, "name"}=$rows[0][0]; ($info{$stocks, "last"}=$rows[0][2]) =~ s/[^0-9.-]*//g; $info{$stocks, "success"}=1; $info{$stocks, "exchange"}="Euronext Paris"; $info{$stocks, "method"}="lerevenu"; $myquote=$rows[0][2] ; @mycurrency= split / /, $myquote; ($info{$stocks,"currency"}=$mycurrency[1]) =~ s/[\W]*//g ; $quoter->store_date(\%info, $stocks, {eurodate => $rows[0][1]}); ($info{$stocks, "p_change"}=$rows[2][2])=~ s/[^0-9.-]*//g; } foreach $ts ($te->table_state(9, 7)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /Actif/ && do { my $nav; $nav=@$row[1]; $nav =~ s/[^0-9.]*//g; ($info{$stocks, "nav"}=($nav * 1000000)); last ASSIGN; }; } } } foreach $ts ($te->table_state(9, 9)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /ISIN/ && do { # GnuCash ($info{$stocks, "symbol"}=@$row[1]) =~ s/\s*//g; last ASSIGN; }; } } } last SWITCH; }; # style=warrant /Bons&Warrants/ && do { foreach $ts ($te->table_state(5, 0)){ @rows=$ts->rows; $info{$stocks, "name"}=$rows[0][0]; } foreach $ts ($te->table_state(7, 1)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /Dernier/ && do { ($info{$stocks, "last"}=@$row[1]) =~ s/[^0-9.-]*//g; ($info{$stocks, "close"}=@$row[1]) =~ s/[^0-9.-]*//g; $info{$stocks, "success"}=1; $info{$stocks, "exchange"}="Euronext Paris"; $info{$stocks, "method"}="lerevenu"; $info{$stocks,"currency"}="EUR"; last ASSIGN; }; /Date/ && do { $quoter->store_date(\%info, $stocks, {eurodate => @$row[1]}); last ASSIGN; }; /Var %/ && do { ($info{$stocks, "p_change"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; /Volume/ && do { ($info{$stocks, "volume"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; /Premier/ && do { ($info{$stocks, "open"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; / Haut/ && do { ($info{$stocks, "high"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; / Bas/ && do { ($info{$stocks, "low"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; } } foreach $ts ($te->table_state(6, 8)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /Isin/ && do { # GnuCash $info{$stocks, "symbol"}=@$row[1]; last ASSIGN; }; } } } } last SWITCH; }; # style=indice /Indices/ && do { foreach $ts ($te->table_state(5, 0)){ @rows=$ts->rows; $info{$stocks, "name"}=$rows[0][0]; } foreach $ts ($te->table_state(7, 1)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /Dernier/ && do { ($info{$stocks, "last"}=@$row[1]) =~ s/[^0-9.-]*//g; ($info{$stocks, "close"}=@$row[1]) =~ s/[^0-9.-]*//g; $info{$stocks, "success"}=1; $info{$stocks, "exchange"}="Euronext Paris"; $info{$stocks, "method"}="lerevenu"; $info{$stocks,"currency"}="EUR"; last ASSIGN; }; /Date/ && do { $quoter->store_date(\%info, $stocks, {eurodate => @$row[1]}); last ASSIGN; }; /Var %/ && do { ($info{$stocks, "p_change"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; /Premier/ && do { ($info{$stocks, "open"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; / Haut/ && do { ($info{$stocks, "high"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; / Bas/ && do { ($info{$stocks, "low"}=@$row[1]) =~ s/[^0-9.-]*//g; last ASSIGN; }; } } foreach $ts ($te->table_state(7, 2)){ @rows=$ts->rows; foreach $row ($ts->rows) { ASSIGN: for ( @$row[0] ){ /Isin/ && do { # GnuCash $info{$stocks, "symbol"}=@$row[1]; last ASSIGN; }; } } } } last SWITCH; }; { $info {$stocks,"success"} = 0; $info {$stocks,"errormsg"} = "Parse error"; } } } else { $info{$stocks, "success"}=0; $info{$stocks, "errormsg"}="Error retreiving $stocks "; } } return wantarray() ? %info : \%info; return \%info; } 1; =head1 NAME Finance::Quote::LeRevenu Obtain quotes from http://bourse.lerevenu.com. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("LeRevenu","FR0000031122"); # Only query LeRevenu %info = Finance::Quote->fetch("france","ml"); # Failover to other sources OK. =head1 DESCRIPTION This module fetches information from the "Paris Stock Exchange", http://bourse.lerevenu.com. All stocks are available. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "LeRevenu" in the argument list to Finance::Quote->new(). This module provides both the "lerevenu" and "france" fetch methods. Please use the "france" fetch method if you wish to have failover with future sources for French stocks. Using the "lerevenur" method will guarantee that your information only comes from the Paris Stock Exchange. Information obtained by this module may be covered by http://bourse.lerevenu.com terms and conditions See http://bourse.lerevenu.com for details. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::LeRevenu : name, last, date, p_change, open, high, low, close, volume, currency, method, exchange. =head1 SEE ALSO Le Revenu, http://bourse.lerevenu.com =cut ���������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/ManInvestments.pm����������������������������������������������000644 �000765 �000024 �00000013762 12566055631 022376� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2001, Leigh Wedding <leigh.wedding@telstra.com> # Copyright (C) 2003, Ian Dall <ian@beware.dropbear.id.au> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to additional data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> require 5.005; use strict; package Finance::Quote::ManInvestments; use HTTP::Request::Common; use LWP::UserAgent; use HTML::TableExtract; use vars qw/$MANINV_URL /; our $VERSION = '1.38'; # VERSION $MANINV_URL = 'http://www.maninvestments.com.au/index.cfm?action=productprices&cat_id=5'; $MANINV_URL = 'http://www.maninvestments.com.au/netassetvalues-print.cfm'; sub methods {return (maninv => \&maninv)} { my @labels = qw/name last nav date isodate currency/; sub labels { return (maninv => \@labels); } } # Man Investments Australia (ManInvestments) # Man Investments provides free delayed quotes through their webpage. # sub maninv { my $quoter = shift; my @stocks = @_; return unless @stocks; my %info; my $ua = $quoter->user_agent; my $response = $ua->request(GET $MANINV_URL); # print %$response,"\n"; unless ($response->is_success) { foreach my $stock (@stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "HTTP session failed"; } return wantarray() ? %info : \%info; } my $tel = HTML::TableExtract->new(headers => [qw(Product Net Rising)]); $tel->parse($response->content); foreach my $ts ($tel->table_states) { my ($depth, $count) = $ts->coords; # print "Table (", join(',', $ts->coords), "):\n", $depth, ',' , $count; my $te = HTML::TableExtract->new(depth => $depth, count => $count); $te->parse($response->content); # Extract table contents. my (@rows, @tmp_rows); unless (@rows = $te->rows) { foreach my $stock (@stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "Failed to parse HTML table."; } return wantarray() ? %info : \%info; } # foreach my $row (@rows) { # print(join(',',@$row),"\n"); # } # Discard the header row. shift @rows; # The new version of the web site puts the name on one # line and the rest of the data on the next line. while (@rows) { my $row1 = shift @rows; my $row2 = shift @rows; splice(@$row2, 0, 1, shift(@$row1)); push @tmp_rows, $row2; } @rows = @tmp_rows; # Pack the resulting data into our structure. foreach my $row (@rows) { my $name = @$row[0]; $name =~ tr/\000-\040\200-\377/ /s; $name =~ s/^ *//; $name =~ s/ *$//; # Map between Names and codes. There are no standard codes # for these so I made them up. my %map = ('OM-IP 220 Ltd' => 'OMIP220', 'Series 2 OM-IP 220 Ltd' => 'OMS2220', 'Series 3 OM-IP 220 Ltd' => 'OMS3220', 'Series 4 OM-IP 220 Ltd' => 'OMS4220', 'Series 5 OM-IP 220 Ltd' => 'OMS5220', 'Series 6 OM-IP 220 Ltd' => 'OMS6220', 'Series 7 OM-IP 220 Ltd' => 'OMS7220', 'Series 8 OM-IP 220 Ltd' => 'OMS8220', 'Series 9 OM-IP 220 Ltd' => 'OMS9220', 'OM-IP 320 Diversified Ltd' => 'OMIP320', 'OM-IP Strategic Ltd' => 'OMIPS', 'OM-IP Strategic Series 2 Ltd' => 'OMIPS2S', 'OM-IP Hedge Plus Ltd' => 'OMIPHP'); # Delete spaces and '*' which sometimes appears after the code. # Also delete high bit characters. my $stock = $map{$name}; if (! $stock) { next}; $info{$stock,'symbol'} = $stock; $info{$stock,'name'} = $name; $info{$stock, "currency"} = @$row[1]; $quoter->store_date(\%info, $stock, {eurodate => @$row[3]}); $info{$stock,'nav'} = @$row[4]; $info{$stock,'nav'} =~ tr/ $\000-\037\200-\377//d; $info{$stock,'last'} = $info{$stock,'nav'}; $info{$stock, "method"} = "maninv"; $info{$stock, "exchange"} = "Man Investments Australia"; $info{$stock, "success"} = 1; # print $info{$stock,'symbol'}; # foreach my $label (qw/name nav last date currency method exchange success/) { # print ", ", $info{$stock,$label}; # } # print "\n"; } } # All done. return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::ManInvestments - Obtain quotes from Man Investments Australia. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("maninv","BHP"); # Only query Man Investments =head1 DESCRIPTION This module obtains information from Man Investments Australia (formerly OM Strategic Investments) http://www.maninvestments.com.au/ This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "ManInvestments" in the argument list to Finance::Quote->new(). =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::ManInvestments: name, date, isodate, bid, ask, last, currency and price. =head1 SEE ALSO Man Investments Australia, http://www.maninvestments.com.au/ Finance::Quote::ManInvestments. =cut ��������������Finance-Quote-1.38/lib/Finance/Quote/Morningstar.pm�������������������������������������������������000644 �000765 �000024 �00000005653 12566055631 021726� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������package Finance::Quote::Morningstar; require 5.004; use strict; use vars qw( $MORNINGSTAR_SE_FUNDS_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION $MORNINGSTAR_SE_FUNDS_URL = 'http://morningstar.se/funds/overview.asp?cid='; sub methods { return (morningstar => \&morningstar); } { my @labels = qw/date isodate method source name currency price/; sub labels { return (morningstar => \@labels); } } sub morningstar { my $quoter = shift; my @symbols = @_; return unless @symbols; my ($ua, $reply, $url, %funds, $te, $table, $row, @value_currency, $name); foreach my $symbol (@symbols) { $name = $symbol; $url = $MORNINGSTAR_SE_FUNDS_URL; $url = $url . $name; $ua = $quoter->user_agent; $reply = $ua->request(GET $url); unless ($reply->is_success) { foreach my $symbol (@symbols) { $funds{$symbol, "success"} = 0; $funds{$symbol, "errormsg"} = "HTTP failure"; } return wantarray ? %funds : \%funds; } $te = new HTML::TableExtract(); $te->parse($reply->content); #print "Tables: " . $te->tables_report() . "\n"; my $counter = 0; my $dateset = 0; for my $table ($te->tables()) { for my $row ($table->rows()) { if (defined(@$row[0])) { if ('Senaste NAV' eq substr(@$row[0],0,11)) { @value_currency = split(/ /, $$row[2]); $funds{$name, 'method'} = 'morningstar_funds'; $funds{$name, 'price'} = $value_currency[0]; $funds{$name, 'currency'} = $value_currency[1]; $funds{$name, 'success'} = 1; $funds{$name, 'symbol'} = $name; $funds{$name, 'source'} = 'Finance::Quote::Morningstar'; $funds{$name, 'name'} = $name; $funds{$name, 'p_change'} = ""; # p_change is not retrieved (yet?) } if ($counter == 7 && $dateset == 0) { my $date = substr($$row[1],0,10); $quoter->store_date(\%funds, $name, {isodate => $date}); $dateset = 1; } } } $counter++; } # Check for undefined symbols foreach my $symbol (@symbols) { unless ($funds{$symbol, 'success'}) { $funds{$symbol, "success"} = 0; $funds{$symbol, "errormsg"} = "Fund name not found"; } } } return %funds if wantarray; return \%funds; } 1; =head1 NAME Finance::Quote::Morningstar - Obtain fund prices the Fredrik way =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %fundinfo = $q->fetch("morningstar","fund name"); =head1 DESCRIPTION This module obtains information about Fredrik fund prices from www.morningstar.se. =head1 FUND NAMES Use some smart fund name... =head1 LABELS RETURNED Information available from Fredrik funds may include the following labels: date method source name currency price. The prices are updated at the end of each bank day. =head1 SEE ALSO Perhaps morningstar? =cut �������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/MorningstarJP.pm�����������������������������������������������000644 �000765 �000024 �00000013066 12566055631 022155� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (C) 2012, Christopher Hill # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # $Id: $ # package Finance::Quote::MorningstarJP; require 5.006; use strict; use warnings; use base 'Exporter'; use DateTime; use vars qw( $MORNINGSTAR_JP_URL); our @EXPORT_OK = qw(morningstarjp methods labels); our $VERSION = '1.38'; # VERSION # NAV information (basis price) $MORNINGSTAR_JP_URL = ('http://www.morningstar.co.jp/FundData/DownloadStdYmd.do?fnc='); sub methods { return ( morningstarjp => \&morningstarjp ); } sub labels { return ( morningstarjp => [qw/symbol date nav/] ); } sub morningstarjp { my @symbols = @_; my $quoter = shift; my ( $ua, $response, %info, $date, $nav, $year, $month, $day, $fmyear, $fmmonth, $fmday, @data ); $ua = $quoter->user_agent; # calculate beginning and end date # Starting from 10 days prior (to cover any recent holiday gaps) my $calcDay = DateTime->now(); $year = $calcDay->year(); $month = $calcDay->month(); $day = $calcDay->day(); $calcDay->subtract( days => 10 ); $fmyear = $calcDay->year(); $fmmonth = $calcDay->month(); $fmday = $calcDay->day(); # Iterate over each symbol as site only permits query by single security foreach my $symbol (@symbols) { # Query the server via a POST request $response = $ua->post( $MORNINGSTAR_JP_URL . $symbol, [ selectStdYearFrom => $fmyear, selectStdMonthFrom => $fmmonth, selectStdDayFrom => $fmday, selectStdYearTo => $year, selectStdMonthTo => $month, selectStdDayTo => $day, base => '0' # 0 is daily, 1 is week ends (Friday), 2 is month ends only ], ); # Check response, CSV data is in an octet-stream if ( $response->is_success && $response->content_type eq 'application/octet-stream' ) { # Parse... # First row (in Shift-JIS) is fixed. It means "date","basis price" # 日付,基準価額 # Subsequent rows are in ascending chronological order # date(yyyymmdd),nav # # Split the data on CRLF or LF boundaries @data = split( '\015?\012', $response->content ); # We only care about the final row as that has the most recent data ( $date, $nav ) = $quoter->parse_csv( $data[-1] ); # Store the retrieved data into the hash ( $year, $month, $day ) = ( $date =~ m/(\d{4})(\d{2})(\d{2})/ ); $quoter->store_date( \%info, $symbol, { year => $year, month => $month, day => $day } ); $info{ $symbol, 'currency' } = 'JPY'; $info{ $symbol, 'method' } = 'MorningstarJP'; $info{ $symbol, 'name' } = $symbol; $info{ $symbol, 'nav' } = $nav; $info{ $symbol, 'success' } = 1; $info{ $symbol, 'symbol' } = $symbol; } elsif ( $response->is_success && $response->content_type eq 'text/html' ) { # HTML response that means POST was invalid and/or rejected. $info{ $symbol, 'errormsg' } = 'Invalid search criteria'; $info{ $symbol, 'success' } = 0; } else { # Unknown error encountered. $info{ $symbol, 'errormsg' } = 'Search unavailable'; $info{ $symbol, 'success' } = 0; } } return wantarray() ? %info : \%info; } 1; __END__ =head1 NAME Finance::Quote::MorningstarJP - Obtain price data from Morningstar (Japan). =head1 VERSION This documentation describes version 1.00 of MorningstarJP.pm, October 13, 2012. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = $q->fetch("morningstarjp", "2009100101"); =head1 DESCRIPTION This module obtains information from Morningstar (Japan), L<http://www.morningstar.co.jp/>. Information returned by this module is governed by Morningstar (Japan)'s terms and conditions. =head1 FUND SYMBOLS Use the numeric symbol shown in the URL on the "SnapShot" page of the security of interest. e.g. For L<http://www.morningstar.co.jp/FundData/SnapShot.do?fnc=2009100101>, one would supply 2009100101 as the symbol argument on the fetch API call. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::MorningstarJP: symbol, date, nav. =head1 REQUIREMENTS Perl 5.006 Date/Calc.pm Exporter.pm (included with Perl) =head1 ACKNOWLEDGEMENTS Inspired by other modules already present with Finance::Quote =head1 AUTHOR Christopher Hill =head1 LICENSE AND COPYRIGHT Copyright (C) 2012, Christopher Hill. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. =head1 DISCLAIMER This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. =head1 SEE ALSO Morningstar (Japan), L<http://www.morningstar.co.jp/> =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/MStaruk.pm�����������������������������������������������������000644 �000765 �000024 �00000022156 12566055631 021006� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # MStaruk.pm # # Obtains quotes for UK Unit Trusts from http://morningstar.co.uk/ - please # refer to the end of this file for further information. # # author: Martin Sadler (martinsadler@users.sourceforge.net) # # version: 0.1 Initial version - 01 April 2013 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # package Finance::Quote::MStaruk; require 5.005; use strict; use warnings; # URLs use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP $MSTARUK_MAIN_URL); use LWP::Simple; use LWP::UserAgent; use HTTP::Request::Common; use HTTP::Cookies; our $VERSION = '1.38'; # VERSION $MSTARUK_MAIN_URL = "http://www.morningstar.co.uk"; $MSTARUK_LOOK_UP = "http://www.morningstar.co.uk/uk/funds/SecuritySearchResults.aspx?search="; $MSTARUK_NEXT_URL = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id="; # FIXME - sub methods { return (mstaruk => \&mstaruk_fund, ukfunds => \&mstaruk_fund); } { my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/; sub labels { return (mstaruk => \@labels, ukfunds => \@labels); } } # # ======================================================================= sub mstaruk_fund { my $quoter = shift; my @symbols = @_; return unless @symbols; my %fundquote; my $ua = $quoter->user_agent; my $cj = HTTP::Cookies->new(); $ua->cookie_jar( $cj ); foreach (@symbols) { my $code = $_; my $code_type = "** Invalid **"; if ($code =~ m/^[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)/ && !$1) { $code_type = "ISIN"; } elsif ($code =~ m/^[a-zA-Z0-9]{6}\d(.*)/ && !$1 ) { $code_type = "SEDOL"; } elsif ($code =~ m/^[a-zA-Z]{4,6}(.*)/ && !$1) { $code_type = "MEXID"; } # current version can only use ISIN - report an error and exit if any other type if ($code_type ne "ISIN") { $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - invalid symbol"; next; } $fundquote {$code,"success"} = 1; # ever the optimist.... $fundquote {$code,"errormsg"} = "Success"; # perform the look-up - if not found, return with error my $webdoc = get($MSTARUK_LOOK_UP.$code); if (!$webdoc) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data"; next; } $fundquote {$code, "symbol"} = $code; $fundquote {$code, "source"} = $MSTARUK_MAIN_URL; # Find name by regexp my ($name, $nexturl, $isin); if ($webdoc =~ m[<td class="msDataText searchLink"><a href="(.*?)">(.*?)</a></td><td class="msDataText searchIsin"><span>[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)</span></td>] ) { $nexturl = $1; $name = $2; $isin = $3; } if (!defined($name)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find fund name"; $name = "*** UNKNOWN ***"; # ... and continue } $fundquote {$code, "name"} = $name; # set name if (!defined($nexturl)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data"; next; } # modify $nexturl to remove html escape encoding for the Ampersand (&) character $nexturl =~ s/&/&/; # Now need to look-up next page using $next_url $webdoc = get($MSTARUK_MAIN_URL.$nexturl); if (!$webdoc) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data"; next; } # Find date, currency and price all in one table row my ($currency, $date, $price, $pchange); if ($webdoc =~ m[<td class="line heading">NAV<span class="heading"><br />([0-9]{2}/[0-9]{2}/[0-9]{4})</span>.*([A-Z]{3}).([0-9\.]+).*>([0-9\.\-]+)] ) { $date = $1; $currency = $2; $price = $3; $pchange = $4; } if (!defined($pchange)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find net or %-age change"; # set to (minus)zero $pchange = -0.00; # ... and continue } $fundquote {$code, "p_change"} = $pchange; # set %-change if (!defined($date)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find a date"; # use today's date $quoter->store_date(\%fundquote, $code, {today => 1}); # ... and continue } else { $quoter->store_date(\%fundquote, $code, {eurodate => $date}); } if (!defined($price)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to find a price"; next; } if (!defined($currency)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to find a currency"; next; } # defer setting currency and price until we've dealt with possible GBX currency... # Calculate net change - it's not included in the morningstar factsheets my $net = ($price * $pchange) / 100 ; # deal with GBX pricing of UK unit trusts if ($currency eq "GBX") { $currency = "GBP" ; $price = $price / 100 ; $net = $net / 100 ; } # now set prices and currency $fundquote {$code, "price"} = $price; $fundquote {$code, "last"} = $price; $fundquote {$code, "nav"} = $price; $fundquote {$code, "net"} = $net; $fundquote {$code, "currency"} = $currency; # Set a dummy time as gnucash insists on having a valid format my $time = "12:00"; # set to Midday if no time supplied ??? # gnucash insists on having a valid-format $fundquote {$code, "time"} = $time; # set time $fundquote {$code, "method"} = "mstaruk"; # set method } return wantarray ? %fundquote : \%fundquote; } 1; =head1 NAME Finance::Quote::mstaruk - Obtain UK Unit Trust quotes from morningstar.co.uk. =head1 SYNOPSIS $q = Finance::Quote->new; %info = Finance::Quote->fetch("mstaruk","<isin> ..."); # Only query morningstar.co.uk using ISINs %info = Finance::Quote->fetch("ukfunds","<isin> ..."); # Failover to other sources =head1 DESCRIPTION This module fetches information from the MorningStar Funds service, http://morningstar.com/uk/. There are many UK Unit Trusts and OEICs quoted, as well as many Offshore Funds and Exhange Traded Funds (ETFs). It converts any funds quoted in GBX (pence) to GBP, dividing the price by 100 in the process. Funds are identified by their ISIN code. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "mstaruk" in the argument list to Finance::Quote->new(). Information obtained by this module may be covered by funds.ft.com terms and conditions See http://morningstar.co.ukfor details. =head2 Stocks And Indices This module provides both the "mstaruk" and "ukfunds" fetch methods for fetching UK and Offshore Unit Trusts and OEICs prices and other information from funds.ft.com. Please use the "ukfunds" fetch method if you wish to have failover with future sources for UK and Offshore Unit Trusts and OEICs - the author has plans to develop Finance::Quote modules for other source providing unit trust prices. Using the "mstaruk" method will guarantee that your information only comes from the morningstar.co.uk website. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::mstaruk : name, currency, last, date, time, price, nav, source, method, iso_date, net, p_change, success, errormsg. =head1 SEE ALSO Morning Star websites, http://morningstar.co.uk =head1 AUTHOR Martin Sadler, E<lt>martinsadler@users.sourceforge.netE<gt> =head1 COPYRIGHT AND LICENSE Copyright (C) 2010 by Martin Sadler This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.1 or, at your option, any later version of Perl 5 you may have available. =cut __END__ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/NZX.pm���������������������������������������������������������000644 �000765 �000024 �00000007413 12566055631 020076� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 2004, Michael Curtis # Modified from DWS.pm - its copyrights # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # package Finance::Quote::NZX; require 5.005; use strict; use LWP::UserAgent; use HTTP::Request::Common; our $VERSION = '1.38'; # VERSION sub methods { return (nz => \&nzx, nzx => \&nzx); } sub labels { my @labels = qw/exchange name price last date isodate method/; return (nz => \@labels, nzx => \@labels); } sub nzx { my $nzxurl = "http://www.nzx.com/scripts/portal_pages/p_csv_by_market.csv?code=ALL&board_type=S"; my $quoter = shift; my @symbols = @_; return unless @symbols; my $isLineOne = 1; my $ua = $quoter->user_agent; my $sDate; my (%symbolhash, @q, %info); # create hash of all stocks requested foreach my $symbol (@symbols) { $symbolhash{$symbol} = 0; } # get csv data my $response = $ua->request(GET $nzxurl); if ($response->is_success) { # process csv data foreach (split('\015?\012',$response->content)) { if ($isLineOne == 1) { $isLineOne = 0; ($sDate) = ($_ =~ /([0-9]{4}\/[0-9]{2}\/[0-9]{2})/g); } @q = $quoter->parse_csv($_) or next; if (exists $symbolhash{$q[0]}) { $symbolhash{$q[0]} = 1; $info{$q[0], "exchange"} = "NZX"; $info{$q[0], "name"} = $q[0]; $info{$q[0], "symbol"} = $q[0]; $info{$q[0], "price"} = $q[1]; $info{$q[0], "last"} = $q[7]; $quoter->store_date(\%info, $q[0], {isodate => $sDate}); $info{$q[0], "method"} = "nzx"; $info{$q[0], "currency"} = "NZD"; $info{$q[0], "success"} = 1; } } # check to make sure a value was returned for every stock requested foreach my $symbol (keys %symbolhash) { if ($symbolhash{$symbol} == 0) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "No data returned"; } } } else { foreach my $symbol (@symbols) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "HTTP error"; } } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::NZX - Obtain quotes from NZX (New Zealand stock exchange.) =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("nzx","TPW"); =head1 DESCRIPTION This module obtains information about NZX companies. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::NZX: exchange, name, date, price, last. =head1 SEE ALSO NZX (New Zealand stock exchange), http://www.nzx.com/ =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Platinum.pm����������������������������������������������������000644 �000765 �000024 �00000011440 12566055631 021203� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2001, Leigh Wedding <leigh.wedding@telstra.com> # Copyright (C) 2003, Ian Dall <ian@beware.dropbear.id.au> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to additional data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> require 5.005; use strict; package Finance::Quote::Platinum; use HTTP::Request::Common; use LWP::UserAgent; use HTML::TableExtract; use vars qw/$PLATINUM_URL /; our $VERSION = '1.38'; # VERSION $PLATINUM_URL = 'http://www.platinum.com.au/Platinum_Trust_Unit_Prices.htm'; sub methods {return (platinum => \&platinum)} { my @labels = qw/name last bid ask date isodate currency/; sub labels { return (platinum => \@labels); } } # Platinum Asset Management (Platinum) # Platinum provides free delayed quotes through their webpage. # sub platinum { my $quoter = shift; my @stocks = @_; return unless @stocks; my %info; my $ua = $quoter->user_agent; my $response = $ua->request(GET $PLATINUM_URL); unless ($response->is_success) { foreach my $stock (@stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "HTTP session failed"; } return wantarray() ? %info : \%info; } my $te = HTML::TableExtract->new( headers => ["product", "date", "entry", "exit"]); $te->parse($response->content); # Extract table contents. my @rows; unless (@rows = $te->rows) { foreach my $stock (@stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "Failed to parse HTML table."; } return wantarray() ? %info : \%info; } # Pack the resulting data into our structure. foreach my $row (@rows) { my $name = shift(@$row); next if !defined($name); # Map between Names and APIR codes my %map = ('Platinum European Fund' => 'PLA0001AU', 'Platinum International Fund' => 'PLA0002AU', 'Platinum Japan Fund' => 'PLA0003AU', 'Platinum Asia Fund' => 'PLA0004AU', 'Platinum International Brands Fund' => 'PLA0100AU', 'Platinum International Technology Fund' => 'PLA0101AU'); # Delete spaces and '*' which sometimes appears after the code. # Also delete high bit characters. $name =~ tr/ \000-\037\200-\377/ /s; $name =~ s/^ *//; $name =~ s/ *$//; my $stock = $map{$name}; if (! $stock) { next}; $info{$stock,'symbol'} = $stock; $info{$stock,'name'} = $name; foreach my $label (qw/date ask bid/) { $info{$stock,$label} = shift(@$row); # Again, get rid of nasty high-bit characters. $info{$stock,$label} =~ tr/ \200-\377//d unless ($label eq "name"); } $info{$stock,'last'} = $info{$stock,'bid'}; $quoter->store_date(\%info, $stock, {eurodate => $info{$stock,'date'}}); $info{$stock, "currency"} = "AUD"; $info{$stock, "method"} = "platinum"; $info{$stock, "exchange"} = "Platinum Asset Management"; $info{$stock, "price"} = $info{$stock,"last"}; $info{$stock, "success"} = 1; } # All done. return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Platinum - Obtain quotes from the Platinum Asset Management. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("platinum","BHP"); # Only query Platinum. =head1 DESCRIPTION This module obtains information from the Platinum Asset Management http://www.platinum.com.au/docs/pricing.htm. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "Platinum" in the argument list to Finance::Quote->new(). =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Platinum: name, date, bid, ask, last, currency and price. =head1 SEE ALSO Platinum Asset Management, http://www.platinum.com.au/docs/pricing.htm Finance::Quote::Yahoo::Australia. =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/SEB.pm���������������������������������������������������������000644 �000765 �000024 �00000007626 12566055631 020036� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2000, Keith Refson <Keith.Refson@earth.ox.ac.uk> # Copyright (C) 2003, Tomas Carlsson <tc@tompa.nu> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code was derived from the work on the packages Finance::Yahoo::* # package Finance::Quote::SEB; require 5.004; use strict; use vars qw( $SEB_FUNDS_URL); use LWP::UserAgent; use HTTP::Request::Common; use utf8; our $VERSION = '1.38'; # VERSION $SEB_FUNDS_URL = 'http://taz.vv.sebank.se/cgi-bin/pts3/pow/fmk/2100/Senaste_fondkurserna.TXT'; sub methods { return (seb_funds => \&seb_funds); } { my @labels = qw/date isodate method source name currency price/; sub labels { return (seb_funds => \@labels); } } sub seb_funds { my $quoter = shift; my @symbols = @_; return unless @symbols; my ($ua, $reply, $url, %funds); $url = $SEB_FUNDS_URL; $ua = $quoter->user_agent; $reply = $ua->request(GET $url); unless ($reply->is_success) { foreach my $symbol (@symbols) { $funds{$symbol, "success"} = 0; $funds{$symbol, "errormsg"} = "HTTP failure"; } return wantarray ? %funds : \%funds; } foreach my $line (split /\n/, $reply->content) { chomp($line); # Format: # 2003-08-11;SEB Aktiesparfond;5,605;387 my ($date, $name, $price, $hmm) = split ';', $line; utf8::encode($name); if (grep {$_ eq $name} @symbols) { $price =~ s/,/\./; # change decimal point from , to . $funds{$name, 'symbol'} = $name; $quoter->store_date(\%funds, $name, {isodate => $date}); $funds{$name, 'method'} = 'seb_funds'; $funds{$name, 'source'} = 'Finance::Quote::SEB'; $funds{$name, 'name'} = $name; $funds{$name, 'currency'} = 'SEK'; $funds{$name, 'price'} = $price; $funds{$name, 'success'} = 1; } } # Check for undefined symbols foreach my $symbol (@symbols) { unless ($funds{$symbol, 'success'}) { $funds{$symbol, "success"} = 0; $funds{$symbol, "errormsg"} = "Fund name not found"; } } return %funds if wantarray; return \%funds; } 1; =head1 NAME Finance::Quote::SEB - Obtain fund prices from www.seb.se =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %fundinfo = $q->fetch("seb_funds","fund name"); =head1 DESCRIPTION This module obtains information about SEB fund prices from www.seb.se. The only available information source is "seb_funds" and it will use www.seb.se. =head1 FUND NAMES Unfortunately there is no unique identifier for the fund names. Therefore the complete fund name must be given, including spaces, case is important. Consult http://taz.vv.sebank.se/cgi-bin/pts3/pow/Fonder/kurser/kurslista_body.asp for all available funds. Example "SEB Aktiesparfond" =head1 LABELS RETURNED Information available from SEB may include the following labels: date method source name currency price. The prices are updated at the end of each bank day. =head1 SEE ALSO SEB website - http://www.seb.se/ =cut ����������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/SIXfunds.pm����������������������������������������������������000644 �000765 �000024 �00000004132 12566055631 021115� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SIX Swiss Exchange - Funds # (c) 2011 Stephan Walter <stephan@walter.name> # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. package Finance::Quote::SIXfunds; use HTTP::Request::Common; our $VERSION = '1.38'; # VERSION my $url = 'http://www.six-swiss-exchange.com/funds/security_info_en.html?id='; sub methods { return ( sixfunds => \&sixfunds ); } sub labels { return ( sixfunds => [qw/name date time price last currency p_change/] ); } sub sixfunds { my $quoter = shift; my @symbols = @_; return unless @symbols; my ( $ua, $reply, %q ); foreach my $symbol (@symbols) { $ua = $quoter->user_agent; $q{ $symbol, 'success' } = 0; $q{ $symbol, 'name' } = $symbol; $q{ $symbol, 'symbol' } = $symbol; $reply = $ua->request( GET( $url . $symbol ) ); if ( !$reply->is_success ) { $q{ $symbol, 'errormsg' } = 'HTTP failure'; } else { if ( $reply->content =~ />([A-Z]{3}) <\/td><td.+?id="mop_ClosingPrice".+?>([0-9.]+)<\/td>/ ) { $q{ $symbol, 'currency' } = $1; $q{ $symbol, 'last' } = $2; $q{ $symbol, 'success' } = 1; } if ( $reply->content =~ /<td.+?id="mop_LastDate".+?>([0-3][0-9]\.[01][0-9]\.[0-9]{4})<\/td>/ ) { $quoter->store_date( \%q, $symbol, { eurodate => $1 } ); } if ( $reply->content =~ /<td.+?id="mop_LastTime".+?>([0-2][0-9]:[0-5][0-9]:[0-5][0-9])<\/td>/ ) { $q{ $symbol, 'time' } = $1; } if ( $reply->content =~ /<td.+?id="mop_ClosingDelta".+?>(-?[0-9.]+)%<\/td>/ ) { $q{ $symbol, 'p_change' } = $1; } } } return wantarray ? %q : \%q; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/SIXshares.pm���������������������������������������������������000644 �000765 �000024 �00000004141 12566055631 021263� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SIX Swiss Exchange - Shares # (c) 2011 Stephan Walter <stephan@walter.name> # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. package Finance::Quote::SIXshares; use HTTP::Request::Common; our $VERSION = '1.38'; # VERSION my $url = 'http://www.six-swiss-exchange.com/shares/security_info_en.html?id='; sub methods { return ( sixshares => \&sixshares ); } sub labels { return ( sixshares => [qw/name date time price last currency p_change/] ); } sub sixshares { my $quoter = shift; my @symbols = @_; return unless @symbols; my ( $ua, $reply, %q ); foreach my $symbol (@symbols) { $ua = $quoter->user_agent; $q{ $symbol, 'success' } = 0; $q{ $symbol, 'name' } = $symbol; $q{ $symbol, 'symbol' } = $symbol; $reply = $ua->request( GET( $url . $symbol ) ); if ( !$reply->is_success ) { $q{ $symbol, 'errormsg' } = 'HTTP failure'; } else { if ( $reply->content =~ />([A-Z]{3}) <\/td><td.+?id="mop_ClosingPrice".+?>([0-9.]+)<\/td>/ ) { $q{ $symbol, 'currency' } = $1; $q{ $symbol, 'last' } = $2; $q{ $symbol, 'success' } = 1; } if ( $reply->content =~ /<td.+?id="mop_LastDate".+?>([0-3][0-9]\.[01][0-9]\.[0-9]{4})<\/td>/ ) { $quoter->store_date( \%q, $symbol, { eurodate => $1 } ); } if ( $reply->content =~ /<td.+?id="mop_LastTime".+?>([0-2][0-9]:[0-5][0-9]:[0-5][0-9])<\/td>/ ) { $q{ $symbol, 'time' } = $1; } if ( $reply->content =~ /<td.+?id="mop_ClosingDelta".+?>(-?[0-9.]+)%<\/td>/ ) { $q{ $symbol, 'p_change' } = $1; } } } return wantarray ? %q : \%q; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/StockHouseCanada.pm��������������������������������������������000644 �000765 �000024 �00000013504 12566055631 022574� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # StockHouseCanada.pm # # author: Chris Carton (ctcarton@gmail.com) # # Basic outline of this module was copied # from Cdnfundlibrary.pm # # Version 0.1 Initial version # Version 0.2, 9April2008, Updated for changed stockhouse.com site. Doug Brown. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # package Finance::Quote::StockHouseCanada; require 5.004; use strict; use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL $STOCKHOUSE_MAIN_URL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION $STOCKHOUSE_LOOKUP_URL="http://www.stockhouse.com/mutualFunds/index.asp?asp=1&lang=&item=searchresult&country=CAN&by=symbol&searchtext="; $STOCKHOUSE_URL="http://www.stockhouse.com/MutualFunds/index.asp?item=snapshot&page=1&Lang=EN&fundkey=%s&source=Fundata&Symbol=%s&FundName=&CompanyName=&asp=1"; $STOCKHOUSE_MAIN_URL=("http://www.stockhouse.ca"); # FIXME - Add methods to lookup other commodities sub methods { return (stockhousecanada_fund => \&stockhouse_fund, canadamutual => \&stockhouse_fund); } { my @labels = qw/name currency last date isodate price source/; sub labels { return (stockhousecanada_fund => \@labels, canadamutual => \@labels); } } # # ======================================================================= sub stockhouse_fund { my $quoter = shift; my @symbols = @_; #print "StockHouseCanada::stockhouse_fund called.\n"; return unless @symbols; my %fundquote; my $ua = $quoter->user_agent; foreach (@symbols) { my $mutual = $_; # First, we have to get the fund code my $url = $STOCKHOUSE_LOOKUP_URL.$mutual; my $reply = $ua->request(GET $url); # Check the outcome of the response if (!$reply->is_success) { $fundquote {$mutual,"success"} = 0; $fundquote {$mutual,"errormsg"} = "Error retrieving page: $reply->status_line."; next; } unless ($reply->content =~ /fundkey%3D(\d*)/) { $fundquote {$mutual,"success"} = 0; $fundquote {$mutual,"errormsg"} = "Error determining fund code for $mutual."; next; } my $code = $1; #print "Code for $mutual is $code.\n"; $url = sprintf($STOCKHOUSE_URL, ($code, $mutual)); # print "StockHouseCanada using URL $url \n"; $reply = $ua->request(GET $url); $fundquote {$mutual, "symbol"} = $mutual; $fundquote {$mutual, "source"} = $STOCKHOUSE_MAIN_URL; # Check the outcome of the response if (!$reply->is_success) { $fundquote {$mutual,"success"} = 0; $fundquote {$mutual,"errormsg"} = "Error retrieving page: $reply->status_line."; next; } # print "Retrieving $url\n"; $fundquote {$mutual, "success"} = 0; next unless ($reply->is_success); ###################################################### # debug #my $tetest= new HTML::TableExtract( headers => [qw(NAVPS CURRENCY)] ); #$tetest->parse($reply->content); #foreach my $tstest ($tetest->table_states) { # print "\n***\n*** Table (", join(',', $tstest->coords), "):\n***\n"; # foreach my $rowtest ($tstest->rows) { # print join(',', @$rowtest), "\n***\n"; # } #} # # print $reply->content; ###################################################### # We're looking for these 3 things my $nav; my $currency; my $navdate; my $name; # Find name by simple regexp if ($reply->content =~ m/<td class=ft_h1>(.*) \($mutual\)<\/td>/ ) { $name = $1 ; #print ">>>$name<<<<\n"; } $fundquote {$mutual, "name"} = $name; # Find NAV and Currency via table header my $te= new HTML::TableExtract( headers => [qw(NAVPS CURRENCY)] ); $te->parse($reply->content); # There should only be one hit foreach my $ts ($te->table_states) { foreach my $row ($ts->rows) { $nav = $$row[0]; $currency = $$row[1]; } last; } # print "Nav = $nav, currency = $currency\n"; if (!defined($nav)) { $fundquote {$mutual,"success"} = 0; $fundquote {$mutual,"errormsg"} = "Error parsing NAV for $mutual."; next; } $fundquote {$mutual, "last"} = $nav; $fundquote {$mutual, "price"} = $nav; $fundquote {$mutual, "nav"} = $nav; if (!defined($currency)) { $fundquote {$mutual,"success"} = 0; $fundquote {$mutual,"errormsg"} = "Error parsing currency for $mutual."; next; } $fundquote {$mutual, "currency"} = $currency; # I can't find a good anchor for the date, so just look for the label if ($reply->content =~ /As of  (.*) /) { $navdate = $1; } # normalize $navdate to format mm/dd/yyyy by adding zeros where needed $navdate =~ s|^(\d)/|0$1/| ; #month $navdate =~ s|/(\d)/|/0$1/| ; #day #print "Date = $navdate\n"; if (!defined($navdate)) { $fundquote {$mutual,"success"} = 0; $fundquote {$mutual,"errormsg"} = "Error parsing date for $mutual."; next; } $fundquote {$mutual, "date"} = $navdate; ($fundquote {$mutual, "isodate"} = $navdate) =~ s|(\d+)/(\d+)/(\d+)|$3/$1/$2| ; #print "isodate = $fundquote{$mutual,'isodate'}\n"; $fundquote {$mutual, "success"} = 1; } return %fundquote if wantarray; return \%fundquote; } 1; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Tdefunds.pm����������������������������������������������������000644 �000765 �000024 �00000011613 12566055631 021170� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2001, James Treacy <treacy@debian.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # package Finance::Quote::Tdefunds; require 5.005; use strict; use vars qw( $TD_URL); use LWP::UserAgent; use HTTP::Request::Common; use Carp; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. #$TD_URL = ("http://tdfunds.tdam.com/tden/FundProfile/FundProfile.cfm"); #$TD_URL = ("http://tdfunds.tdam.com/tden/Download/v_DownloadProcess.cfm?SortField=FundName&SortOrder=ASC&Nav=No&Group=99&WhereClause=Where%20FC%2EFund%5FClass%5FORDER%20%3C%2099%20and%20TD%2ERisk%5FCat%5FID%20%21%3D%204&DownloadType=CSV"); $TD_URL = ("http://www.tdassetmanagement.com/TDAMFunds/Download/v_Download.asp?TAB=PRICE&PID=10&DT=csv&SORT=TDAM_FUND_NAME&FT=all&MAP=N&SI=4"); my(%currencies) = ( "CDN" => "CAD", "US" => "USD" ); sub methods { return (tdefunds => \&tdefunds); } sub labels { return (tdefunds => [qw/method exchange name nav date isodate price/]); } # ======================================================================= # # Converts a description to a stock-like symbol # sub tdefunds_create_symbol { my($name) = shift; # Take out any bad characters $name =~ s/[^a-zA-Z\.\^\ \*]//g; # Multiple consecutive speces converted to a single space. $name =~ s/\s+/ /g; return $name; # return "TDSCITECH"; } # # Maps the provided currency, where possible, to the correct ISO code. # sub tdefunds_get_currency { my($currency) = shift; $currency =~ s/\$//g; $currency =~ s/\s//g; if ( defined($currencies{$currency}) ) { $currency = $currencies{$currency}; } return $currency; } sub tdefunds { my $quoter = shift; my(@q,%aa,$ua,$url,$sym,$price); $url = $TD_URL; $ua = $quoter->user_agent; my $reply = $ua->request(GET $url); return unless ($reply->is_success); foreach (split('\015?\012',$reply->content)) { @q = $quoter->parse_csv($_); # Skip the non-data rows. next if (!defined($q[0]) || !defined($q[1])); # Skip the section headers next if $q[0] =~ /^Fund Number/; # Skip the title ($sym = $q[1]) =~ s/^ +//; if ($sym) { # make sure what we get looks like an acceptable stock symbol # only allow a-z + '.' + "^" my($name) = $sym; $sym = &tdefunds_create_symbol($sym); # $sym =~ tr/a-z/A-Z/; $aa {$sym, "symbol"} = $sym; $aa {$sym, "exchange"} = "TD Waterhouse"; # TRP $aa {$sym, "method"} = "tdefunds"; $aa {$sym, "name"} = $name; $price = $q[3]; $price =~ s/\$//; $price =~ s/^ +//; $aa {$sym, "last"} = $price; $quoter->store_date(\%aa, $sym, {usdate => $q[2]}); $aa {$sym, "nav"} = $aa{$sym,"last"}; $aa {$sym, "success"} = 1; $aa {$sym, "currency"} = &tdefunds_get_currency($q[4]); } else { $aa {$sym, "success"} = 0; $aa {$sym, "errormsg"} = "Fund lookup failed."; } } return %aa if wantarray; return \%aa; } 1; =head1 NAME Finance::Quote::Tdefunds - Obtain quotes from TD Waterhouse Efunds =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %quotes = $q->tdefunds ("TD Canadian Index"); $date = $quotes {"TD Canadian Index", "date"}; $nav = $quotes {"TD Canadian Index", "nav"}; print "TD Canadian Index $date: NAV = $nav\n"; $nav = $quotes {"TD Canadian Index", "nav"}; =head1 DESCRIPTION This module obtains information about managed funds from TD Waterhouse Canada Efunds. All TD Waterhouse efunds are downloaded at once. The symbols for each efund are the names of the efund with any unusal characters (not a letter, space or period) removed. For example; a fund called "TD US Index ($US)" would have the symbol "TD US Index US". =head1 LABELS RETURNED Information available from TD Waterhouse may include the following labels: exchange, name, nav, date, price, currency. =head1 SEE ALSO TD Waterhouse website - http://www.tdwaterhouse.ca/ =cut ���������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Tdwaterhouse.pm������������������������������������������������000644 �000765 �000024 �00000011645 12566055631 022077� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2001, James Treacy <treacy@debian.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # package Finance::Quote::Tdwaterhouse; require 5.005; use strict; use vars qw( $TD_URL); use LWP::UserAgent; use HTTP::Request::Common; use Carp; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. #$TD_URL = ("http://tdfunds.tdam.com/tden/FundProfile/FundProfile.cfm"); #$TD_URL = ("http://tdfunds.tdam.com/tden/Download/v_DownloadProcess.cfm?SortField=FundName&SortOrder=ASC&Nav=No&Group=99&WhereClause=Where%20FC%2EFund%5FClass%5FORDER%20%3C%2099%20and%20TD%2ERisk%5FCat%5FID%20%21%3D%204&DownloadType=CSV"); $TD_URL = ("http://www.tdassetmanagement.com/TDAMFunds/Download/v_Download.asp?TAB=PRICE&PID=5&DT=csv&SORT=TDAM_FUND_NAME&FT=all&MAP=N&SI=4"); my(%currencies) = ( "CDN" => "CAD", "US" => "USD" ); sub methods { return (tdwaterhouse => \&tdwaterhouse); } sub labels { return (tdwaterhouse => [qw/method exchange name nav date isodate price/]); } # ======================================================================= # # Converts a description to a stock-like symbol # sub tdwaterhouse_create_symbol { my($name) = shift; # Take out any bad characters $name =~ s/[^a-zA-Z\.\^\ \*]//g; # Multiple consecutive speces converted to a single space. $name =~ s/\s+/ /g; return $name; # return "TDSCITECH"; } # # Maps the provided currency, where possible, to the correct ISO code. # sub tdwaterhouse_get_currency { my($currency) = shift; $currency =~ s/\$//g; $currency =~ s/\s//g; if ( defined($currencies{$currency}) ) { $currency = $currencies{$currency}; } return $currency; } sub tdwaterhouse { my $quoter = shift; my(@q,%aa,$ua,$url,$sym,$price); $url = $TD_URL; $ua = $quoter->user_agent; my $reply = $ua->request(GET $url); return unless ($reply->is_success); foreach (split('\015?\012',$reply->content)) { @q = $quoter->parse_csv($_); # Skip the non-data rows. next if (!defined($q[0]) || !defined($q[1])); # Skip the section headers next if $q[0] =~ /^Fund Number/; # Skip the title ($sym = $q[1]) =~ s/^ +//; if ($sym) { # make sure what we get looks like an acceptable stock symbol # only allow a-z + '.' + "^" my($name) = $sym; $sym = &tdwaterhouse_create_symbol($sym); # $sym =~ tr/a-z/A-Z/; $aa {$sym, "exchange"} = "TD Waterhouse"; # TRP $aa {$sym, "method"} = "tdwaterhouse"; $aa {$sym, "name"} = $name; $price = $q[3]; $price =~ s/\$//; $price =~ s/^ +//; $aa {$sym, "last"} = $price; $quoter->store_date(\%aa, $sym, {usdate => $q[2]}); $aa {$sym, "nav"} = $aa{$sym,"last"}; $aa {$sym, "success"} = 1; $aa {$sym, "currency"} = &tdwaterhouse_get_currency($q[4]); } else { $aa {$sym, "success"} = 0; $aa {$sym, "errormsg"} = "Fund lookup failed."; } } return %aa if wantarray; return \%aa; } 1; =head1 NAME Finance::Quote::Tdwaterhouse - Obtain quotes from TD Waterhouse Canada =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %quotes = $q->tdwaterhouse ("TD AmeriGrowth RSP"); $date = $quotes {"TD AmeriGrowth RSP", "date"}; $nav = $quotes {"TD AmeriGrowth RSP", "nav"}; print "TD AmeriGrowth RSP for $date: NAV = $nav\n"; $nav = $quotes {"TD AmeriGrowth RSP", "nav"}; =head1 DESCRIPTION This module obtains information about managed funds from TD Waterhouse Canada. All TD Waterhouse funds are downloaded at once. The symbols for each mutual fund are the names of the fund with any unusal characters (not a letter, space or period) removed. For example; a fund called "TD Health Sciences ($US)" would have the symbol "TD Health Sciences US". =head1 LABELS RETURNED Information available from TD Waterhouse may include the following labels: exchange, name, nav, date, price, currency. =head1 SEE ALSO TD Waterhouse website - http://www.tdwaterhouse.ca/ =cut �������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Tiaacref.pm����������������������������������������������������000644 �000765 �000024 �00000202012 12566055631 021125� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> package Finance::Quote::Tiaacref; require 5.005; require LWP::Protocol::https; require Mozilla::CA; use strict; use vars qw( $CREF_URL $TIAA_URL %tiaacref_ids %tiaacref_locs %tiaacref_vals); use LWP::UserAgent; use HTTP::Request::Common; use Carp; use Encode; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. # This used to be different for the CREF and TIAA annuities, but this changed. $CREF_URL = ("https://www.tiaa-cref.org/public/tcfpi/Export/InvestmentDetails?Details=DailyPerformance"); sub methods { return (tiaacref=>\&tiaacref); } sub labels { return (tiaacref => [qw/method symbol exchange name date isodate nav price/]); } # ======================================================================= # TIAA-CREF Annuities are not listed on any exchange, unlike their mutual funds # TIAA-CREF provides unit values via a cgi on their website. The cgi returns # a csv file in the format # bogus_symbol1,price1,date1 # bogus_symbol2,price2,date2 # ..etc. # where bogus_symbol takes on the following values for the various annuities: # # CREF Bond Market Account (R1): CREFbond (QCBMRX) 41081991 # CREF Bond Market Account (R2): QCBMPX 268585732 # CREF Bond Market Account (R3): QCBMIX 268581927 # CREF Equity Index Account (R1): CREFequi (QCEQRX) 41082540 # CREF Equity Index Account (R2): QCEQPX 268568309 # CREF Equity Index Account (R3): QCEQIX 268561119 # CREF Global Equities Account (R1): CREFglob (QCGLRX) 41081992 # CREF Global Equities Account (R2): QCGLPX 268563498 # CREF Global Equities Account (R3): QCGLIX 268551676 # CREF Growth Account (R1): CREFgrow (QCGRRX) 41082544 # CREF Growth Account (R2): QCGRPX 268527829 # CREF Growth Account (R3): QCGRIX 268576313 # CREF Inflation-Linked Bond Account (R1): CREFinfb (QCILRX) 41088773 # CREF Inflation-Linked Bond Account (R2): QCILPX 268587933 # CREF Inflation-Linked Bond Account (R3): QCILIX 268572721 # CREF Money Market Account (R1): CREFmony (QCMMRX) 41081993 # CREF Money Market Account (R2): QCMMPX 268532453 # CREF Money Market Account (R3): QCMMIX 268569116 # CREF Social Choice Account (R1): CREFsoci (QCSCRX) 41081994 # CREF Social Choice Account (R2): QCSCPX 268580724 # CREF Social Choice Account (R3): QCSCIX 268585136 # CREF Stock Account (R1): CREFstok (QCSTRX) 41081995 # CREF Stock Account (R2): QCSTPX 268540687 # CREF Stock Account (R3): QCSTIX 268555492 # TIAA Real Estate Account: TIAAreal (QREARX) 41091375 # TIAA-CREF Bond Fund (Retirement): TIDRX 4530828 # TIAA-CREF Bond Index Fund (Retirement): TBIRX 20739662 # TIAA-CREF Bond Plus Fund (Retirement): TCBRX 4530816 # TIAA-CREF Emerging Markets Debt Fund (Retirement): TEDTX 78873869 # TIAA-CREF Emerging Markets Equity Fund (Retirement): TEMSX 26176543 # TIAA-CREF Emerging Markets Equity Index Fund (Retirement): TEQSX 26176547 # TIAA-CREF Equity Index Fund (Retirement): TIQRX 4530786 # TIAA-CREF Global Natural Resources Fund (Retirement): TNRRX 39444919 # TIAA-CREF Growth & Income Fund (Retirement): TRGIX 312536 # TIAA-CREF High Yield Fund (Retirement): TIHRX 4530821 # TIAA-CREF Inflation-Linked Bond Fund (Retirement): TIKRX 4530829 # TIAA-CREF International Equity Fund (Retirement): TRERX 302323 # TIAA-CREF International Equity Index Fund (Retirement): TRIEX 300269 # TIAA-CREF International Opportunities Fund (Retirement): TIOTX 57085015 # TIAA-CREF Large-Cap Growth Fund (Retirement): TILRX 4530785 # TIAA-CREF Large-Cap Growth Index Fund (Retirement): TRIRX 299525 # TIAA-CREF Large-Cap Value Fund (Retirement): TRLCX 301332 # TIAA-CREF Large-Cap Value Index Fund (Retirement): TRCVX 304333 # TIAA-CREF Lifecycle 2010 Fund (Retirement): TCLEX 302817 # TIAA-CREF Lifecycle 2015 Fund (Retirement): TCLIX 302393 # TIAA-CREF Lifecycle 2020 Fund (Retirement): TCLTX 307774 # TIAA-CREF Lifecycle 2025 Fund (Retirement): TCLFX 313994 # TIAA-CREF Lifecycle 2030 Fund (Retirement): TCLNX 307240 # TIAA-CREF Lifecycle 2035 Fund (Retirement): TCLRX 309003 # TIAA-CREF Lifecycle 2040 Fund (Retirement): TCLOX 300959 # TIAA-CREF Lifecycle 2045 Fund (Retirement): TTFRX 9467597 # TIAA-CREF Lifecycle 2050 Fund (Retirement): TLFRX 9467596 # TIAA-CREF Lifecycle 2055 Fund (Retirement): TTRLX 34211330 # TIAA-CREF Lifecycle 2060 Fund (Retirement): TLXRX 78873871 # TIAA-CREF Lifecycle Index 2010 Fund (Retirement): TLTRX 21066482 # TIAA-CREF Lifecycle Index 2015 Fund (Retirement): TLGRX 21066496 # TIAA-CREF Lifecycle Index 2020 Fund (Retirement): TLWRX 21066479 # TIAA-CREF Lifecycle Index 2025 Fund (Retirement): TLQRX 21066485 # TIAA-CREF Lifecycle Index 2030 Fund (Retirement): TLHRX 21066435 # TIAA-CREF Lifecycle Index 2035 Fund (Retirement): TLYRX 21066475 # TIAA-CREF Lifecycle Index 2040 Fund (Retirement): TLZRX 21066473 # TIAA-CREF Lifecycle Index 2045 Fund (Retirement): TLMRX 21066488 # TIAA-CREF Lifecycle Index 2050 Fund (Retirement): TLLRX 21066490 # TIAA-CREF Lifecycle Index 2055 Fund (Retirement): TTIRX 34211328 # TIAA-CREF Lifecycle Index 2060 Fund (Retirement): TVITX 78873875 # TIAA-CREF Lifecycle Index Retirement Income Fund (Retirement): TRCIX 21066468 # TIAA-CREF Lifecycle Retirement Income Fund (Retirement): TLIRX 9467594 # TIAA-CREF Lifestyle Aggressive Growth Fund (Retirement): TSARX 40508431 # TIAA-CREF Lifestyle Conservative Fund (Retirement): TSCTX 40508433 # TIAA-CREF Lifestyle Growth Fund (Retirement): TSGRX 40508437 # TIAA-CREF Lifestyle Income Fund (Retirement): TLSRX 40508427 # TIAA-CREF Lifestyle Moderate Fund (Retirement): TSMTX 40508460 # TIAA-CREF Managed Allocation Fund (Retirement): TITRX 4530825 # TIAA-CREF Mid-Cap Growth Fund (Retirement): TRGMX 305499 # TIAA-CREF Mid-Cap Value Fund (Retirement): TRVRX 315272 # TIAA-CREF Money Market Fund (Retirement): TIEXX 4530771 # TIAA-CREF Real Estate Securities Fund (Retirement): TRRSX 300081 # TIAA-CREF S&P 500 Index Fund (Retirement): TRSPX 306105 # TIAA-CREF Short-Term Bond Fund (Retirement): TISRX 4530818 # TIAA-CREF Small-Cap Blend Index Fund (Retirement): TRBIX 314644 # TIAA-CREF Small-Cap Equity Fund (Retirement): TRSEX 299968 # TIAA-CREF Social Choice Bond Fund (Retirement): TSBBX 49604881 # TIAA-CREF Social Choice Equity Fund (Retirement): TRSCX 300078 # TIAA-CREF Bond Fund (Institutional): TIBDX 307276 # TIAA-CREF Bond Index Fund (Institutional): TBIIX 20739664 # TIAA-CREF Bond Plus Fund (Institutional): TIBFX 4530820 # TIAA-CREF Emerging Markets Debt Fund (Institutional): TEDNX 78873868 # TIAA-CREF Emerging Markets Equity Fund (Institutional): TEMLX 26176540 # TIAA-CREF Emerging Markets Equity Index Fund (Institutional): TEQLX 26176544 # TIAA-CREF Enhanced International Equity Index Fund (Institutional): TFIIX 9467603 # TIAA-CREF Enhanced Large-Cap Growth Index Fund (Institutional): TLIIX 9467602 # TIAA-CREF Enhanced Large-Cap Value Index Fund (Institutional): TEVIX 9467606 # TIAA-CREF Equity Index Fund (Institutional): TIEIX 301718 # TIAA-CREF Global Natural Resources Fund (Institutional): TNRIX 39444916 # TIAA-CREF Growth & Income Fund (Institutional): TIGRX 314719 # TIAA-CREF High Yield Fund (Institutional): TIHYX 4530798 # TIAA-CREF Inflation-Linked Bond Fund (Institutional): TIILX 316693 # TIAA-CREF International Equity Fund (Institutional): TIIEX 305980 # TIAA-CREF International Equity Index Fund (Institutional): TCIEX 303673 # TIAA-CREF International Opportunities Fund (Institutional): TIOIX 57085012 # TIAA-CREF Large-Cap Growth Fund (Institutional): TILGX 4530800 # TIAA-CREF Large-Cap Growth Index Fund (Institutional): TILIX 297809 # TIAA-CREF Large-Cap Value Fund (Institutional): TRLIX 300692 # TIAA-CREF Large-Cap Value Index Fund (Institutional): TILVX 302308 # TIAA-CREF Lifecycle 2010 Fund (Institutional): TCTIX 4912376 # TIAA-CREF Lifecycle 2015 Fund (Institutional): TCNIX 4912355 # TIAA-CREF Lifecycle 2020 Fund (Institutional): TCWIX 4912377 # TIAA-CREF Lifecycle 2025 Fund (Institutional): TCYIX 4912384 # TIAA-CREF Lifecycle 2030 Fund (Institutional): TCRIX 4912364 # TIAA-CREF Lifecycle 2035 Fund (Institutional): TCIIX 4912375 # TIAA-CREF Lifecycle 2040 Fund (Institutional): TCOIX 4912387 # TIAA-CREF Lifecycle 2045 Fund (Institutional): TTFIX 9467607 # TIAA-CREF Lifecycle 2050 Fund (Institutional): TFTIX 9467601 # TIAA-CREF Lifecycle 2055 Fund (Institutional): TTRIX 34211329 # TIAA-CREF Lifecycle 2060 Fund (Institutional): TLXNX 78873872 # TIAA-CREF Lifecycle Index 2010 Fund (Institutional): TLTIX 21066484 # TIAA-CREF Lifecycle Index 2015 Fund (Institutional): TLFIX 21066498 # TIAA-CREF Lifecycle Index 2020 Fund (Institutional): TLWIX 21066480 # TIAA-CREF Lifecycle Index 2025 Fund (Institutional): TLQIX 21066486 # TIAA-CREF Lifecycle Index 2030 Fund (Institutional): TLHIX 21066495 # TIAA-CREF Lifecycle Index 2035 Fund (Institutional): TLYIX 21066477 # TIAA-CREF Lifecycle Index 2040 Fund (Institutional): TLZIX 21066474 # TIAA-CREF Lifecycle Index 2045 Fund (Institutional): TLXIX 21066478 # TIAA-CREF Lifecycle Index 2050 Fund (Institutional): TLLIX 21066492 # TIAA-CREF Lifecycle Index 2055 Fund (Institutional): TTIIX 34211326 # TIAA-CREF Lifecycle Index 2060 Fund (Institutional): TVIIX 78873873 # TIAA-CREF Lifecycle Index Retirement Income Fund (Institutional): TRILX 21066463 # TIAA-CREF Lifecycle Retirement Income Fund (Institutional): TLRIX 9467595 # TIAA-CREF Lifestyle Aggressive Growth Fund (Institutional): TSAIX 40508428 # TIAA-CREF Lifestyle Conservative Fund (Institutional): TCSIX 40508425 # TIAA-CREF Lifestyle Growth Fund (Institutional): TSGGX 40508434 # TIAA-CREF Lifestyle Income Fund (Institutional): TSITX 40508450 # TIAA-CREF Lifestyle Moderate Fund (Institutional): TSIMX 40508443 # TIAA-CREF Managed Allocation Fund (Institutional): TIMIX 4530787 # TIAA-CREF Mid-Cap Growth Fund (Institutional): TRPWX 297210 # TIAA-CREF Mid-Cap Value Fund (Institutional): TIMVX 316178 # TIAA-CREF Money Market Fund (Institutional): TCIXX 313650 # TIAA-CREF Real Estate Securities Fund (Institutional): TIREX 303475 # TIAA-CREF S&P 500 Index Fund (Institutional): TISPX 306658 # TIAA-CREF Short-Term Bond Fund (Institutional): TISIX 4530784 # TIAA-CREF Small-Cap Blend Index Fund (Institutional): TISBX 309018 # TIAA-CREF Small-Cap Equity Fund (Institutional): TISEX 301622 # TIAA-CREF Social Choice Bond Fund (Institutional): TSBIX 49604882 # TIAA-CREF Social Choice Equity Fund (Institutional): TISCX 301897 # TIAA-CREF Tax-Exempt Bond Fund (Institutional): TITIX 4530819 # TIAA-CREF Bond Fund (Retail): TIORX 4530794 # TIAA-CREF Bond Index Fund (Retail): TBILX 20739663 # TIAA-CREF Bond Plus Fund (Retail): TCBPX 4530788 # TIAA-CREF Emerging Markets Debt Fund (Retail): TEDLX 78873866 # TIAA-CREF Emerging Markets Equity Fund (Retail): TEMRX 26176542 # TIAA-CREF Emerging Markets Equity Index Fund (Retail): TEQKX 26176545 # TIAA-CREF Equity Index Fund (Retail): TINRX 4530797 # TIAA-CREF Global Natural Resources Fund (Retail): TNRLX 39444917 # TIAA-CREF Growth & Income Fund (Retail): TIIRX 4530790 # TIAA-CREF High Yield Fund (Retail): TIYRX 4530830 # TIAA-CREF Inflation-Linked Bond Fund (Retail): TCILX 313727 # TIAA-CREF International Equity Fund (Retail): TIERX 4530827 # TIAA-CREF International Opportunities Fund (Retail): TIOSX 57085014 # TIAA-CREF Large-Cap Growth Fund (Retail): TIRTX 4530791 # TIAA-CREF Large-Cap Value Fund (Retail): TCLCX 302696 # TIAA-CREF Lifecycle Retirement Income Fund (Retail): TLRRX 9467600 # TIAA-CREF Lifestyle Aggressive Growth Fund (Retail): TSALX 40508429 # TIAA-CREF Lifestyle Conservative Fund (Retail): TSCLX 40508432 # TIAA-CREF Lifestyle Growth Fund (Retail): TSGLX 40508435 # TIAA-CREF Lifestyle Income Fund (Retail): TSILX 40508438 # TIAA-CREF Lifestyle Moderate Fund (Retail): TSMLX 40508453 # TIAA-CREF Managed Allocation Fund (Retail): TIMRX 4530817 # TIAA-CREF Mid-Cap Growth Fund (Retail): TCMGX 305208 # TIAA-CREF Mid-Cap Value Fund (Retail): TCMVX 313995 # TIAA-CREF Money Market Fund (Retail): TIRXX 4530775 # TIAA-CREF Real Estate Securities Fund (Retail): TCREX 309567 # TIAA-CREF Short-Term Bond Fund (Retail): TCTRX 4530822 # TIAA-CREF Small-Cap Equity Fund (Retail): TCSEX 297477 # TIAA-CREF Social Choice Bond Fund (Retail): TSBRX 49604884 # TIAA-CREF Social Choice Equity Fund (Retail): TICRX 4530792 # TIAA-CREF Tax-Exempt Bond Fund (Retail): TIXRX 4530793 # TIAA-CREF Bond Fund (Premier): TIDPX 21066506 # TIAA-CREF Bond Index Fund (Premier): TBIPX 21066534 # TIAA-CREF Bond Plus Fund (Premier): TBPPX 21066533 # TIAA-CREF Emerging Markets Debt Fund (Premier): TEDPX 78873867 # TIAA-CREF Emerging Markets Equity Fund (Premier): TEMPX 26176541 # TIAA-CREF Emerging Markets Equity Index Fund (Premier): TEQPX 26176546 # TIAA-CREF Equity Index Fund (Premier): TCEPX 21066530 # TIAA-CREF Global Natural Resources Fund (Premier): TNRPX 39444918 # TIAA-CREF Growth & Income Fund (Premier): TRPGX 21066461 # TIAA-CREF High Yield Fund (Premier): TIHPX 21066501 # TIAA-CREF Inflation-Linked Bond Fund (Premier): TIKPX 21066500 # TIAA-CREF International Equity Fund (Premier): TREPX 21066466 # TIAA-CREF International Equity Index Fund (Premier): TRIPX 21066462 # TIAA-CREF International Opportunities Fund (Premier): TIOPX 57085013 # TIAA-CREF Large-Cap Growth Fund (Premier): TILPX 21066499 # TIAA-CREF Large-Cap Value Fund (Premier): TRCPX 21066467 # TIAA-CREF Lifecycle 2010 Fund (Premier): TCTPX 21066521 # TIAA-CREF Lifecycle 2015 Fund (Premier): TCFPX 21066528 # TIAA-CREF Lifecycle 2020 Fund (Premier): TCWPX 21066518 # TIAA-CREF Lifecycle 2025 Fund (Premier): TCQPX 21066522 # TIAA-CREF Lifecycle 2030 Fund (Premier): TCHPX 21066527 # TIAA-CREF Lifecycle 2035 Fund (Premier): TCYPX 21066517 # TIAA-CREF Lifecycle 2040 Fund (Premier): TCZPX 21066516 # TIAA-CREF Lifecycle 2045 Fund (Premier): TTFPX 21066444 # TIAA-CREF Lifecycle 2050 Fund (Premier): TCLPX 21066526 # TIAA-CREF Lifecycle 2055 Fund (Premier): TTRPX 34211331 # TIAA-CREF Lifecycle 2060 Fund (Premier): TLXPX 78873870 # TIAA-CREF Lifecycle Index 2010 Fund (Premier): TLTPX 21066483 # TIAA-CREF Lifecycle Index 2015 Fund (Premier): TLFPX 21066497 # TIAA-CREF Lifecycle Index 2020 Fund (Premier): TLWPX 21066434 # TIAA-CREF Lifecycle Index 2025 Fund (Premier): TLVPX 21066481 # TIAA-CREF Lifecycle Index 2030 Fund (Premier): TLHPX 21066494 # TIAA-CREF Lifecycle Index 2035 Fund (Premier): TLYPX 21066476 # TIAA-CREF Lifecycle Index 2040 Fund (Premier): TLPRX 21066487 # TIAA-CREF Lifecycle Index 2045 Fund (Premier): TLMPX 21066489 # TIAA-CREF Lifecycle Index 2050 Fund (Premier): TLLPX 21066491 # TIAA-CREF Lifecycle Index 2055 Fund (Premier): TTIPX 34211327 # TIAA-CREF Lifecycle Index 2060 Fund (Premier): TVIPX 78873874 # TIAA-CREF Lifecycle Index Retirement Income Fund (Premier): TLIPX 21066493 # TIAA-CREF Lifecycle Retirement Income Fund (Premier): TPILX 21066470 # TIAA-CREF Lifestyle Aggressive Growth Fund (Premier): TSAPX 40508430 # TIAA-CREF Lifestyle Conservative Fund (Premier): TLSPX 40508426 # TIAA-CREF Lifestyle Growth Fund (Premier): TSGPX 40508436 # TIAA-CREF Lifestyle Income Fund (Premier): TSIPX 40508451 # TIAA-CREF Lifestyle Moderate Fund (Premier): TSMPX 40508456 # TIAA-CREF Mid-Cap Growth Fund (Premier): TRGPX 21066464 # TIAA-CREF Mid-Cap Value Fund (Premier): TRVPX 21066455 # TIAA-CREF Money Market Fund (Premier): TPPXX 21066469 # TIAA-CREF Real Estate Securities Fund (Premier): TRRPX 21066459 # TIAA-CREF Short-Term Bond Fund (Premier): TSTPX 21066445 # TIAA-CREF Small-Cap Equity Fund (Premier): TSRPX 21066446 # TIAA-CREF Social Choice Bond Fund (Premier): TSBPX 49604883 # TIAA-CREF Social Choice Equity Fund (Premier): TRPSX 21066460 # # This subroutine was written by Brent Neal <brentn@users.sourceforge.net> # Modified to support new TIAA-CREF webpages by Kevin Foss <kfoss@maine.edu> and Brent Neal # Modified to support new 2012 TIAA-CREF webpages by Carl LaCombe <calcisme@gmail.com> # # TODO: # # The TIAA-CREF cgi allows you to specify the exact dates for which to retrieve # price data. That functionality could be worked into this subroutine. # Currently, we only grab the most recent price data. # sub tiaacref { my $quoter = shift; if (! %tiaacref_ids ) { #build a name hash for the annuities (once only) $tiaacref_ids{"CREFbond"} = "CREF Bond Market Account (R1)"; $tiaacref_ids{"QCBMPX"} = "CREF Bond Market Account (R2)"; $tiaacref_ids{"QCBMIX"} = "CREF Bond Market Account (R3)"; $tiaacref_ids{"CREFequi"} = "CREF Equity Index Account (R1)"; $tiaacref_ids{"QCEQPX"} = "CREF Equity Index Account (R2)"; $tiaacref_ids{"QCEQIX"} = "CREF Equity Index Account (R3)"; $tiaacref_ids{"CREFglob"} = "CREF Global Equities Account (R1)"; $tiaacref_ids{"QCGLPX"} = "CREF Global Equities Account (R2)"; $tiaacref_ids{"QCGLIX"} = "CREF Global Equities Account (R3)"; $tiaacref_ids{"CREFgrow"} = "CREF Growth Account (R1)"; $tiaacref_ids{"QCGRPX"} = "CREF Growth Account (R2)"; $tiaacref_ids{"QCGRIX"} = "CREF Growth Account (R3)"; $tiaacref_ids{"CREFinfb"} = "CREF Inflation-Linked Bond Account (R1)"; $tiaacref_ids{"QCILPX"} = "CREF Inflation-Linked Bond Account (R2)"; $tiaacref_ids{"QCILIX"} = "CREF Inflation-Linked Bond Account (R3)"; $tiaacref_ids{"CREFmony"} = "CREF Money Market Account (R1)"; $tiaacref_ids{"QCMMPX"} = "CREF Money Market Account (R2)"; $tiaacref_ids{"QCMMIX"} = "CREF Money Market Account (R3)"; $tiaacref_ids{"CREFsoci"} = "CREF Social Choice Account (R1)"; $tiaacref_ids{"QCSCPX"} = "CREF Social Choice Account (R2)"; $tiaacref_ids{"QCSCIX"} = "CREF Social Choice Account (R3)"; $tiaacref_ids{"CREFstok"} = "CREF Stock Account (R1)"; $tiaacref_ids{"QCSTPX"} = "CREF Stock Account (R2)"; $tiaacref_ids{"QCSTIX"} = "CREF Stock Account (R3)"; $tiaacref_ids{"TIAAreal"} = "TIAA Real Estate Account"; $tiaacref_ids{"TIDRX"} = "TIAA-CREF Bond Fund (Retirement)"; $tiaacref_ids{"TBIRX"} = "TIAA-CREF Bond Index Fund (Retirement)"; $tiaacref_ids{"TCBRX"} = "TIAA-CREF Bond Plus Fund (Retirement)"; $tiaacref_ids{"TEDTX"} = "TIAA-CREF Emerging Markets Debt Fund (Retirement)"; $tiaacref_ids{"TEMSX"} = "TIAA-CREF Emerging Markets Equity Fund (Retirement)"; $tiaacref_ids{"TEQSX"} = "TIAA-CREF Emerging Markets Equity Index Fund (Retirement)"; $tiaacref_ids{"TIQRX"} = "TIAA-CREF Equity Index Fund (Retirement)"; $tiaacref_ids{"TNRRX"} = "TIAA-CREF Global Natural Resources Fund (Retirement)"; $tiaacref_ids{"TRGIX"} = "TIAA-CREF Growth & Income Fund (Retirement)"; $tiaacref_ids{"TIHRX"} = "TIAA-CREF High Yield Fund (Retirement)"; $tiaacref_ids{"TIKRX"} = "TIAA-CREF Inflation-Linked Bond Fund (Retirement)"; $tiaacref_ids{"TRERX"} = "TIAA-CREF International Equity Fund (Retirement)"; $tiaacref_ids{"TRIEX"} = "TIAA-CREF International Equity Index Fund (Retirement)"; $tiaacref_ids{"TIOTX"} = "TIAA-CREF International Opportunities Fund (Retirement)"; $tiaacref_ids{"TILRX"} = "TIAA-CREF Large-Cap Growth Fund (Retirement)"; $tiaacref_ids{"TRIRX"} = "TIAA-CREF Large-Cap Growth Index Fund (Retirement)"; $tiaacref_ids{"TRLCX"} = "TIAA-CREF Large-Cap Value Fund (Retirement)"; $tiaacref_ids{"TRCVX"} = "TIAA-CREF Large-Cap Value Index Fund (Retirement)"; $tiaacref_ids{"TCLEX"} = "TIAA-CREF Lifecycle 2010 Fund (Retirement)"; $tiaacref_ids{"TCLIX"} = "TIAA-CREF Lifecycle 2015 Fund (Retirement)"; $tiaacref_ids{"TCLTX"} = "TIAA-CREF Lifecycle 2020 Fund (Retirement)"; $tiaacref_ids{"TCLFX"} = "TIAA-CREF Lifecycle 2025 Fund (Retirement)"; $tiaacref_ids{"TCLNX"} = "TIAA-CREF Lifecycle 2030 Fund (Retirement)"; $tiaacref_ids{"TCLRX"} = "TIAA-CREF Lifecycle 2035 Fund (Retirement)"; $tiaacref_ids{"TCLOX"} = "TIAA-CREF Lifecycle 2040 Fund (Retirement)"; $tiaacref_ids{"TTFRX"} = "TIAA-CREF Lifecycle 2045 Fund (Retirement)"; $tiaacref_ids{"TLFRX"} = "TIAA-CREF Lifecycle 2050 Fund (Retirement)"; $tiaacref_ids{"TTRLX"} = "TIAA-CREF Lifecycle 2055 Fund (Retirement)"; $tiaacref_ids{"TLXRX"} = "TIAA-CREF Lifecycle 2060 Fund (Retirement)"; $tiaacref_ids{"TLTRX"} = "TIAA-CREF Lifecycle Index 2010 Fund (Retirement)"; $tiaacref_ids{"TLGRX"} = "TIAA-CREF Lifecycle Index 2015 Fund (Retirement)"; $tiaacref_ids{"TLWRX"} = "TIAA-CREF Lifecycle Index 2020 Fund (Retirement)"; $tiaacref_ids{"TLQRX"} = "TIAA-CREF Lifecycle Index 2025 Fund (Retirement)"; $tiaacref_ids{"TLHRX"} = "TIAA-CREF Lifecycle Index 2030 Fund (Retirement)"; $tiaacref_ids{"TLYRX"} = "TIAA-CREF Lifecycle Index 2035 Fund (Retirement)"; $tiaacref_ids{"TLZRX"} = "TIAA-CREF Lifecycle Index 2040 Fund (Retirement)"; $tiaacref_ids{"TLMRX"} = "TIAA-CREF Lifecycle Index 2045 Fund (Retirement)"; $tiaacref_ids{"TLLRX"} = "TIAA-CREF Lifecycle Index 2050 Fund (Retirement)"; $tiaacref_ids{"TTIRX"} = "TIAA-CREF Lifecycle Index 2055 Fund (Retirement)"; $tiaacref_ids{"TVITX"} = "TIAA-CREF Lifecycle Index 2060 Fund (Retirement)"; $tiaacref_ids{"TRCIX"} = "TIAA-CREF Lifecycle Index Retirement Income Fund (Retirement)"; $tiaacref_ids{"TLIRX"} = "TIAA-CREF Lifecycle Retirement Income Fund (Retirement)"; $tiaacref_ids{"TSARX"} = "TIAA-CREF Lifestyle Aggressive Growth Fund (Retirement)"; $tiaacref_ids{"TSCTX"} = "TIAA-CREF Lifestyle Conservative Fund (Retirement)"; $tiaacref_ids{"TSGRX"} = "TIAA-CREF Lifestyle Growth Fund (Retirement)"; $tiaacref_ids{"TLSRX"} = "TIAA-CREF Lifestyle Income Fund (Retirement)"; $tiaacref_ids{"TSMTX"} = "TIAA-CREF Lifestyle Moderate Fund (Retirement)"; $tiaacref_ids{"TITRX"} = "TIAA-CREF Managed Allocation Fund (Retirement)"; $tiaacref_ids{"TRGMX"} = "TIAA-CREF Mid-Cap Growth Fund (Retirement)"; $tiaacref_ids{"TRVRX"} = "TIAA-CREF Mid-Cap Value Fund (Retirement)"; $tiaacref_ids{"TIEXX"} = "TIAA-CREF Money Market Fund (Retirement)"; $tiaacref_ids{"TRRSX"} = "TIAA-CREF Real Estate Securities Fund (Retirement)"; $tiaacref_ids{"TRSPX"} = "TIAA-CREF S&P 500 Index Fund (Retirement)"; $tiaacref_ids{"TISRX"} = "TIAA-CREF Short-Term Bond Fund (Retirement)"; $tiaacref_ids{"TRBIX"} = "TIAA-CREF Small-Cap Blend Index Fund (Retirement)"; $tiaacref_ids{"TRSEX"} = "TIAA-CREF Small-Cap Equity Fund (Retirement)"; $tiaacref_ids{"TSBBX"} = "TIAA-CREF Social Choice Bond Fund (Retirement)"; $tiaacref_ids{"TRSCX"} = "TIAA-CREF Social Choice Equity Fund (Retirement)"; $tiaacref_ids{"TIBDX"} = "TIAA-CREF Bond Fund (Institutional)"; $tiaacref_ids{"TBIIX"} = "TIAA-CREF Bond Index Fund (Institutional)"; $tiaacref_ids{"TIBFX"} = "TIAA-CREF Bond Plus Fund (Institutional)"; $tiaacref_ids{"TEDNX"} = "TIAA-CREF Emerging Markets Debt Fund (Institutional)"; $tiaacref_ids{"TEMLX"} = "TIAA-CREF Emerging Markets Equity Fund (Institutional)"; $tiaacref_ids{"TEQLX"} = "TIAA-CREF Emerging Markets Equity Index Fund (Institutional)"; $tiaacref_ids{"TFIIX"} = "TIAA-CREF Enhanced International Equity Index Fund (Institutional)"; $tiaacref_ids{"TLIIX"} = "TIAA-CREF Enhanced Large-Cap Growth Index Fund (Institutional)"; $tiaacref_ids{"TEVIX"} = "TIAA-CREF Enhanced Large-Cap Value Index Fund (Institutional)"; $tiaacref_ids{"TIEIX"} = "TIAA-CREF Equity Index Fund (Institutional)"; $tiaacref_ids{"TNRIX"} = "TIAA-CREF Global Natural Resources Fund (Institutional)"; $tiaacref_ids{"TIGRX"} = "TIAA-CREF Growth & Income Fund (Institutional)"; $tiaacref_ids{"TIHYX"} = "TIAA-CREF High Yield Fund (Institutional)"; $tiaacref_ids{"TIILX"} = "TIAA-CREF Inflation-Linked Bond Fund (Institutional)"; $tiaacref_ids{"TIIEX"} = "TIAA-CREF International Equity Fund (Institutional)"; $tiaacref_ids{"TCIEX"} = "TIAA-CREF International Equity Index Fund (Institutional)"; $tiaacref_ids{"TIOIX"} = "TIAA-CREF International Opportunities Fund (Institutional)"; $tiaacref_ids{"TILGX"} = "TIAA-CREF Large-Cap Growth Fund (Institutional)"; $tiaacref_ids{"TILIX"} = "TIAA-CREF Large-Cap Growth Index Fund (Institutional)"; $tiaacref_ids{"TRLIX"} = "TIAA-CREF Large-Cap Value Fund (Institutional)"; $tiaacref_ids{"TILVX"} = "TIAA-CREF Large-Cap Value Index Fund (Institutional)"; $tiaacref_ids{"TCTIX"} = "TIAA-CREF Lifecycle 2010 Fund (Institutional)"; $tiaacref_ids{"TCNIX"} = "TIAA-CREF Lifecycle 2015 Fund (Institutional)"; $tiaacref_ids{"TCWIX"} = "TIAA-CREF Lifecycle 2020 Fund (Institutional)"; $tiaacref_ids{"TCYIX"} = "TIAA-CREF Lifecycle 2025 Fund (Institutional)"; $tiaacref_ids{"TCRIX"} = "TIAA-CREF Lifecycle 2030 Fund (Institutional)"; $tiaacref_ids{"TCIIX"} = "TIAA-CREF Lifecycle 2035 Fund (Institutional)"; $tiaacref_ids{"TCOIX"} = "TIAA-CREF Lifecycle 2040 Fund (Institutional)"; $tiaacref_ids{"TTFIX"} = "TIAA-CREF Lifecycle 2045 Fund (Institutional)"; $tiaacref_ids{"TFTIX"} = "TIAA-CREF Lifecycle 2050 Fund (Institutional)"; $tiaacref_ids{"TTRIX"} = "TIAA-CREF Lifecycle 2055 Fund (Institutional)"; $tiaacref_ids{"TLXNX"} = "TIAA-CREF Lifecycle 2060 Fund (Institutional)"; $tiaacref_ids{"TLTIX"} = "TIAA-CREF Lifecycle Index 2010 Fund (Institutional)"; $tiaacref_ids{"TLFIX"} = "TIAA-CREF Lifecycle Index 2015 Fund (Institutional)"; $tiaacref_ids{"TLWIX"} = "TIAA-CREF Lifecycle Index 2020 Fund (Institutional)"; $tiaacref_ids{"TLQIX"} = "TIAA-CREF Lifecycle Index 2025 Fund (Institutional)"; $tiaacref_ids{"TLHIX"} = "TIAA-CREF Lifecycle Index 2030 Fund (Institutional)"; $tiaacref_ids{"TLYIX"} = "TIAA-CREF Lifecycle Index 2035 Fund (Institutional)"; $tiaacref_ids{"TLZIX"} = "TIAA-CREF Lifecycle Index 2040 Fund (Institutional)"; $tiaacref_ids{"TLXIX"} = "TIAA-CREF Lifecycle Index 2045 Fund (Institutional)"; $tiaacref_ids{"TLLIX"} = "TIAA-CREF Lifecycle Index 2050 Fund (Institutional)"; $tiaacref_ids{"TTIIX"} = "TIAA-CREF Lifecycle Index 2055 Fund (Institutional)"; $tiaacref_ids{"TVIIX"} = "TIAA-CREF Lifecycle Index 2060 Fund (Institutional)"; $tiaacref_ids{"TRILX"} = "TIAA-CREF Lifecycle Index Retirement Income Fund (Institutional)"; $tiaacref_ids{"TLRIX"} = "TIAA-CREF Lifecycle Retirement Income Fund (Institutional)"; $tiaacref_ids{"TSAIX"} = "TIAA-CREF Lifestyle Aggressive Growth Fund (Institutional)"; $tiaacref_ids{"TCSIX"} = "TIAA-CREF Lifestyle Conservative Fund (Institutional)"; $tiaacref_ids{"TSGGX"} = "TIAA-CREF Lifestyle Growth Fund (Institutional)"; $tiaacref_ids{"TSITX"} = "TIAA-CREF Lifestyle Income Fund (Institutional)"; $tiaacref_ids{"TSIMX"} = "TIAA-CREF Lifestyle Moderate Fund (Institutional)"; $tiaacref_ids{"TIMIX"} = "TIAA-CREF Managed Allocation Fund (Institutional)"; $tiaacref_ids{"TRPWX"} = "TIAA-CREF Mid-Cap Growth Fund (Institutional)"; $tiaacref_ids{"TIMVX"} = "TIAA-CREF Mid-Cap Value Fund (Institutional)"; $tiaacref_ids{"TCIXX"} = "TIAA-CREF Money Market Fund (Institutional)"; $tiaacref_ids{"TIREX"} = "TIAA-CREF Real Estate Securities Fund (Institutional)"; $tiaacref_ids{"TISPX"} = "TIAA-CREF S&P 500 Index Fund (Institutional)"; $tiaacref_ids{"TISIX"} = "TIAA-CREF Short-Term Bond Fund (Institutional)"; $tiaacref_ids{"TISBX"} = "TIAA-CREF Small-Cap Blend Index Fund (Institutional)"; $tiaacref_ids{"TISEX"} = "TIAA-CREF Small-Cap Equity Fund (Institutional)"; $tiaacref_ids{"TSBIX"} = "TIAA-CREF Social Choice Bond Fund (Institutional)"; $tiaacref_ids{"TISCX"} = "TIAA-CREF Social Choice Equity Fund (Institutional)"; $tiaacref_ids{"TITIX"} = "TIAA-CREF Tax-Exempt Bond Fund (Institutional)"; $tiaacref_ids{"TIORX"} = "TIAA-CREF Bond Fund (Retail)"; $tiaacref_ids{"TBILX"} = "TIAA-CREF Bond Index Fund (Retail)"; $tiaacref_ids{"TCBPX"} = "TIAA-CREF Bond Plus Fund (Retail)"; $tiaacref_ids{"TEDLX"} = "TIAA-CREF Emerging Markets Debt Fund (Retail)"; $tiaacref_ids{"TEMRX"} = "TIAA-CREF Emerging Markets Equity Fund (Retail)"; $tiaacref_ids{"TEQKX"} = "TIAA-CREF Emerging Markets Equity Index Fund (Retail)"; $tiaacref_ids{"TINRX"} = "TIAA-CREF Equity Index Fund (Retail)"; $tiaacref_ids{"TNRLX"} = "TIAA-CREF Global Natural Resources Fund (Retail)"; $tiaacref_ids{"TIIRX"} = "TIAA-CREF Growth & Income Fund (Retail)"; $tiaacref_ids{"TIYRX"} = "TIAA-CREF High Yield Fund (Retail)"; $tiaacref_ids{"TCILX"} = "TIAA-CREF Inflation-Linked Bond Fund (Retail)"; $tiaacref_ids{"TIERX"} = "TIAA-CREF International Equity Fund (Retail)"; $tiaacref_ids{"TIOSX"} = "TIAA-CREF International Opportunities Fund (Retail)"; $tiaacref_ids{"TIRTX"} = "TIAA-CREF Large-Cap Growth Fund (Retail)"; $tiaacref_ids{"TCLCX"} = "TIAA-CREF Large-Cap Value Fund (Retail)"; $tiaacref_ids{"TLRRX"} = "TIAA-CREF Lifecycle Retirement Income Fund (Retail)"; $tiaacref_ids{"TSALX"} = "TIAA-CREF Lifestyle Aggressive Growth Fund (Retail)"; $tiaacref_ids{"TSCLX"} = "TIAA-CREF Lifestyle Conservative Fund (Retail)"; $tiaacref_ids{"TSGLX"} = "TIAA-CREF Lifestyle Growth Fund (Retail)"; $tiaacref_ids{"TSILX"} = "TIAA-CREF Lifestyle Income Fund (Retail)"; $tiaacref_ids{"TSMLX"} = "TIAA-CREF Lifestyle Moderate Fund (Retail)"; $tiaacref_ids{"TIMRX"} = "TIAA-CREF Managed Allocation Fund (Retail)"; $tiaacref_ids{"TCMGX"} = "TIAA-CREF Mid-Cap Growth Fund (Retail)"; $tiaacref_ids{"TCMVX"} = "TIAA-CREF Mid-Cap Value Fund (Retail)"; $tiaacref_ids{"TIRXX"} = "TIAA-CREF Money Market Fund (Retail)"; $tiaacref_ids{"TCREX"} = "TIAA-CREF Real Estate Securities Fund (Retail)"; $tiaacref_ids{"TCTRX"} = "TIAA-CREF Short-Term Bond Fund (Retail)"; $tiaacref_ids{"TCSEX"} = "TIAA-CREF Small-Cap Equity Fund (Retail)"; $tiaacref_ids{"TSBRX"} = "TIAA-CREF Social Choice Bond Fund (Retail)"; $tiaacref_ids{"TICRX"} = "TIAA-CREF Social Choice Equity Fund (Retail)"; $tiaacref_ids{"TIXRX"} = "TIAA-CREF Tax-Exempt Bond Fund (Retail)"; $tiaacref_ids{"TIDPX"} = "TIAA-CREF Bond Fund (Premier)"; $tiaacref_ids{"TBIPX"} = "TIAA-CREF Bond Index Fund (Premier)"; $tiaacref_ids{"TBPPX"} = "TIAA-CREF Bond Plus Fund (Premier)"; $tiaacref_ids{"TEDPX"} = "TIAA-CREF Emerging Markets Debt Fund (Premier)"; $tiaacref_ids{"TEMPX"} = "TIAA-CREF Emerging Markets Equity Fund (Premier)"; $tiaacref_ids{"TEQPX"} = "TIAA-CREF Emerging Markets Equity Index Fund (Premier)"; $tiaacref_ids{"TCEPX"} = "TIAA-CREF Equity Index Fund (Premier)"; $tiaacref_ids{"TNRPX"} = "TIAA-CREF Global Natural Resources Fund (Premier)"; $tiaacref_ids{"TRPGX"} = "TIAA-CREF Growth & Income Fund (Premier)"; $tiaacref_ids{"TIHPX"} = "TIAA-CREF High Yield Fund (Premier)"; $tiaacref_ids{"TIKPX"} = "TIAA-CREF Inflation-Linked Bond Fund (Premier)"; $tiaacref_ids{"TIOPX"} = "TIAA-CREF International Opportunities Fund (Premier)"; $tiaacref_ids{"TREPX"} = "TIAA-CREF International Equity Fund (Premier)"; $tiaacref_ids{"TRIPX"} = "TIAA-CREF International Equity Index Fund (Premier)"; $tiaacref_ids{"TILPX"} = "TIAA-CREF Large-Cap Growth Fund (Premier)"; $tiaacref_ids{"TRCPX"} = "TIAA-CREF Large-Cap Value Fund (Premier)"; $tiaacref_ids{"TCTPX"} = "TIAA-CREF Lifecycle 2010 Fund (Premier)"; $tiaacref_ids{"TCFPX"} = "TIAA-CREF Lifecycle 2015 Fund (Premier)"; $tiaacref_ids{"TCWPX"} = "TIAA-CREF Lifecycle 2020 Fund (Premier)"; $tiaacref_ids{"TCQPX"} = "TIAA-CREF Lifecycle 2025 Fund (Premier)"; $tiaacref_ids{"TCHPX"} = "TIAA-CREF Lifecycle 2030 Fund (Premier)"; $tiaacref_ids{"TCYPX"} = "TIAA-CREF Lifecycle 2035 Fund (Premier)"; $tiaacref_ids{"TCZPX"} = "TIAA-CREF Lifecycle 2040 Fund (Premier)"; $tiaacref_ids{"TTFPX"} = "TIAA-CREF Lifecycle 2045 Fund (Premier)"; $tiaacref_ids{"TCLPX"} = "TIAA-CREF Lifecycle 2050 Fund (Premier)"; $tiaacref_ids{"TTRPX"} = "TIAA-CREF Lifecycle 2055 Fund (Premier)"; $tiaacref_ids{"TLXPX"} = "TIAA-CREF Lifecycle 2060 Fund (Premier)"; $tiaacref_ids{"TLTPX"} = "TIAA-CREF Lifecycle Index 2010 Fund (Premier)"; $tiaacref_ids{"TLFPX"} = "TIAA-CREF Lifecycle Index 2015 Fund (Premier)"; $tiaacref_ids{"TLWPX"} = "TIAA-CREF Lifecycle Index 2020 Fund (Premier)"; $tiaacref_ids{"TLVPX"} = "TIAA-CREF Lifecycle Index 2025 Fund (Premier)"; $tiaacref_ids{"TLHPX"} = "TIAA-CREF Lifecycle Index 2030 Fund (Premier)"; $tiaacref_ids{"TLYPX"} = "TIAA-CREF Lifecycle Index 2035 Fund (Premier)"; $tiaacref_ids{"TLPRX"} = "TIAA-CREF Lifecycle Index 2040 Fund (Premier)"; $tiaacref_ids{"TLMPX"} = "TIAA-CREF Lifecycle Index 2045 Fund (Premier)"; $tiaacref_ids{"TLLPX"} = "TIAA-CREF Lifecycle Index 2050 Fund (Premier)"; $tiaacref_ids{"TTIPX"} = "TIAA-CREF Lifecycle Index 2055 Fund (Premier)"; $tiaacref_ids{"TVIPX"} = "TIAA-CREF Lifecycle Index 2060 Fund (Premier)"; $tiaacref_ids{"TLIPX"} = "TIAA-CREF Lifecycle Index Retirement Income Fund (Premier)"; $tiaacref_ids{"TPILX"} = "TIAA-CREF Lifecycle Retirement Income Fund (Premier)"; $tiaacref_ids{"TSAPX"} = "TIAA-CREF Lifestyle Aggressive Growth Fund (Premier)"; $tiaacref_ids{"TLSPX"} = "TIAA-CREF Lifestyle Conservative Fund (Premier)"; $tiaacref_ids{"TSGPX"} = "TIAA-CREF Lifestyle Growth Fund (Premier)"; $tiaacref_ids{"TSIPX"} = "TIAA-CREF Lifestyle Income Fund (Premier)"; $tiaacref_ids{"TSMPX"} = "TIAA-CREF Lifestyle Moderate Fund (Premier)"; $tiaacref_ids{"TRGPX"} = "TIAA-CREF Mid-Cap Growth Fund (Premier)"; $tiaacref_ids{"TRVPX"} = "TIAA-CREF Mid-Cap Value Fund (Premier)"; $tiaacref_ids{"TPPXX"} = "TIAA-CREF Money Market Fund (Premier)"; $tiaacref_ids{"TRRPX"} = "TIAA-CREF Real Estate Securities Fund (Premier)"; $tiaacref_ids{"TSTPX"} = "TIAA-CREF Short-Term Bond Fund (Premier)"; $tiaacref_ids{"TSRPX"} = "TIAA-CREF Small-Cap Equity Fund (Premier)"; $tiaacref_ids{"TSBPX"} = "TIAA-CREF Social Choice Bond Fund (Premier)"; $tiaacref_ids{"TRPSX"} = "TIAA-CREF Social Choice Equity Fund (Premier)"; } if (! %tiaacref_vals) { $tiaacref_vals{"CREFbond"} = "41081991"; $tiaacref_vals{"QCBMPX"} = "268585732"; $tiaacref_vals{"QCBMIX"} = "268581927"; $tiaacref_vals{"CREFequi"} = "41082540"; $tiaacref_vals{"QCEQPX"} = "268568309"; $tiaacref_vals{"QCEQIX"} = "268561119"; $tiaacref_vals{"CREFglob"} = "41081992"; $tiaacref_vals{"QCGLPX"} = "268563498"; $tiaacref_vals{"QCGLIX"} = "268551676"; $tiaacref_vals{"CREFgrow"} = "41082544"; $tiaacref_vals{"QCGRPX"} = "268527829"; $tiaacref_vals{"QCGRIX"} = "268576313"; $tiaacref_vals{"CREFinfb"} = "41088773"; $tiaacref_vals{"QCILPX"} = "268587933"; $tiaacref_vals{"QCILIX"} = "268572721"; $tiaacref_vals{"CREFmony"} = "41081993"; $tiaacref_vals{"QCMMPX"} = "268532453"; $tiaacref_vals{"QCMMIX"} = "268569116"; $tiaacref_vals{"CREFsoci"} = "41081994"; $tiaacref_vals{"QCSCPX"} = "268580724"; $tiaacref_vals{"QCSCIX"} = "268585136"; $tiaacref_vals{"CREFstok"} = "41081995"; $tiaacref_vals{"QCSTPX"} = "268540687"; $tiaacref_vals{"QCSTIX"} = "268555492"; $tiaacref_vals{"TIAAreal"} = "41091375"; $tiaacref_vals{"TIDRX"} = "4530828"; $tiaacref_vals{"TBIRX"} = "20739662"; $tiaacref_vals{"TCBRX"} = "4530816"; $tiaacref_vals{"TEDTX"} = "78873869"; $tiaacref_vals{"TEMSX"} = "26176543"; $tiaacref_vals{"TEQSX"} = "26176547"; $tiaacref_vals{"TIQRX"} = "4530786"; $tiaacref_vals{"TNRRX"} = "39444919"; $tiaacref_vals{"TRGIX"} = "312536"; $tiaacref_vals{"TIHRX"} = "4530821"; $tiaacref_vals{"TIKRX"} = "4530829"; $tiaacref_vals{"TRERX"} = "302323"; $tiaacref_vals{"TRIEX"} = "300269"; $tiaacref_vals{"TIOTX"} = "57085015"; $tiaacref_vals{"TILRX"} = "4530785"; $tiaacref_vals{"TRIRX"} = "299525"; $tiaacref_vals{"TRLCX"} = "301332"; $tiaacref_vals{"TRCVX"} = "304333"; $tiaacref_vals{"TCLEX"} = "302817"; $tiaacref_vals{"TCLIX"} = "302393"; $tiaacref_vals{"TCLTX"} = "307774"; $tiaacref_vals{"TCLFX"} = "313994"; $tiaacref_vals{"TCLNX"} = "307240"; $tiaacref_vals{"TCLRX"} = "309003"; $tiaacref_vals{"TCLOX"} = "300959"; $tiaacref_vals{"TTFRX"} = "9467597"; $tiaacref_vals{"TLFRX"} = "9467596"; $tiaacref_vals{"TTRLX"} = "34211330"; $tiaacref_vals{"TLXRX"} = "78873871"; $tiaacref_vals{"TLTRX"} = "21066482"; $tiaacref_vals{"TLGRX"} = "21066496"; $tiaacref_vals{"TLWRX"} = "21066479"; $tiaacref_vals{"TLQRX"} = "21066485"; $tiaacref_vals{"TLHRX"} = "21066435"; $tiaacref_vals{"TLYRX"} = "21066475"; $tiaacref_vals{"TLZRX"} = "21066473"; $tiaacref_vals{"TLMRX"} = "21066488"; $tiaacref_vals{"TLLRX"} = "21066490"; $tiaacref_vals{"TTIRX"} = "34211328"; $tiaacref_vals{"TVITX"} = "78873875"; $tiaacref_vals{"TRCIX"} = "21066468"; $tiaacref_vals{"TLIRX"} = "9467594"; $tiaacref_vals{"TSARX"} = "40508431"; $tiaacref_vals{"TSCTX"} = "40508433"; $tiaacref_vals{"TSGRX"} = "40508437"; $tiaacref_vals{"TLSRX"} = "40508427"; $tiaacref_vals{"TSMTX"} = "40508460"; $tiaacref_vals{"TITRX"} = "4530825"; $tiaacref_vals{"TRGMX"} = "305499"; $tiaacref_vals{"TRVRX"} = "315272"; $tiaacref_vals{"TIEXX"} = "4530771"; $tiaacref_vals{"TRRSX"} = "300081"; $tiaacref_vals{"TRSPX"} = "306105"; $tiaacref_vals{"TISRX"} = "4530818"; $tiaacref_vals{"TRBIX"} = "314644"; $tiaacref_vals{"TRSEX"} = "299968"; $tiaacref_vals{"TSBBX"} = "49604881"; $tiaacref_vals{"TRSCX"} = "300078"; $tiaacref_vals{"TIBDX"} = "307276"; $tiaacref_vals{"TBIIX"} = "20739664"; $tiaacref_vals{"TIBFX"} = "4530820"; $tiaacref_vals{"TEDNX"} = "78873868"; $tiaacref_vals{"TEMLX"} = "26176540"; $tiaacref_vals{"TEQLX"} = "26176544"; $tiaacref_vals{"TFIIX"} = "9467603"; $tiaacref_vals{"TLIIX"} = "9467602"; $tiaacref_vals{"TEVIX"} = "9467606"; $tiaacref_vals{"TIEIX"} = "301718"; $tiaacref_vals{"TNRIX"} = "39444916"; $tiaacref_vals{"TIGRX"} = "314719"; $tiaacref_vals{"TIHYX"} = "4530798"; $tiaacref_vals{"TIILX"} = "316693"; $tiaacref_vals{"TIIEX"} = "305980"; $tiaacref_vals{"TCIEX"} = "303673"; $tiaacref_vals{"TIOIX"} = "57085012"; $tiaacref_vals{"TILGX"} = "4530800"; $tiaacref_vals{"TILIX"} = "297809"; $tiaacref_vals{"TRLIX"} = "300692"; $tiaacref_vals{"TILVX"} = "302308"; $tiaacref_vals{"TCTIX"} = "4912376"; $tiaacref_vals{"TCNIX"} = "4912355"; $tiaacref_vals{"TCWIX"} = "4912377"; $tiaacref_vals{"TCYIX"} = "4912384"; $tiaacref_vals{"TCRIX"} = "4912364"; $tiaacref_vals{"TCIIX"} = "4912375"; $tiaacref_vals{"TCOIX"} = "4912387"; $tiaacref_vals{"TTFIX"} = "9467607"; $tiaacref_vals{"TFTIX"} = "9467601"; $tiaacref_vals{"TTRIX"} = "34211329"; $tiaacref_vals{"TLXNX"} = "78873872"; $tiaacref_vals{"TLTIX"} = "21066484"; $tiaacref_vals{"TLFIX"} = "21066498"; $tiaacref_vals{"TLWIX"} = "21066480"; $tiaacref_vals{"TLQIX"} = "21066486"; $tiaacref_vals{"TLHIX"} = "21066495"; $tiaacref_vals{"TLYIX"} = "21066477"; $tiaacref_vals{"TLZIX"} = "21066474"; $tiaacref_vals{"TLXIX"} = "21066478"; $tiaacref_vals{"TLLIX"} = "21066492"; $tiaacref_vals{"TTIIX"} = "34211326"; $tiaacref_vals{"TVIIX"} = "78873873"; $tiaacref_vals{"TRILX"} = "21066463"; $tiaacref_vals{"TLRIX"} = "9467595"; $tiaacref_vals{"TSAIX"} = "40508428"; $tiaacref_vals{"TCSIX"} = "40508425"; $tiaacref_vals{"TSGGX"} = "40508434"; $tiaacref_vals{"TSITX"} = "40508450"; $tiaacref_vals{"TSIMX"} = "40508443"; $tiaacref_vals{"TIMIX"} = "4530787"; $tiaacref_vals{"TRPWX"} = "297210"; $tiaacref_vals{"TIMVX"} = "316178"; $tiaacref_vals{"TCIXX"} = "313650"; $tiaacref_vals{"TIREX"} = "303475"; $tiaacref_vals{"TISPX"} = "306658"; $tiaacref_vals{"TISIX"} = "4530784"; $tiaacref_vals{"TISBX"} = "309018"; $tiaacref_vals{"TISEX"} = "301622"; $tiaacref_vals{"TSBIX"} = "49604882"; $tiaacref_vals{"TISCX"} = "301897"; $tiaacref_vals{"TITIX"} = "4530819"; $tiaacref_vals{"TIORX"} = "4530794"; $tiaacref_vals{"TBILX"} = "20739663"; $tiaacref_vals{"TCBPX"} = "4530788"; $tiaacref_vals{"TEDLX"} = "78873866"; $tiaacref_vals{"TEMRX"} = "26176542"; $tiaacref_vals{"TEQKX"} = "26176545"; $tiaacref_vals{"TINRX"} = "4530797"; $tiaacref_vals{"TNRLX"} = "39444917"; $tiaacref_vals{"TIIRX"} = "4530790"; $tiaacref_vals{"TIYRX"} = "4530830"; $tiaacref_vals{"TCILX"} = "313727"; $tiaacref_vals{"TIERX"} = "4530827"; $tiaacref_vals{"TIOSX"} = "57085014"; $tiaacref_vals{"TIRTX"} = "4530791"; $tiaacref_vals{"TCLCX"} = "302696"; $tiaacref_vals{"TLRRX"} = "9467600"; $tiaacref_vals{"TSALX"} = "40508429"; $tiaacref_vals{"TSCLX"} = "40508432"; $tiaacref_vals{"TSGLX"} = "40508435"; $tiaacref_vals{"TSILX"} = "40508438"; $tiaacref_vals{"TSMLX"} = "40508453"; $tiaacref_vals{"TIMRX"} = "4530817"; $tiaacref_vals{"TCMGX"} = "305208"; $tiaacref_vals{"TCMVX"} = "313995"; $tiaacref_vals{"TIRXX"} = "4530775"; $tiaacref_vals{"TCREX"} = "309567"; $tiaacref_vals{"TCTRX"} = "4530822"; $tiaacref_vals{"TCSEX"} = "297477"; $tiaacref_vals{"TSBRX"} = "49604884"; $tiaacref_vals{"TICRX"} = "4530792"; $tiaacref_vals{"TIXRX"} = "4530793"; $tiaacref_vals{"TIDPX"} = "21066506"; $tiaacref_vals{"TBIPX"} = "21066534"; $tiaacref_vals{"TBPPX"} = "21066533"; $tiaacref_vals{"TEDPX"} = "78873867"; $tiaacref_vals{"TEMPX"} = "26176541"; $tiaacref_vals{"TEQPX"} = "26176546"; $tiaacref_vals{"TCEPX"} = "21066530"; $tiaacref_vals{"TNRPX"} = "39444918"; $tiaacref_vals{"TRPGX"} = "21066461"; $tiaacref_vals{"TIHPX"} = "21066501"; $tiaacref_vals{"TIKPX"} = "21066500"; $tiaacref_vals{"TREPX"} = "21066466"; $tiaacref_vals{"TRIPX"} = "21066462"; $tiaacref_vals{"TIOPX"} = "57085013"; $tiaacref_vals{"TILPX"} = "21066499"; $tiaacref_vals{"TRCPX"} = "21066467"; $tiaacref_vals{"TCTPX"} = "21066521"; $tiaacref_vals{"TCFPX"} = "21066528"; $tiaacref_vals{"TCWPX"} = "21066518"; $tiaacref_vals{"TCQPX"} = "21066522"; $tiaacref_vals{"TCHPX"} = "21066527"; $tiaacref_vals{"TCYPX"} = "21066517"; $tiaacref_vals{"TCZPX"} = "21066516"; $tiaacref_vals{"TTFPX"} = "21066444"; $tiaacref_vals{"TCLPX"} = "21066526"; $tiaacref_vals{"TTRPX"} = "34211331"; $tiaacref_vals{"TLXPX"} = "78873870"; $tiaacref_vals{"TLTPX"} = "21066483"; $tiaacref_vals{"TLFPX"} = "21066497"; $tiaacref_vals{"TLWPX"} = "21066434"; $tiaacref_vals{"TLVPX"} = "21066481"; $tiaacref_vals{"TLHPX"} = "21066494"; $tiaacref_vals{"TLYPX"} = "21066476"; $tiaacref_vals{"TLPRX"} = "21066487"; $tiaacref_vals{"TLMPX"} = "21066489"; $tiaacref_vals{"TLLPX"} = "21066491"; $tiaacref_vals{"TTIPX"} = "34211327"; $tiaacref_vals{"TVIPX"} = "78873874"; $tiaacref_vals{"TLIPX"} = "21066493"; $tiaacref_vals{"TPILX"} = "21066470"; $tiaacref_vals{"TSAPX"} = "40508430"; $tiaacref_vals{"TLSPX"} = "40508426"; $tiaacref_vals{"TSGPX"} = "40508436"; $tiaacref_vals{"TSIPX"} = "40508451"; $tiaacref_vals{"TSMPX"} = "40508456"; $tiaacref_vals{"TRGPX"} = "21066464"; $tiaacref_vals{"TRVPX"} = "21066455"; $tiaacref_vals{"TPPXX"} = "21066469"; $tiaacref_vals{"TRRPX"} = "21066459"; $tiaacref_vals{"TSTPX"} = "21066445"; $tiaacref_vals{"TSRPX"} = "21066446"; $tiaacref_vals{"TSBPX"} = "49604883"; $tiaacref_vals{"TRPSX"} = "21066460"; } #The location doesn't matter anymore. #I'm leaving this data structure in place in case it changes again #FBN 23/JAN/04 if (! %tiaacref_locs) { $tiaacref_locs{"CREFbond"} = 1; $tiaacref_locs{"QCBMPX"} = 1; $tiaacref_locs{"QCBMIX"} = 1; $tiaacref_locs{"CREFequi"} = 1; $tiaacref_locs{"QCEQPX"} = 1; $tiaacref_locs{"QCEQIX"} = 1; $tiaacref_locs{"CREFglob"} = 1; $tiaacref_locs{"QCGLPX"} = 1; $tiaacref_locs{"QCGLIX"} = 1; $tiaacref_locs{"CREFgrow"} = 1; $tiaacref_locs{"QCGRPX"} = 1; $tiaacref_locs{"QCGRIX"} = 1; $tiaacref_locs{"CREFinfb"} = 1; $tiaacref_locs{"QCILPX"} = 1; $tiaacref_locs{"QCILIX"} = 1; $tiaacref_locs{"CREFmony"} = 1; $tiaacref_locs{"QCMMPX"} = 1; $tiaacref_locs{"QCMMIX"} = 1; $tiaacref_locs{"CREFsoci"} = 1; $tiaacref_locs{"QCSCPX"} = 1; $tiaacref_locs{"QCSCIX"} = 1; $tiaacref_locs{"CREFstok"} = 1; $tiaacref_locs{"QCSTPX"} = 1; $tiaacref_locs{"QCSTIX"} = 1; $tiaacref_locs{"TIAAreal"} = 1; $tiaacref_locs{"TIDRX"} = 1; $tiaacref_locs{"TBIRX"} = 1; $tiaacref_locs{"TCBRX"} = 1; $tiaacref_locs{"TEDTX"} = 1; $tiaacref_locs{"TEMSX"} = 1; $tiaacref_locs{"TEQSX"} = 1; $tiaacref_locs{"TIQRX"} = 1; $tiaacref_locs{"TNRRX"} = 1; $tiaacref_locs{"TRGIX"} = 1; $tiaacref_locs{"TIHRX"} = 1; $tiaacref_locs{"TIKRX"} = 1; $tiaacref_locs{"TRERX"} = 1; $tiaacref_locs{"TRIEX"} = 1; $tiaacref_locs{"TIOTX"} = 1; $tiaacref_locs{"TILRX"} = 1; $tiaacref_locs{"TRIRX"} = 1; $tiaacref_locs{"TRLCX"} = 1; $tiaacref_locs{"TRCVX"} = 1; $tiaacref_locs{"TCLEX"} = 1; $tiaacref_locs{"TCLIX"} = 1; $tiaacref_locs{"TCLTX"} = 1; $tiaacref_locs{"TCLFX"} = 1; $tiaacref_locs{"TCLNX"} = 1; $tiaacref_locs{"TCLRX"} = 1; $tiaacref_locs{"TCLOX"} = 1; $tiaacref_locs{"TTFRX"} = 1; $tiaacref_locs{"TLFRX"} = 1; $tiaacref_locs{"TTRLX"} = 1; $tiaacref_locs{"TLXRX"} = 1; $tiaacref_locs{"TLTRX"} = 1; $tiaacref_locs{"TLGRX"} = 1; $tiaacref_locs{"TLWRX"} = 1; $tiaacref_locs{"TLQRX"} = 1; $tiaacref_locs{"TLHRX"} = 1; $tiaacref_locs{"TLYRX"} = 1; $tiaacref_locs{"TLZRX"} = 1; $tiaacref_locs{"TLMRX"} = 1; $tiaacref_locs{"TLLRX"} = 1; $tiaacref_locs{"TTIRX"} = 1; $tiaacref_locs{"TVITX"} = 1; $tiaacref_locs{"TRCIX"} = 1; $tiaacref_locs{"TLIRX"} = 1; $tiaacref_locs{"TSARX"} = 1; $tiaacref_locs{"TSCTX"} = 1; $tiaacref_locs{"TSGRX"} = 1; $tiaacref_locs{"TLSRX"} = 1; $tiaacref_locs{"TSMTX"} = 1; $tiaacref_locs{"TITRX"} = 1; $tiaacref_locs{"TRGMX"} = 1; $tiaacref_locs{"TRVRX"} = 1; $tiaacref_locs{"TIEXX"} = 1; $tiaacref_locs{"TRRSX"} = 1; $tiaacref_locs{"TRSPX"} = 1; $tiaacref_locs{"TISRX"} = 1; $tiaacref_locs{"TRBIX"} = 1; $tiaacref_locs{"TRSEX"} = 1; $tiaacref_locs{"TSBBX"} = 1; $tiaacref_locs{"TRSCX"} = 1; $tiaacref_locs{"TIBDX"} = 1; $tiaacref_locs{"TBIIX"} = 1; $tiaacref_locs{"TIBFX"} = 1; $tiaacref_locs{"TEDNX"} = 1; $tiaacref_locs{"TEMLX"} = 1; $tiaacref_locs{"TEQLX"} = 1; $tiaacref_locs{"TFIIX"} = 1; $tiaacref_locs{"TLIIX"} = 1; $tiaacref_locs{"TEVIX"} = 1; $tiaacref_locs{"TIEIX"} = 1; $tiaacref_locs{"TNRIX"} = 1; $tiaacref_locs{"TIGRX"} = 1; $tiaacref_locs{"TIHYX"} = 1; $tiaacref_locs{"TIILX"} = 1; $tiaacref_locs{"TIIEX"} = 1; $tiaacref_locs{"TCIEX"} = 1; $tiaacref_locs{"TIOIX"} = 1; $tiaacref_locs{"TILGX"} = 1; $tiaacref_locs{"TILIX"} = 1; $tiaacref_locs{"TRLIX"} = 1; $tiaacref_locs{"TILVX"} = 1; $tiaacref_locs{"TCTIX"} = 1; $tiaacref_locs{"TCNIX"} = 1; $tiaacref_locs{"TCWIX"} = 1; $tiaacref_locs{"TCYIX"} = 1; $tiaacref_locs{"TCRIX"} = 1; $tiaacref_locs{"TCIIX"} = 1; $tiaacref_locs{"TCOIX"} = 1; $tiaacref_locs{"TTFIX"} = 1; $tiaacref_locs{"TFTIX"} = 1; $tiaacref_locs{"TTRIX"} = 1; $tiaacref_locs{"TLXNX"} = 1; $tiaacref_locs{"TLTIX"} = 1; $tiaacref_locs{"TLFIX"} = 1; $tiaacref_locs{"TLWIX"} = 1; $tiaacref_locs{"TLQIX"} = 1; $tiaacref_locs{"TLHIX"} = 1; $tiaacref_locs{"TLYIX"} = 1; $tiaacref_locs{"TLZIX"} = 1; $tiaacref_locs{"TLXIX"} = 1; $tiaacref_locs{"TLLIX"} = 1; $tiaacref_locs{"TTIIX"} = 1; $tiaacref_locs{"TVIIX"} = 1; $tiaacref_locs{"TRILX"} = 1; $tiaacref_locs{"TLRIX"} = 1; $tiaacref_locs{"TSAIX"} = 1; $tiaacref_locs{"TCSIX"} = 1; $tiaacref_locs{"TSGGX"} = 1; $tiaacref_locs{"TSITX"} = 1; $tiaacref_locs{"TSIMX"} = 1; $tiaacref_locs{"TIMIX"} = 1; $tiaacref_locs{"TRPWX"} = 1; $tiaacref_locs{"TIMVX"} = 1; $tiaacref_locs{"TCIXX"} = 1; $tiaacref_locs{"TIREX"} = 1; $tiaacref_locs{"TISPX"} = 1; $tiaacref_locs{"TISIX"} = 1; $tiaacref_locs{"TISBX"} = 1; $tiaacref_locs{"TISEX"} = 1; $tiaacref_locs{"TSBIX"} = 1; $tiaacref_locs{"TISCX"} = 1; $tiaacref_locs{"TITIX"} = 1; $tiaacref_locs{"TIORX"} = 1; $tiaacref_locs{"TBILX"} = 1; $tiaacref_locs{"TCBPX"} = 1; $tiaacref_locs{"TEDLX"} = 1; $tiaacref_locs{"TEMRX"} = 1; $tiaacref_locs{"TEQKX"} = 1; $tiaacref_locs{"TINRX"} = 1; $tiaacref_locs{"TNRLX"} = 1; $tiaacref_locs{"TIIRX"} = 1; $tiaacref_locs{"TIYRX"} = 1; $tiaacref_locs{"TCILX"} = 1; $tiaacref_locs{"TIERX"} = 1; $tiaacref_locs{"TIOSX"} = 1; $tiaacref_locs{"TIRTX"} = 1; $tiaacref_locs{"TCLCX"} = 1; $tiaacref_locs{"TLRRX"} = 1; $tiaacref_locs{"TSALX"} = 1; $tiaacref_locs{"TSCLX"} = 1; $tiaacref_locs{"TSGLX"} = 1; $tiaacref_locs{"TSILX"} = 1; $tiaacref_locs{"TSMLX"} = 1; $tiaacref_locs{"TIMRX"} = 1; $tiaacref_locs{"TCMGX"} = 1; $tiaacref_locs{"TCMVX"} = 1; $tiaacref_locs{"TIRXX"} = 1; $tiaacref_locs{"TCREX"} = 1; $tiaacref_locs{"TCTRX"} = 1; $tiaacref_locs{"TCSEX"} = 1; $tiaacref_locs{"TSBRX"} = 1; $tiaacref_locs{"TICRX"} = 1; $tiaacref_locs{"TIXRX"} = 1; $tiaacref_locs{"TIDPX"} = 1; $tiaacref_locs{"TBIPX"} = 1; $tiaacref_locs{"TBPPX"} = 1; $tiaacref_locs{"TEDPX"} = 1; $tiaacref_locs{"TEMPX"} = 1; $tiaacref_locs{"TEQPX"} = 1; $tiaacref_locs{"TCEPX"} = 1; $tiaacref_locs{"TNRPX"} = 1; $tiaacref_locs{"TRPGX"} = 1; $tiaacref_locs{"TIHPX"} = 1; $tiaacref_locs{"TIKPX"} = 1; $tiaacref_locs{"TREPX"} = 1; $tiaacref_locs{"TRIPX"} = 1; $tiaacref_locs{"TIOPX"} = 1; $tiaacref_locs{"TILPX"} = 1; $tiaacref_locs{"TRCPX"} = 1; $tiaacref_locs{"TCTPX"} = 1; $tiaacref_locs{"TCFPX"} = 1; $tiaacref_locs{"TCWPX"} = 1; $tiaacref_locs{"TCQPX"} = 1; $tiaacref_locs{"TCHPX"} = 1; $tiaacref_locs{"TCYPX"} = 1; $tiaacref_locs{"TCZPX"} = 1; $tiaacref_locs{"TTFPX"} = 1; $tiaacref_locs{"TCLPX"} = 1; $tiaacref_locs{"TTRPX"} = 1; $tiaacref_locs{"TLXPX"} = 1; $tiaacref_locs{"TLTPX"} = 1; $tiaacref_locs{"TLFPX"} = 1; $tiaacref_locs{"TLWPX"} = 1; $tiaacref_locs{"TLVPX"} = 1; $tiaacref_locs{"TLHPX"} = 1; $tiaacref_locs{"TLYPX"} = 1; $tiaacref_locs{"TLPRX"} = 1; $tiaacref_locs{"TLMPX"} = 1; $tiaacref_locs{"TLLPX"} = 1; $tiaacref_locs{"TTIPX"} = 1; $tiaacref_locs{"TVIPX"} = 1; $tiaacref_locs{"TLIPX"} = 1; $tiaacref_locs{"TPILX"} = 1; $tiaacref_locs{"TSAPX"} = 1; $tiaacref_locs{"TLSPX"} = 1; $tiaacref_locs{"TSGPX"} = 1; $tiaacref_locs{"TSIPX"} = 1; $tiaacref_locs{"TSMPX"} = 1; $tiaacref_locs{"TRGPX"} = 1; $tiaacref_locs{"TRVPX"} = 1; $tiaacref_locs{"TPPXX"} = 1; $tiaacref_locs{"TRRPX"} = 1; $tiaacref_locs{"TSTPX"} = 1; $tiaacref_locs{"TSRPX"} = 1; $tiaacref_locs{"TSBPX"} = 1; $tiaacref_locs{"TRPSX"} = 1; } my(@funds) = @_; return unless @funds; my(@line); #holds the return from parse_csv my(%info); my(%check); #holds success value if data returned my($ua,$urlc,$urlt); #useragent and target urls my($cntc,$cntt); #counters for each of the two url containers my($reply,$qdata); #the reply from TIAA-CREF's cgi and a buffer for the data $urlc = $CREF_URL; $urlt = $TIAA_URL; #The new TIAA-CREF website asks for start and end dates. To guarantee data, #ask for 7 days of quotes, and only take the first (most recent) one. my(@starttime, $startdate); @starttime = localtime(time-7*86400); $starttime[5] += 1900; $starttime[4] += 1; $startdate = $starttime[5] . "-" . $starttime[4] . "-" . $starttime[3]; my(@endtime, $enddate); @endtime = localtime(time); $endtime[5] += 1900; $endtime[4] += 1; $enddate = $endtime[5] . "-" . $endtime[4] . "-" . $endtime[3]; $urlc .= "&NavStart=" . $startdate . "&NavEnd=" . $enddate; #Initialize counters for the two types of URL. If either counter is zero, then # that URL will not be retrieved. This is less technically clever than testing #the URL string itself with m/yes/, but its faster. $cntc = 0; $cntt = 0; foreach my $fund (@funds) { if ($tiaacref_ids{$fund}) { if ($tiaacref_locs{$fund} == 1) { $cntc++; $urlc .= "&WSODIssues=" . $tiaacref_vals{$fund}; } else { $urlt .= $fund . "=yes&"; $cntt++; } $check{$fund} = 0; } else { $info{$fund,"success"} = 0; $info{$fund,"errormsg"} = "Bad symbol"; } } $urlc .= "&viewtype=CSV"; $urlt .= "selected=1"; $qdata =""; $ua = $quoter->user_agent; if ($cntc) { $reply = $ua->request(GET $urlc); if ($reply ->is_success) { $qdata .= $reply->content; } } if ($cntt) { $reply = $ua->request(GET $urlt); if ($reply ->is_success) { $qdata .= $reply->content; } } if (length($qdata)) { $qdata = Encode::decode('utf16le', $qdata); foreach (split(/\012/,$qdata) ){ next unless m/.+,.+/; s/[\r\n]+//g; s/^ +//g; s/ +$//g; # @line = split(/,/,$_); @line = $quoter->parse_csv($_); if($line[0] eq "QCBMRX"){$line[0] = "CREFbond";} if($line[0] eq "QCEQRX"){$line[0] = "CREFequi";} if($line[0] eq "QCGLRX"){$line[0] = "CREFglob";} if($line[0] eq "QCGRRX"){$line[0] = "CREFgrow";} if($line[0] eq "QCILRX"){$line[0] = "CREFinfb";} if($line[0] eq "QCMMRX"){$line[0] = "CREFmony";} if($line[0] eq "QCSCRX"){$line[0] = "CREFsoci";} if($line[0] eq "QCSTRX"){$line[0] = "CREFstok";} if($line[0] eq "QREARX"){$line[0] = "TIAAreal";} if (exists $check{$line[0]}) { #did we ask for this data? if($check{$line[0]} == 1){next} #calcisme: this prevents getting more than the first of the quotes $info{$line[0],"symbol"} = $line[0]; #in case the caller needs this in the hash $info{$line[0],"exchange"} = "TIAA-CREF"; $info{$line[0],"name"} = $tiaacref_ids{$line[0]}; $quoter->store_date(\%info, $line[0], {usdate => $line[2]}); $info{$line[0],"nav"} = $line[1]; $info{$line[0],"price"} = $info{$line[0],"nav"}; $info{$line[0],"success"} = 1; #this contains good data, #beyond a reasonable doubt $info{$line[0],"currency"} = "USD"; $info{$line[0],"method"} = "tiaacref"; $info{$line[0],"exchange"} = "TIAA-CREF"; $check{$line[0]} = 1; } else { $info{$line[0],"success"} = 0; $info{$line[0],"errormsg"} = "Bad data returned"; } } } else { foreach $_ (@funds) { $info{$_,"success"} = 0; $info{$_,"errormsg"} = "HTTP error"; } # foreach } #if $length(qdata) else #now check to make sure a value was returned for every symbol asked for foreach my $k (keys %check) { if ($check{$k} == 0) { $info{$k,"success"} = 0; $info{$k,"errormsg"} = "No data returned"; } } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Tiaacref - Obtain quote from TIAA-CREF. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("tiaacref","TIAAreal"); =head1 DESCRIPTION This module obtains information about TIAA-CREF managed funds. The following symbols can be used: CREF Bond Market Account: CREFbond CREF Equity Index Account: CREFequi CREF Global Equities Account: CREFglob CREF Growth Account: CREFgrow CREF Inflation-Linked Bond Account: CREFinfb CREF Money Market Account: CREFmony CREF Social Choice Account: CREFsoci CREF Stock Account: CREFstok TIAA Real Estate Account: TIAAreal TIAA-CREF Bond Fund (Retirement): TIDRX TIAA-CREF Bond Index Fund (Retirement): TBIRX TIAA-CREF Bond Plus Fund (Retirement): TCBRX TIAA-CREF Emerging Markets Equity Fund (Retirement): TEMSX TIAA-CREF Emerging Markets Equity Index Fund (Retirement): TEQSX TIAA-CREF Equity Index Fund (Retirement): TIQRX TIAA-CREF Global Natural Resources Fund (Retirement): TNRRX TIAA-CREF Growth & Income Fund (Retirement): TRGIX TIAA-CREF High Yield Fund (Retirement): TIHRX TIAA-CREF Inflation-Linked Bond Fund (Retirement): TIKRX TIAA-CREF International Equity Fund (Retirement): TRERX TIAA-CREF International Equity Index Fund (Retirement): TRIEX TIAA-CREF Large-Cap Growth Fund (Retirement): TILRX TIAA-CREF Large-Cap Growth Index Fund (Retirement): TRIRX TIAA-CREF Large-Cap Value Fund (Retirement): TRLCX TIAA-CREF Large-Cap Value Index Fund (Retirement): TRCVX TIAA-CREF Lifecycle 2010 Fund (Retirement): TCLEX TIAA-CREF Lifecycle 2015 Fund (Retirement): TCLIX TIAA-CREF Lifecycle 2020 Fund (Retirement): TCLTX TIAA-CREF Lifecycle 2025 Fund (Retirement): TCLFX TIAA-CREF Lifecycle 2030 Fund (Retirement): TCLNX TIAA-CREF Lifecycle 2035 Fund (Retirement): TCLRX TIAA-CREF Lifecycle 2040 Fund (Retirement): TCLOX TIAA-CREF Lifecycle 2045 Fund (Retirement): TTFRX TIAA-CREF Lifecycle 2050 Fund (Retirement): TLFRX TIAA-CREF Lifecycle 2055 Fund (Retirement): TTRLX TIAA-CREF Lifecycle Index 2010 Fund (Retirement): TLTRX TIAA-CREF Lifecycle Index 2015 Fund (Retirement): TLGRX TIAA-CREF Lifecycle Index 2020 Fund (Retirement): TLWRX TIAA-CREF Lifecycle Index 2025 Fund (Retirement): TLQRX TIAA-CREF Lifecycle Index 2030 Fund (Retirement): TLHRX TIAA-CREF Lifecycle Index 2035 Fund (Retirement): TLYRX TIAA-CREF Lifecycle Index 2040 Fund (Retirement): TLZRX TIAA-CREF Lifecycle Index 2045 Fund (Retirement): TLMRX TIAA-CREF Lifecycle Index 2050 Fund (Retirement): TLLRX TIAA-CREF Lifecycle Index 2055 Fund (Retirement): TTIRX TIAA-CREF Lifecycle Index Retirement Income Fund (Retirement): TRCIX TIAA-CREF Lifecycle Retirement Income Fund (Retirement): TLIRX TIAA-CREF Lifestyle Aggressive Growth Fund (Retirement): TSARX TIAA-CREF Lifestyle Conservative Fund (Retirement): TSCTX TIAA-CREF Lifestyle Growth Fund (Retirement): TSGRX TIAA-CREF Lifestyle Income Fund (Retirement): TLSRX TIAA-CREF Lifestyle Moderate Fund (Retirement): TSMTX TIAA-CREF Managed Allocation Fund (Retirement): TITRX TIAA-CREF Mid-Cap Growth Fund (Retirement): TRGMX TIAA-CREF Mid-Cap Value Fund (Retirement): TRVRX TIAA-CREF Money Market Fund (Retirement): TIEXX TIAA-CREF Real Estate Securities Fund (Retirement): TRRSX TIAA-CREF S&P 500 Index Fund (Retirement): TRSPX TIAA-CREF Short-Term Bond Fund (Retirement): TISRX TIAA-CREF Small-Cap Blend Index Fund (Retirement): TRBIX TIAA-CREF Small-Cap Equity Fund (Retirement): TRSEX TIAA-CREF Social Choice Equity Fund (Retirement): TRSCX TIAA-CREF Bond Fund (Institutional): TIBDX TIAA-CREF Bond Index Fund (Institutional): TBIIX TIAA-CREF Bond Plus Fund (Institutional): TIBFX TIAA-CREF Emerging Markets Equity Fund (Institutional): TEMLX TIAA-CREF Emerging Markets Equity Index Fund (Institutional): TEQLX TIAA-CREF Enhanced International Equity Index Fund (Institutional): TFIIX TIAA-CREF Enhanced Large-Cap Growth Index Fund (Institutional): TLIIX TIAA-CREF Enhanced Large-Cap Value Index Fund (Institutional): TEVIX TIAA-CREF Equity Index Fund (Institutional): TIEIX TIAA-CREF Global Natural Resources Fund (Institutional): TNRIX TIAA-CREF Growth & Income Fund (Institutional): TIGRX TIAA-CREF High Yield Fund (Institutional): TIHYX TIAA-CREF Inflation-Linked Bond Fund (Institutional): TIILX TIAA-CREF International Equity Fund (Institutional): TIIEX TIAA-CREF International Equity Index Fund (Institutional): TCIEX TIAA-CREF Large-Cap Growth Fund (Institutional): TILGX TIAA-CREF Large-Cap Growth Index Fund (Institutional): TILIX TIAA-CREF Large-Cap Value Fund (Institutional): TRLIX TIAA-CREF Large-Cap Value Index Fund (Institutional): TILVX TIAA-CREF Lifecycle 2010 Fund (Institutional): TCTIX TIAA-CREF Lifecycle 2015 Fund (Institutional): TCNIX TIAA-CREF Lifecycle 2020 Fund (Institutional): TCWIX TIAA-CREF Lifecycle 2025 Fund (Institutional): TCYIX TIAA-CREF Lifecycle 2030 Fund (Institutional): TCRIX TIAA-CREF Lifecycle 2035 Fund (Institutional): TCIIX TIAA-CREF Lifecycle 2040 Fund (Institutional): TCOIX TIAA-CREF Lifecycle 2045 Fund (Institutional): TTFIX TIAA-CREF Lifecycle 2050 Fund (Institutional): TFTIX TIAA-CREF Lifecycle 2055 Fund (Institutional): TTRIX TIAA-CREF Lifecycle Index 2010 Fund (Institutional): TLTIX TIAA-CREF Lifecycle Index 2015 Fund (Institutional): TLFIX TIAA-CREF Lifecycle Index 2020 Fund (Institutional): TLWIX TIAA-CREF Lifecycle Index 2025 Fund (Institutional): TLQIX TIAA-CREF Lifecycle Index 2030 Fund (Institutional): TLHIX TIAA-CREF Lifecycle Index 2035 Fund (Institutional): TLYIX TIAA-CREF Lifecycle Index 2040 Fund (Institutional): TLZIX TIAA-CREF Lifecycle Index 2045 Fund (Institutional): TLXIX TIAA-CREF Lifecycle Index 2050 Fund (Institutional): TLLIX TIAA-CREF Lifecycle Index 2055 Fund (Institutional): TTIIX TIAA-CREF Lifecycle Index Retirement Income Fund (Institutional): TRILX TIAA-CREF Lifecycle Retirement Income Fund (Institutional): TLRIX TIAA-CREF Lifestyle Aggressive Growth Fund (Institutional): TSAIX TIAA-CREF Lifestyle Conservative Fund (Institutional): TCSIX TIAA-CREF Lifestyle Growth Fund (Institutional): TSGGX TIAA-CREF Lifestyle Income Fund (Institutional): TSITX TIAA-CREF Lifestyle Moderate Fund (Institutional): TSIMX TIAA-CREF Managed Allocation Fund (Institutional): TIMIX TIAA-CREF Mid-Cap Growth Fund (Institutional): TRPWX TIAA-CREF Mid-Cap Value Fund (Institutional): TIMVX TIAA-CREF Money Market Fund (Institutional): TCIXX TIAA-CREF Real Estate Securities Fund (Institutional): TIREX TIAA-CREF S&P 500 Index Fund (Institutional): TISPX TIAA-CREF Short-Term Bond Fund (Institutional): TISIX TIAA-CREF Small-Cap Blend Index Fund (Institutional): TISBX TIAA-CREF Small-Cap Equity Fund (Institutional): TISEX TIAA-CREF Social Choice Equity Fund (Institutional): TISCX TIAA-CREF Tax-Exempt Bond Fund (Institutional): TITIX TIAA-CREF Bond Fund (Retail): TIORX TIAA-CREF Bond Index Fund (Retail): TBILX TIAA-CREF Bond Plus Fund (Retail): TCBPX TIAA-CREF Emerging Markets Equity Fund (Retail): TEMRX TIAA-CREF Emerging Markets Equity Index Fund (Retail): TEQKX TIAA-CREF Equity Index Fund (Retail): TINRX TIAA-CREF Global Natural Resources Fund (Retail): TNRLX TIAA-CREF Growth & Income Fund (Retail): TIIRX TIAA-CREF High Yield Fund (Retail): TIYRX TIAA-CREF Inflation-Linked Bond Fund (Retail): TCILX TIAA-CREF International Equity Fund (Retail): TIERX TIAA-CREF Large-Cap Growth Fund (Retail): TIRTX TIAA-CREF Large-Cap Value Fund (Retail): TCLCX TIAA-CREF Lifecycle Retirement Income Fund (Retail): TLRRX TIAA-CREF Lifestyle Aggressive Growth Fund (Retail): TSALX TIAA-CREF Lifestyle Conservative Fund (Retail): TSCLX TIAA-CREF Lifestyle Growth Fund (Retail): TSGLX TIAA-CREF Lifestyle Income Fund (Retail): TSILX TIAA-CREF Lifestyle Moderate Fund (Retail): TSMLX TIAA-CREF Managed Allocation Fund (Retail): TIMRX TIAA-CREF Mid-Cap Growth Fund (Retail): TCMGX TIAA-CREF Mid-Cap Value Fund (Retail): TCMVX TIAA-CREF Money Market Fund (Retail): TIRXX TIAA-CREF Real Estate Securities Fund (Retail): TCREX TIAA-CREF Short-Term Bond Fund (Retail): TCTRX TIAA-CREF Small-Cap Equity Fund (Retail): TCSEX TIAA-CREF Social Choice Equity Fund (Retail): TICRX TIAA-CREF Tax-Exempt Bond Fund (Retail): TIXRX TIAA-CREF Bond Fund (Premier): TIDPX TIAA-CREF Bond Index Fund (Premier): TBIPX TIAA-CREF Bond Plus Fund (Premier): TBPPX TIAA-CREF Emerging Markets Equity Fund (Premier): TEMPX TIAA-CREF Emerging Markets Equity Index Fund (Premier): TEQPX TIAA-CREF Equity Index Fund (Premier): TCEPX TIAA-CREF Global Natural Resources Fund (Premier): TNRPX TIAA-CREF Growth & Income Fund (Premier): TRPGX TIAA-CREF High Yield Fund (Premier): TIHPX TIAA-CREF Inflation-Linked Bond Fund (Premier): TIKPX TIAA-CREF International Equity Fund (Premier): TREPX TIAA-CREF International Equity Index Fund (Premier): TRIPX TIAA-CREF Large-Cap Growth Fund (Premier): TILPX TIAA-CREF Large-Cap Value Fund (Premier): TRCPX TIAA-CREF Lifecycle 2010 Fund (Premier): TCTPX TIAA-CREF Lifecycle 2015 Fund (Premier): TCFPX TIAA-CREF Lifecycle 2020 Fund (Premier): TCWPX TIAA-CREF Lifecycle 2025 Fund (Premier): TCQPX TIAA-CREF Lifecycle 2030 Fund (Premier): TCHPX TIAA-CREF Lifecycle 2035 Fund (Premier): TCYPX TIAA-CREF Lifecycle 2040 Fund (Premier): TCZPX TIAA-CREF Lifecycle 2045 Fund (Premier): TTFPX TIAA-CREF Lifecycle 2050 Fund (Premier): TCLPX TIAA-CREF Lifecycle 2055 Fund (Premier): TTRPX TIAA-CREF Lifecycle Index 2010 Fund (Premier): TLTPX TIAA-CREF Lifecycle Index 2015 Fund (Premier): TLFPX TIAA-CREF Lifecycle Index 2020 Fund (Premier): TLWPX TIAA-CREF Lifecycle Index 2025 Fund (Premier): TLVPX TIAA-CREF Lifecycle Index 2030 Fund (Premier): TLHPX TIAA-CREF Lifecycle Index 2035 Fund (Premier): TLYPX TIAA-CREF Lifecycle Index 2040 Fund (Premier): TLPRX TIAA-CREF Lifecycle Index 2045 Fund (Premier): TLMPX TIAA-CREF Lifecycle Index 2050 Fund (Premier): TLLPX TIAA-CREF Lifecycle Index 2055 Fund (Premier): TTIPX TIAA-CREF Lifecycle Index Retirement Income Fund (Premier): TLIPX TIAA-CREF Lifecycle Retirement Income Fund (Premier): TPILX TIAA-CREF Lifestyle Aggressive Growth Fund (Premier): TSAPX TIAA-CREF Lifestyle Conservative Fund (Premier): TLSPX TIAA-CREF Lifestyle Growth Fund (Premier): TSGPX TIAA-CREF Lifestyle Income Fund (Premier): TSIPX TIAA-CREF Lifestyle Moderate Fund (Premier): TSMPX TIAA-CREF Mid-Cap Growth Fund (Premier): TRGPX TIAA-CREF Mid-Cap Value Fund (Premier): TRVPX TIAA-CREF Money Market Fund (Premier): TPPXX TIAA-CREF Real Estate Securities Fund (Premier): TRRPX TIAA-CREF Short-Term Bond Fund (Premier): TSTPX TIAA-CREF Small-Cap Equity Fund (Premier): TSRPX TIAA-CREF Social Choice Equity Fund (Premier): TRPSX This module is loaded by default on a Finance::Quote object. It's also possible to load it explicitly by passing "Tiaacref" in to the argument argument list of Finance::Quote->new(). Information returned by this module is governed by TIAA-CREF's terms and conditions. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Tiaacref: symbol, exchange, name, date, nav, price. =head1 SEE ALSO TIAA-CREF, http://www.tiaa-cref.org/ =cut ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/TNetuk.pm������������������������������������������������������000644 �000765 �000024 �00000030603 12566055631 020626� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # TNetuk.pm # # Obtains quotes for UK Unit Trusts from http://trustnet.com/ - please # refer to the end of this file for further information. # # author: Martin Sadler (martinsadler@users.sourceforge.net) # # version: 0.1 Initial version - 01 April 2013 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # package Finance::Quote::TNetuk; require 5.005; use strict; use warnings; # Set DEBUG => 0 for no debug messages, => 1 for first level, => 2 for 2nd level, etc. use constant DEBUG => 0; # URLs use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP $TNETUK_MAIN_URL); use LWP::Simple; use LWP::UserAgent; use HTTP::Request::Common; use HTTP::Cookies; use HTML::TokeParser; # use Data::Dumper; our $VERSION = '1.38'; # VERSION $TNETUK_MAIN_URL = "http://www.trustnet.com"; $TNETUK_LOOK_UP = "http://www.trustnet.com/Tools/Search.aspx?keyword="; $TNETUK_NEXT_URL = "/Factsheets/Factsheet.aspx?fundcode="; # FIXME - sub methods { return (tnetuk => \&tnetuk_fund, ukfunds => \&tnetuk_fund); } { my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/; sub labels { return (tnetuk => \@labels, ukfunds => \@labels); } } # # ======================================================================= sub tnetuk_fund { my $quoter = shift; my @symbols = @_; return unless @symbols; my %fundquote; my $ua = $quoter->user_agent; my $cj = HTTP::Cookies->new(); $ua->cookie_jar( $cj ); foreach (@symbols) { my $code = $_; my $code_type = "** Invalid **"; if ($code =~ m/^[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)/ && !$1) { $code_type = "ISIN"; } elsif ($code =~ m/^[a-zA-Z0-9]{6}\d(.*)/ && !$1 ) { $code_type = "SEDOL"; } elsif ($code =~ m/^[a-zA-Z]{4,6}(.*)/ && !$1) { $code_type = "MEXID"; } # current version can only use ISIN - report an error and exit if any other type if ($code_type ne "ISIN") { $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - invalid symbol"; next; } $fundquote {$code,"success"} = 1; # ever the optimist.... $fundquote {$code,"errormsg"} = "Success"; # perform the look-up - if not found, return with error my $webdoc = $ua->get($TNETUK_LOOK_UP.$code); if (!$webdoc->is_success) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data : HTTP Status = ",$webdoc->status_line; next; } $fundquote {$code, "symbol"} = $code; $fundquote {$code, "source"} = $TNETUK_MAIN_URL; DEBUG and print "\nTitle = ",$webdoc->title,"\n"; DEBUG and print "\nStatus = ",$webdoc->status_line, "\n"; #DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n"; DEBUG > 1 and my $outfile = "tnetuk-p1-".$code.".txt"; DEBUG > 1 and open (OUT,">$outfile"); DEBUG > 1 and print OUT $webdoc->content; DEBUG > 1 and close(OUT); # Find name and next url using TokeParser my $htmlstream = HTML::TokeParser->new(\$webdoc->content); my $done = 0; my ($tag, $name, $nexturl, $univ); while ( ( $tag = $htmlstream->get_tag('a')) && !$nexturl ) { if ( $tag->[1]{'href'} ) { DEBUG and print "\nTag-item 'href' = ",$tag->[1]{'href'},"\n"; if ( $tag->[1]{'href'} =~ m[^/Factsheets/Factsheet\.aspx.*univ=(.).*] ) { $univ = $1; DEBUG and print "\nUniv = ",$univ,"\n"; $nexturl = $tag->[1]{'href'}; $name = $htmlstream->get_trimmed_text('/a'); } } } DEBUG and print "\nNext URL = ",$nexturl,"\n"; DEBUG and print "\bName = ",$name,"\n"; if (!defined($name)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find fund name"; $name = "*** UNKNOWN ***"; # ... and continue } $fundquote {$code, "name"} = $name; # set name if (!defined($nexturl)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data"; next; } # need SEDOL to identify the correct line in the next web-page my $sedol; if ($code =~ m[^[a-zA-Z]{2}[0-9]{2}([a-zA-Z0-9]{7})\d]) { $sedol = $1; } DEBUG and print "SEDOL for ",$code," = ",$sedol,"\n"; # modify $nexturl to remove html escape encoding for the Ampersand (&) character $nexturl =~ s/&/&/; # Now need to look-up next page using $next_url $webdoc = $ua->get($TNETUK_MAIN_URL.$nexturl); if (!$webdoc->is_success) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data : HTTP Status = ",$webdoc->status_line; next; } DEBUG and print "\nTitle = ",$webdoc->title,"\n"; DEBUG and print "\nStatus = ",$webdoc->status_line, "\n"; #DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n"; DEBUG > 1 and $outfile = "tnetuk-p2-".$code.".txt"; DEBUG > 1 and open (OUT,">$outfile"); DEBUG > 1 and print OUT $webdoc->content; DEBUG > 1 and close(OUT); # Find date, currency and price using TokeParser my ($currency, $date, $price, $pchange, $text, $match, $ucname); $htmlstream = HTML::TokeParser->new(\$webdoc->content); $match = 0; while ( ( $tag = $htmlstream->get_tag('caption')) && !$done ) { DEBUG and print "\nFound tag : ",$tag->[3],$htmlstream->get_trimmed_text('/caption'),"</caption/>\n"; while ( ($tag = $htmlstream->get_tag('a')) && $tag->[1]{'href'} && !$match ) { DEBUG and print "\nTag-item 'href' = ",$tag->[1]{'href'},"\n"; if ( $tag->[1]{'href'} =~ m[.*/Factsheets/Factsheet\.aspx.*] ) { DEBUG and print "\nFound tag-item : ",$tag->[3],"\n"; $done = 0; $ucname = $htmlstream->get_trimmed_text('/a'); DEBUG and print "\nUpper-case name = ",$ucname,"\n"; while ( ($tag = $htmlstream->get_tag('td','/tr')) && !$done ) { if ( $tag->[0] eq '/tr' ) # end of table { DEBUG and print "\nEnd of table reached... "; $done = 1; if ( !$match ) { DEBUG and print "no match found on SEDOL/Name\n"; $currency = $date = $price = undef; } else { DEBUG and print "SEDOL/Name match found!\n"; } } else { $text = $htmlstream->get_trimmed_text('/td'); if ( $text =~ m[^([0-9\.]*) \(([a-zA-Z]{1,3})\)] ) # price { $price = $1; if ( $2 eq 'p' ) { $currency = 'GBX'; } else { $currency = $2; } DEBUG and print "\nCCY / Price = ",$currency," ",$price,"\n"; } if ( $text =~ m[.*([0-9]{2}-[a-zA-Z]{3}-[0-9]{4})] ) # date { $date = $1; DEBUG and print "\nDate = ",$date,"\n"; } if ( $text =~ m[^([a-zA-Z0-9]{7})] ) #sedol { DEBUG and print "\nSEDOL = ",$text," : (",$sedol,")\n"; $text = uc($name); DEBUG and print "\nNames = ",$ucname," : (",$text,")\n"; if ( ($sedol eq $1) ) # matches on SEDOL { $match = 1; } else { if ($ucname eq $text) # matches om name { $match = 1; $fundquote {$code,"errormsg"} = "Warning - matched on name only"; } } } } } } } } if (!defined($pchange)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find net or %-age change"; # set to (minus)zero $pchange = -0.00; # ... and continue } $fundquote {$code, "p_change"} = $pchange; # set %-change DEBUG and print "\n\%-age change = ",$pchange,"\n"; DEBUG and print "\nDate = ",$date,"\n"; if (!defined($date)) { # not a serious error - don't report it .... # $fundquote {$code,"success"} = 0; # ... but set a useful message .... $fundquote {$code,"errormsg"} = "Warning - failed to find a date"; # use today's date $quoter->store_date(\%fundquote, $code, {today => 1}); # ... and continue } else { $quoter->store_date(\%fundquote, $code, {eurodate => $date}); } DEBUG and print "\nPrice = ",$price,"\n"; if (!defined($price)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to find a price"; next; } DEBUG and print "\nCCY = ",$currency,"\n"; if (!defined($currency)) { # serious error, report it and give up $fundquote {$code,"success"} = 0; $fundquote {$code,"errormsg"} = "Error - failed to find a currency"; next; } # defer setting currency and price until we've dealt with possible GBX currency... # Calculate net change - it's not included in the trustnet factsheets my $net = ($price * $pchange) / 100 ; # deal with GBX pricing of UK unit trusts if ($currency eq "GBX") { $currency = "GBP" ; $price = $price / 100 ; $net = $net / 100 ; } # now set prices and currency $fundquote {$code, "price"} = $price; $fundquote {$code, "last"} = $price; $fundquote {$code, "nav"} = $price; $fundquote {$code, "net"} = $net; $fundquote {$code, "currency"} = $currency; # Set a dummy time as gnucash insists on having a valid format my $time = "12:00"; # set to Midday if no time supplied ??? # gnucash insists on having a valid-format $fundquote {$code, "time"} = $time; # set time $fundquote {$code, "method"} = "tnetuk"; # set method } return wantarray ? %fundquote : \%fundquote; } 1; =head1 NAME Finance::Quote::tnetuk - Obtain UK Unit Trust quotes from trustnet.com. =head1 SYNOPSIS $q = Finance::Quote->new; %info = Finance::Quote->fetch("tnetuk","<isin> ..."); # Only query trustnet.com using ISINs %info = Finance::Quote->fetch("ukfunds","<isin>|<sedol>|<mexid> ..."); # Failover to other sources =head1 DESCRIPTION This module fetches information from the Trustnet UK Funds service, http://trustnet.com. There are many UK Unit Trusts and OEICs quoted, as well as many Offshore Funds and Exhange Traded Funds (ETFs). It converts any funds quoted in GBX (pence) to GBP, dividing the price by 100 in the process. Funds are identified by their ISIN code. This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "tnetuk" in the argument list to Finance::Quote->new(). Information obtained by this module may be covered by tnetuk.com terms and conditions See http://trustnet.com for details. =head2 Stocks And Indices This module provides both the "tnetuk" and "ukfunds" fetch methods for fetching UK and Offshore Unit Trusts and OEICs prices and other information from funds.ft.com. Please use the "ukfunds" fetch method if you wish to have failover with future sources for UK and Offshore Unit Trusts and OEICs - the author has plans to develop Finance::Quote modules for other sources providing uk unit trust prices. Using the "tnetuk" method will guarantee that your information only comes from the trustnet.com website. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::TNetuk : name, currency, last, date, time, price, nav, source, method, iso_date, net, p_change, success, errormsg. =head1 SEE ALSO =head1 AUTHOR Martin Sadler, E<lt>martinsadler@users.sourceforge.netE<gt> =head1 COPYRIGHT AND LICENSE Copyright (C) 2010 by Martin Sadler This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.1 or, at your option, any later version of Perl 5 you may have available. =cut __END__ �����������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Troweprice.pm��������������������������������������������������000644 �000765 �000024 �00000007625 12566055631 021547� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> package Finance::Quote::Troweprice; require 5.005; use strict; use vars qw( $TROWEPRICE_URL); use LWP::UserAgent; use HTTP::Request::Common; use Carp; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $TROWEPRICE_URL = ("http://www.troweprice.com/mutual/prices.csv"); sub methods { return (troweprice => \&troweprice, troweprice_direct => \&troweprice); } { my @labels = qw/method exchange name nav date isodate price/; sub labels { return (troweprice => \@labels, troweprice_direct => \@labels); } } # ======================================================================= sub troweprice { my $quoter = shift; my(@q,%aa,$ua,$url,$sym); # for T Rowe Price, we get them all. $url = $TROWEPRICE_URL; $ua = $quoter->user_agent; my $reply = $ua->request(GET $url); return unless ($reply->is_success); foreach (split('\015?\012',$reply->content)) { @q = $quoter->parse_csv($_); # extract the date which is usually on the second line fo the file. ($sym = $q[0]) =~ s/^ +//; if ($sym) { $aa {$sym, "exchange"} = "T. Rowe Price"; # TRP $aa {$sym, "method"} = "troweprice"; # ($aa {$sym, "name"} = $q[0]) =~ s/^ +//; $aa {$sym, "name"} = $sym; # no name supplied ... $aa {$sym, "nav"} = $q[1]; $quoter->store_date(\%aa, $sym, {usdate => $q[2]}); $aa {$sym, "price"} = $aa{$sym,"nav"}; $aa {$sym, "success"} = 1; $aa {$sym, "currency"} = "USD"; } else { $aa {$sym, "success"} = 0; $aa {$sym, "errormsg"} = "Stock lookup failed."; } } return %aa if wantarray; return \%aa; } 1; =head1 NAME Finance::Quote::Troweprice - Obtain quotes from T. Rowe Price =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("troweprice","PRFDX"); # Can failover to other methods %stockinfo = $q->fetch("troweprice_direct","PRFDX"); # Use this module only. =head1 DESCRIPTION This module obtains information about managed funds from T. Rowe Price. Information about T. Rowe Price funds is available from a variety of sources. The information source "troweprice" can be used if you don't care which source you obtain information from. If you wish to be guaranteed of fetching information from T. Rowe Price directly, then the information source "troweprice_direct" should be used. =head1 LABELS RETURNED Information available from T. Rowe Price may include the following labels: exchange, name, nav, date, price. =head1 SEE ALSO T. Rowe Price website - http://www.troweprice.com/ Finance::Quote::Yahoo::USA =cut �����������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Trustnet.pm����������������������������������������������������000644 �000765 �000024 �00000016266 12566055631 021255� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2000, Keith Refson <Keith.Refson@earth.ox.ac.uk> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> package Finance::Quote::Trustnet; require 5.004; use strict; use vars qw($TRUSTNET_URL $TRUSTNET_ALL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $TRUSTNET_URL = ('http://www.trustnet.com/ut/funds/perf.asp?reg=all&sec=all&type=all&sort=5&ss=0&booAutif=0&columns=13&unit='); $TRUSTNET_ALL="http://www.trustnet.com/ut/funds/perf.asp"; sub methods { return (uk_unit_trusts => \&trustnet, trustnet => \&trustnet); } { my @labels = qw/exchange method source name currency bid ask yield price/; sub labels { return (trustnet => \@labels, uk_unit_trusts => \@labels); } } # ======================================================================= sub trustnet { my $quoter = shift; my @symbols = @_; return unless @symbols; my(@q,%aa,$ua,$url,$sym,$ts,$price,$currency,$reply,$trust,$trusto,$unittype,$suffix); my ($row, $datarow, $matches, $encoded); my %curr_iso = (GBP => "GBP", "£" => "GBP", "\$" => "USD"); my %symbolhash; @symbolhash{@symbols} = map(1,@symbols); # for (@symbols) { my $te = new HTML::TableExtract( headers => [("Fund Name", "Group Name", "Bid Price", "Offer Price", "Yield")]); $trust = $_; # determine unit type $unittype = "all"; $trusto = $trust; # retain full trust name for gnucash helper $trusto =~ s/(\(INC\)|\(ACC\))$//i; # trust name w/o suffix for trustnet $suffix = $1; if (defined($suffix)) { $unittype = "inc" if ($suffix =~ /\(INC\)/i); $unittype = "acc" if ($suffix =~ /\(ACC\)/i); } $trusto =~ s/\s+$//; $trusto =~ s/&/&/g; $encoded = $trusto; $encoded =~ s/&/%26/g; $url = "$TRUSTNET_URL$unittype&txtS=$encoded"; # print STDERR "Retrieving \"$trust\" from $url\n"; $ua = $quoter->user_agent; $reply = $ua->request(GET $url); return unless ($reply->is_success); # print STDERR $reply->content,"\n"; $te->parse($reply->content); $ts = ($te->table_states)[0]; if( defined ($ts)) { # check the trust name - first look for an exact match trimming trailing spaces $matches = 0; foreach $row ($ts->rows) { # Try to weed out extraneous rows. next if !defined($$row[1]); ($sym = $$row[0]) =~ s/^ +//; $sym =~ s/ +\xA0.+//; # print "Checking <", $sym, "> for <", $trusto, ">\n"; if ($sym =~ /^$trusto$/i) { $matches++; $datarow = $row; # print "Found exact match\n"; } } # no exact match, so just look for 'starts with' if ($matches == 0) { foreach $row ($ts->rows) { ($sym = $$row[0]) =~ s/^ +//; if ($sym =~ /$trusto/i) { $matches++; $datarow = $row; } } } if ($matches > 1 ) { $aa {$trust, "success"} = 0; $aa {$trust, "errormsg"} = "Fund name $trust is not unique. See \"$TRUSTNET_ALL\""; next; } elsif ($matches < 1 ) { $aa {$trust, "success"} = 0; #$aa {$trust, "errormsg"} = "Fund name $trust is not found. See \"$TRUSTNET_ALL\""; $aa {$trust, "errormsg"} = "Error retrieving $trust -- unexpected input"; next; } else { $aa {$trust, "exchange"} = "Trustnet"; $aa {$trust, "method"} = "trustnet"; $aa {$trust, "source"} = "http://www.trustnet.co.uk/"; ($aa {$trust, "name"} = $$datarow[0]) =~ s/^ +//; $aa {$trust, "symbol"} = $trust; ($price = $$datarow[2]) =~ s/\s*\((.*)\)//; $currency=$1||"GBP"; $aa {$trust, "currency"} = $curr_iso{"$currency"}; $aa {$trust, "bid"} = $price * 0.01; ($price = $$datarow[3]) =~ s/\s*\((.*)\)//; $price = $aa {$trust, "bid"} if $price eq ""; $aa {$trust, "ask"} = $price * 0.01; $aa {$trust, "yield"} = $$datarow[4]; $aa {$trust, "price"} = $aa{$trust,"bid"}; $aa {$trust, "success"} = 1; # print STDERR "Trustnet:: Flagging success for $trust\n"; # # Trustnet no longer seems to include date in reply as of Nov 03 # Perforce we must default to today's date, though last working day may be more accurate. # Due to the way UK unit trust prices are calculated, assigning an exact date is problematic anyway. if ( $reply->content =~ /Source : TrustNet - ([\w\d-]+) - http:\/\/www.trustnet.com/m) { $quoter->store_date(\%aa, $trust, {isodate => $1}); } else { $quoter->store_date(\%aa, $trust, {today => 1}); } } } else { $aa {$trust, "success"} = 0; $aa {$trust, "errormsg"} = "Fund name $trust is not found. See \"$TRUSTNET_ALL\""; next; } } return %aa if wantarray; return \%aa; } 1; =head1 NAME Finance::Quote::Trustnet - Obtain unit trust prices from trustnet.co.uk =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("uk_unit_trusts","trust-name"); # Can failover to other methods %stockinfo = $q->fetch("trustnet","trust-name"); # Use this module only. =head1 DESCRIPTION This module obtains information about UK unit trust prices from www.trustnet.co.uk. The information source "uk_unit_trusts" can be used if the source of prices is irrelevant, and "trustnet" if you specifically want to use trustnet.co.uk. =head1 UNIT TRUST NAMES Unfortunately there is no unique identifier for unit trust names. Therefore enough of the name should be given including spaces to yield a unique match. Trustnet sometimes uses abbreviated names, and the string given should match the abbreviation. Consult http://www.trustnet.co.uk/ut/funds/perf.asp?sort=0 to find a match for your unit trusts. Example "jupiter income" =head1 LABELS RETURNED Information available from Trustnet may include the following labels: exchange method source name currency bid ask yield price. In case of a unit trust, "price" returns the offer (ask) price. In case of an OIEC, the unique price is returned in "bid", "ask" and "price". =head1 SEE ALSO Trustnet website - http://www.trustnet.co.uk/ Finance::Quote::Yahoo::USA =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/TSP.pm���������������������������������������������������������000644 �000765 �000024 �00000014271 12566055631 020065� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2001, Rob Sessink <rob_ses@users.sourceforge.net> # Copyright (C) 2004, Frank Mori Hess <fmhess@users.sourceforge.net> # Trent Piepho <xyzzy@spekeasy.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code is derived from version 0.9 of the AEX.pm module. require 5.005; use strict; package Finance::Quote::TSP; use vars qw( $TSP_URL $TSP_MAIN_URL %TSP_FUND_COLUMNS %TSP_FUND_NAMES); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information $TSP_URL = 'https://www.tsp.gov/investmentfunds/shareprice/sharePriceHistory.shtml'; $TSP_MAIN_URL=("http://www.tsp.gov"); # ENHANCE-ME: The decade target funds like 2020 appear and disappear. # Better not to hard code them. # %TSP_FUND_COLUMNS = ( TSPL2050FUND => "L 2050", TSPL2040FUND => "L 2040", TSPL2030FUND => "L 2030", TSPL2020FUND => "L 2020", TSPLINCOMEFUND => "L INCOME", TSPGFUND => "G FUND", TSPFFUND => "F FUND", TSPCFUND => "C FUND", TSPSFUND => "S FUND", TSPIFUND => "I FUND" ); %TSP_FUND_NAMES = ( TSPL2050 => 'Lifecycle 2050 Fund', TSPL2040 => 'Lifecycle 2040 Fund', TSPL2030 => 'Lifecycle 2030 Fund', TSPL2020 => 'Lifecycle 2020 Fund', TSPLINCOME => 'Lifecycle Income Fund', TSPGFUND => 'Government Securities Investment Fund', TSPFFUND => 'Fixed Income Index Investment Fund', TSPCFUND => 'Common Stock Index Investment Fund', TSPSFUND => 'Small Capitalization Stock Index Investment Fund', TSPIFUND => 'International Stock Index Investment Fund' ); sub methods { return (tsp => \&tsp) } { my @labels = qw/name nav date isodate currency method last close/; sub labels { return (tsp => \@labels); } } # ============================================================================== sub tsp { my $quoter = shift; my @symbols = @_; # Make sure symbols are requested ##CAN exit more gracefully - add later## return unless @symbols; # Local Variables my(%info, %fundrows); my($ua, $reply, $row, $te, $ts, $second_row); $ua = $quoter->user_agent; $reply = $ua->request(GET $TSP_URL); return unless ($reply->is_success); $te = new HTML::TableExtract( headers => ["Date", values %TSP_FUND_COLUMNS] ); $te->parse($reply->content); # First row is newest data, older data follows, maybe there # should be some way to get it (in addition to the second_row "close") $ts = $te->first_table_found || die 'TSP data table not recognised'; $row = $ts->row(0); $second_row = $ts->row(1); # Make a hash that maps the order the columns are in for(my $i=1; my $key = each %TSP_FUND_COLUMNS ; $i++) { $fundrows{$key} = $i; } foreach (@symbols) { # Ignore case when looking up the data. Preserve case # when storing the symbol name in the info array. my $tmp = uc $_; $tmp = uc sprintf("TSP%sfund", substr($tmp,0,1)) if (index("GFCSI", substr($tmp,0,1)) >= 0); if (index("LINCOME", substr($tmp,0,7)) >= 0) { $tmp = uc sprintf("TSP%sfund", substr($tmp,0,7)); } elsif (index("L", substr($tmp,0,1)) >= 0) { $tmp = uc sprintf("TSP%sfund", substr($tmp,0,5)); } if(exists $fundrows{$tmp}) { $info{$_, 'success'} = 1; $info{$_, 'method'} = 'tsp'; $info{$_, 'currency'} = 'USD'; $info{$_, 'source'} = $TSP_MAIN_URL; $info{$_, 'symbol'} = $_; $info{$_, 'name'} = $TSP_FUND_NAMES{$tmp}; ($info{$_, 'nav'} = $$row[$fundrows{$tmp}]) =~ s/[^0-9]*([0-9.,]+).*/$1/s; $info{$_, 'last'} = $info{$_, 'nav'}; ($info{$_, 'close'} = $second_row->[$fundrows{$tmp}]) =~ s/[^0-9]*([0-9.,]+).*/$1/s; $quoter->store_date(\%info, $_, {usdate => $$row[0]}); } else { $info{$_, 'success'} = 0; $info{$_, 'errormsg'} = "Fund name unknown"; } } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::TSP Obtain fund prices for US Federal Government Thrift Savings Plan =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("tsp","c"); #get value of C "Common Stock Index Investment" Fund =head1 DESCRIPTION This module fetches fund information from the "Thrift Savings Plan" http://www.tsp.gov using its fund prices page https://www.tsp.gov/investmentfunds/shareprice/sharePriceHistory.shtml The quote symbols are C common stock fund F fixed income fund G government securities fund I international stock fund S small cap stock fund L2020 lifecycle fund year 2020 L2030 lifecycle fund year 2030 L2040 lifecycle fund year 2040 L2050 lifecycle fund year 2050 LINCOME lifecycle income fund =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::TSP : name eg. "Common Stock Index Investment Fund" date latest date, eg. "21/02/10" isodate latest date, eg. "2010-02-21" last latest price, eg. "16.1053" close previous day's price nav same as "last" currency "USD" method "tsp" C<nav> is the same as C<last> since the funds are quoted at their net asset value. =head1 SEE ALSO Thrift Savings Plan, http://www.tsp.gov =cut ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/TSX.pm���������������������������������������������������������000644 �000765 �000024 �00000013231 12566055631 020070� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2001, Leigh Wedding <leigh.wedding@telstra.com> # Copyright (C) 2006, Mika Laari <mika.laari@iki.fi> # Copyright (C) 2008, Emmanuel Rodriguez <potyl@cpan.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from the work of Mika Laari in the package # Finance::Quote::HEX. # # This code was developed as part of GnuCash <http://www.gnucash.org/> require 5.005; use strict; package Finance::Quote::TSX; use LWP::UserAgent; use HTML::TableExtract; use URI; use URI::QueryParam; our $VERSION = '1.38'; # VERSION # This URL is able to accept up to 10 symbols at a time my $TSX_URL = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx'); # The number of symbols that can be fetched at a time per URL my $BATCH_SIZE = 10; my @LABELS = qw(name last net p_change volume exchange); sub methods { return ( tsx => \&tsx, canada => \&tsx, ); } sub labels { return ( tsx => \@LABELS, canada => \@LABELS, ); } # Toronto Stock Exchange (TSX) # The TSX provides free delayed quotes through their webpage. # This module is based on HEX.pm. # # Maintainer of this section is Emmanuel Rodriguez <potyl@cpan.org>. sub tsx { my $quoter = shift; my @symbols = @_; return unless @symbols; my %info = (); # Fetch the stocks per batch while (@symbols) { # Get the next batch of symbols my @batch = splice @symbols, 0, $BATCH_SIZE; # Build the URL my $url = $TSX_URL->clone; $url->query_param(symb => join ',', @batch); # Download the stock information my $response = $quoter->user_agent->get($url); unless ($response->is_success) { foreach my $symbol (@batch) { $info{$symbol, 'success'} = 0; $info{$symbol, 'errormsg'} = "HTTP session failed"; } next; } # Extract the stock information extract_stock_data(\%info, $response->content); } # Make sure that all symbols where found foreach my $symbol (@symbols) { next if exists $info{$symbol, 'name'}; $info{$symbol, 'success'} = 0; $info{$symbol, 'errormsg'} = "Symbol not found"; } return wantarray() ? %info : \%info; } # # Extracts the stock data from an HTML page. # # Returns a list of symbol structs. # sub extract_stock_data { my ($info, $content) = @_; # The stocks are in <table class="data"> # NOTE: TSX returns extra symbols who's names are similar to the symbols that # are going to be fetched. This method will exclude such symbols. my $parser = HTML::TableExtract->new(attribs => { class => 'data' } ); $parser->parse($content); my ($table) = $parser->tables; return unless defined $table; my $is_header = 1; foreach my $row ($table->rows) { # Skip the header if ($is_header) { $is_header = 0; next; } my $i = 0; # The symbol is in the format 'BCE-T' (T is the exchange) my $symbol = $row->[$i++]; if ($symbol =~ s/-(.)$//) { $info->{$symbol, 'exchange'} = $1; } # Parse the other fields $info->{$symbol, 'name'} = $row->[$i++]; $info->{$symbol, 'last'} = $row->[$i++]; # The change is in the format '-0.40 (-0.5%)' (positive numbers have no sign) if ($row->[$i++] =~ /(-?\d+\.\d+) \s+ \((-?\d+\.\d+)%\)/x) { $info->{$symbol, 'net'} = $1; $info->{$symbol, 'p_change'} = $2; } $info->{$symbol, 'volume'} = $row->[$i++]; # Cleanup $info->{$symbol, 'volume'} =~ s/,//g; $info->{$symbol, 'method'} = 'tsx'; $info->{$symbol, 'success'} = 1; } } 1; =head1 NAME Finance::Quote::TSX - Obtain quotes from the Toronto Stock Exchange. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("tsx","NT-T"); # Only query TSX. %stockinfo = $q->fetch("canada","NT"); # Failover to other sources OK. =head1 DESCRIPTION This module obtains information from the Toronto Stock Exchange through the page http://www.TMXmoney.com/. This module is not loaded by default on a Finance::Quote object. It's possible to load it explicity by placing "TSX" in the argument list to Finance::Quote->new(). This module provides both the "tsx" and "toronto" fetch methods. Please use the "canada" fetch method if you wish to have failover with other sources for Canadian stocks. Using the "tsx" method will guarantee that your information only comes from the Toronto Stock Exchange. =head1 LABELS RETURNED The following labels are returned by Finance::Quote::TSX: name, last, net, p_change, volume and exchange. This module returns less information (labels) than other sources but it's able to retrieve them faster because each HTTP request performed can return up to 10 stocks. Thus, if the labels provided by this module are sufficient for your application then you should give it a try. =head1 SEE ALSO Toronto Stock Exchange, http://www.TMXmoney.com/ =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Union.pm�������������������������������������������������������000644 �000765 �000024 �00000010763 12566055631 020511� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de> # Copyright (C) 2002, Rainer Dorsch <rainer.dorsch@informatik.uni-stuttgart.de> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> # # $Id: Union.pm,v 1.3 2005/03/20 01:44:13 hampton Exp $ package Finance::Quote::Union; require 5.005; use strict; use LWP::UserAgent; use HTTP::Request::Common; our $VERSION = '1.38'; # VERSION sub methods { return (unionfunds => \&unionfunds); } sub labels { return (unionfunds => [qw/exchange name date isodate price method/]); } # ======================================================================= # The unionfunds routine gets quotes of UNION funds (Union Invest) # On their website UNION provides a csv file in the format # label1,label2,... # name1,symbol1,buy1,bid1,... # name2,symbol2,buy2,bid2,... # ... # # This subroutine was written by Volker Stuerzl <volker.stuerzl@gmx.de> sub unionfunds { my $quoter = shift; my @funds = @_; return unless @funds; my $ua = $quoter->user_agent; my (%fundhash, @q, %info, $tempdate); # create hash of all funds requested foreach my $fund (@funds) { $fundhash{$fund} = 0; } # get csv data my $response = $ua->request(GET &unionurl); if ($response->is_success) { # Retrive date. This comes from the last line of the CSV file. foreach (split('\015?\012',$response->content)) { @q = split(/,/) or next; $tempdate=$q[0]; } # process csv data foreach (split('\015?\012',$response->content)) { # @q = $quoter->parse_csv($_) or next; @q = split(/,/) or next; next unless (defined $q[1]); if (exists $fundhash{$q[1]}) { $fundhash{$q[1]} = 1; $info{$q[1], "exchange"} = "UNION"; $info{$q[1], "name"} = $q[1]; $info{$q[1], "symbol"} = $q[1]; $info{$q[1], "price"} = $q[3]; $info{$q[1], "last"} = $q[3]; $quoter->store_date(\%info, $q[1], {eurodate => $tempdate}); $info{$q[1], "method"} = "unionfunds"; $info{$q[1], "currency"} = "EUR"; $info{$q[1], "success"} = 1; } } # check to make sure a value was returned for every fund requested foreach my $fund (keys %fundhash) { if ($fundhash{$fund} == 0) { $info{$fund, "success"} = 0; $info{$fund, "errormsg"} = "No data returned"; } } } else { foreach my $fund (@funds) { $info{$fund, "success"} = 0; $info{$fund, "errormsg"} = "HTTP error"; } } return wantarray() ? %info : \%info; } # UNION provides a csv file named preise.csv containing the prices of all # their funds for the most recent business day. sub unionurl { return "http://www.union-invest.de/preise.csv"; } 1; =head1 NAME Finance::Quote::Union - Obtain quotes from UNION (Zurich Financial Services Group). =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("unionfunds","975788"); =head1 DESCRIPTION This module obtains information about UNION managed funds. Information returned by this module is governed by UNION's terms and conditions. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::UNION: exchange, name, date, price, last. =head1 SEE ALSO UNION (Union Invest), http://www.union-invest.de/ =cut �������������Finance-Quote-1.38/lib/Finance/Quote/UserAgent.pm���������������������������������������������������000644 �000765 �000024 �00000006401 12566055631 021310� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # This module defines our own LWP::UserAgent, in particular it allows # user-defined headers to be set which will be automatically added to # new HTTP requests. This is particularly important if you wish to get # through authenticated proxies and the like. package Finance::Quote::UserAgent; require 5.005; use strict; use LWP::UserAgent; use HTTP::Headers; use vars qw/@ISA /; our $VERSION = '1.38'; # VERSION @ISA = qw/LWP::UserAgent/; # A very simple extension. When we generate a LWP::UserAgent object, # we add an extra field called finance_quote_headers which stores an # HTTP::Headers object. sub new { my $ua = LWP::UserAgent::new(@_); $ua->{finance_quote_headers} = HTTP::Headers->new(); return $ua; } # This returns the HTTP::Headers object, so the user can play with it. sub default_headers { my $this = shift; return $this->{finance_quote_headers}; } # Over-ride for the simple_request method. This sets the user-supplied # template headers if they have not already been set in the request. sub simple_request { my ($this, $request, @args) = @_; my $new_request = $this->_add_custom_headers($request); return $this->SUPER::simple_request($new_request,@args); } # Over-ride for the request method. This also sets the user-supplied # template headers if they have not already been set in the request. sub request { my ($this, $request, @args) = @_; my $new_request = $this->_add_custom_headers($request); return $this->SUPER::request($new_request,@args); } # _add_custom_headers is a private method which does the dirty work # of copying across headers and other fun things. # # We take the user-defined template, and then overlay the request over the # top of it. This should get us by in most situations. sub _add_custom_headers { my ($this, $request) = @_; my $header_template = $this->default_headers; my $new_request = $request->clone; # Modifying the original is rude. # Copy things that are in the template that we don't have # defined in the request. $header_template->scan(sub { $new_request->header($_[0],$_[1]) unless defined ($new_request->header($_[0])); }); return $new_request; } # If users wish to place their username and proxy password(!) into # the "http_proxy_auth_clear" environment variable, then we'll # read it out and automatically use it for proxy requests. sub env_proxy { my ($this, @args) = @_; if ($ENV{http_proxy_auth_clear}) { $this->default_headers->proxy_authorization_basic( split(/:/,$ENV{http_proxy_auth_clear})); } $this->SUPER::env_proxy(@_); } 1; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/USFedBonds.pm��������������������������������������������������000644 �000765 �000024 �00000014274 12566055631 021356� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # USFedBonds.pm # # 0.02 - Fix problem with looking up the correct file to select any redemption # date back to 1992/05 (furthest back that is currently offered by treasury) # Version 0.01 - First version of download for US treasury bond prices # Doesn't download prices with redemption dates before June 2005 !!!! # # Stephen Langenhoven # langenhoven@users.sourcesforge.net # 2005.07.21 package Finance::Quote::USFedBonds; require 5.004; use strict; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; use HTML::Parser; our $VERSION = '1.38'; # VERSION my $TREASURY_MAINURL = ("http://www.treasurydirect.gov/"); my $TREASURY_URL = ($TREASURY_MAINURL."indiv/tools/"); sub methods { return (usfedbonds => \&treasury); } sub labels { my @labels = qw/method source name symbol currency last date isodate nav price/; return (usfedbonds => \@labels); } sub treasury { my $quoter = shift; my @symbols = @_; my %info; # print "[debug]: ", @symbols, "\n"; return unless @symbols; my $ua = $quoter->user_agent; foreach my $symbol (@symbols) { #print STDERR "[debug]: Parsing:", $symbol, "\n"; my ($series, $issueyear, $issuemonth) = ( $symbol =~ m!^(\w{1,2})(\d{4})(\d{2})! ); if (!defined($series) || !defined($issueyear) || !defined($issuemonth)) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Parse error"; #printf STDERR "[debug]: Setting %s to 'Parse error'\n", $symbol; next; } my ($redemptionyear, $redemptionmonth) = ( $symbol =~ m!^.{8}(\d{4})(\d{2})! ); if (!defined($redemptionyear) || !defined($redemptionmonth)) { my ($a,$b,$c,$d,$e,$f,$g); ($a,$b,$c,$d,$redemptionmonth,$redemptionyear,$e,$f,$g) = localtime; $redemptionmonth = $redemptionmonth + 1; $redemptionmonth = sprintf("%02d", $redemptionmonth); $redemptionyear = $redemptionyear + 1900; #print "[debug]: (Setting redemption date)\n"; } if ($series eq "EE") { $series = "N" } #print "[debug]: (Series):", $series, "\n"; #print "[debug]: (Issue Year):", $issueyear, "\n"; #print "[debug]: (Issue Month):", $issuemonth, "\n"; #print "[debug]: (Redemption Year):", $redemptionyear, "\n"; #print "[debug]: (Redemption Month):", $redemptionmonth , "\n"; my $response; # not so easy...need to guess what the relavant date is... # file date will be <= the redemption date #start at the redemption year/month and move backwards at most 12 months... my $fileyear = $redemptionyear; my $filemonth = $redemptionmonth; for (my $looper=1; $looper <= 12; $looper++) { my $url = $TREASURY_URL . "sb" . $fileyear . $filemonth . ".asc"; #print "[debug]: ", $url, " ", $looper, "\n"; $response = $ua->request(GET $url); if ($response->is_success) { # Get list of monthly redemption values (my $redemptionvalues) = ( $response->content =~ m!${series}${redemptionyear}${redemptionmonth}${issueyear}(.+)! ); if (!defined($redemptionvalues)) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Date not found"; #printf STDERR "[debug]: Setting %s to 'date not found'\n", $symbol; last; } else { #print "[debug]: (Redemption Values) ", $redemptionvalues, "\n"; } # Extract into a usable array format (my @redemptionvalues) = ( $redemptionvalues =~ m!(.{6})!g ); #foreach my $redemptionvalue (@redemptionvalues) { # print "[debug]: (Redemption Value) ", $redemptionvalue, "\n"; #} # Hopefully pop out the one I really wanted!!! Note that $issuemonth # is 1-based while the array of values is 0-based. if ($redemptionvalues[$issuemonth - 1] eq " ") { #print "[debug]: NO PAY"; $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "No value found"; #printf STDERR "[debug]: Setting %s to 'no value found'\n", $symbol; last; } # # GENERAL FIELDS $info{$symbol, "method"} = "treasury"; #print "[debug]: (Month): ", $issuemonth, " Redemption Value ", $redemptionvalues[$issuemonth - 1]; $info{$symbol, "price"} = $redemptionvalues[$issuemonth - 1]/100; $info{$symbol, "last"} = $info{$symbol, "price"}; $info{$symbol, "symbol"} = $symbol; $info{$symbol, "currency"} = "USD"; $info{$symbol, "source"} = $TREASURY_MAINURL; $info{$symbol, "date"} = $redemptionmonth . "/01/" . $redemptionyear; $info{$symbol, "isodate"} = $redemptionyear . "-" . $redemptionmonth . "-01"; $info{$symbol, "version"} = "0.02"; $info{$symbol, "success"} = 1; last; } else { #Decrement the month, and pad if necessary... $filemonth = $filemonth - 1; if ( length($filemonth) < 2 ) { $filemonth = "0" . $filemonth; if ($filemonth < 1) { $filemonth = "12"; #Setting himself up for the year 100000 problem (short-sighted sod) $fileyear = $fileyear - 1; } } } } if (!defined($info{$symbol, "success"})) { $info{$symbol, "success"} = 0; $info{$symbol, "errormsg"} = "Error contacting URL"; } } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::USFedBonds Get US Federal Bond redemption values directly from the treasury at www.publicdebt.treas.gov/sav/savvalue.htm =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; # Don't know anything about failover yet... =head1 DESCRIPTION Access redemption values for US Federal Bonds from the treasury. Bonds should be identified in the following manner (as per www.piblicdebt.treas.gov/sav/savfrmat.htm): SERIES(1) : I/E/N/S ISSUEDATE(6) : YYYYMM SEPERATOR(1) : "." REDEMPTIONDATE(6) : YYYYMM e.g. E200101.200501 Would have liked to get data from this source (http://wwws.publicdebt.treas.gov/BC/SBCPrice), but I couldn't work out how to get the POST to pass the IssueDate, for some reason the <input> tags are messed on that page??? =head1 LABELS RETURNED ... =head1 SEE ALSO Treasury website - http://www.publicdebt.treas.gov/ Finance::Quote =head1 AUTHOR Stephen Langenhoven (langenhoven@users.sourceforge.net), see module ZA for further acknowledgements. =cut ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/VWD.pm���������������������������������������������������������000644 �000765 �000024 �00000017364 12566055631 020065� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -W # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de> # Copyright (C) 2003,2005,2006 Jörg Sommer <joerg@alea.gnuu.de> # Copyright (C) 2008 Martin Kompf (skaringa at users.sourceforge.net) # Copyright (C) 2014, Erik Colson <ecocode@cpan.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> # ============================================================= package Finance::Quote::VWD; require 5.005; use strict; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TreeBuilder; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION sub methods { return ( vwd => \&vwd ); } sub labels { return ( vwd => [ qw/currency date isodate name price last symbol time/ ] ); } # ======================================================================= # The vwd routine gets quotes of funds from the website of # vwd Vereinigte Wirtschaftsdienste GmbH. # # This subroutine was written by Volker Stuerzl <volker.stuerzl@gmx.de> # and adjusted to match the new vwd interface by Jörg Sommer # Trim leading and tailing whitespaces (also non-breakable whitespaces) sub trim { $_ = shift(); s/^\s*//; s/\s*$//; s/ //g; return $_; } # Trim leading and tailing whitespaces, leading + and tailing %, leading # and tailing ± (plus minus) and translate german separators into # english separators. Also removes the thousands separator in returned # values. sub trimtr { $_ = shift(); s/ //g; s/±//g; s/^\s*\+?//; s/\%?\s*$//; tr/,./.,/; s/,//g; return $_; } sub vwd { my $quoter = shift; my $ua = $quoter->user_agent(); my @funds = @_; return unless (@funds); my %info; # LOGGING - set to 1 to enable log file my $logging = 0; if ($logging) { open( LOG, ">>/tmp/vwd.log" ); } my $max_retry = 30; foreach my $fund (@funds) { $info{ $fund, "source" } = "VWD"; $info{ $fund, "success" } = 0; $info{ $fund, "errormsg" } = "Parse error"; my $request = "http://www.finanztreff.de/" . "kurse_einzelkurs_suche.htn?suchbegriff=" . $fund; if ($logging) { print LOG "Request='$request'\n"; } my $response = $ua->get($request); if ( $response->is_success ) { my $html = $response->decoded_content; my $tree = HTML::TreeBuilder->new; $tree->parse($html); # all other info below <div class=contentBox> my $content = $tree->look_down( "_tag", "div", "class", "contentBox" ); next if not $content; my $wpkurs = $content->look_down( "_tag", "div", "class", qr/wpKurs/ ); next if not $wpkurs; my $wpfacts = $content->look_down( "_tag", "div", "class", qr/wpFacts/ ); next if not $wpfacts; my $title = $wpkurs->find("h1"); $title->find("span")->delete_content; $info{ $fund, "name" } = $title->as_trimmed_text; my $te = new HTML::TableExtract( depth => 0, count => 0 ); $te->parse( $wpkurs->as_HTML ); my $table = $te->first_table_found; # class val contains data. hopefully order and quantity won't change my @wpfacts_vals = $wpfacts->look_down( "_tag", "span","class", qr/val/); my $datum = $wpfacts_vals[1]->as_trimmed_text; if ($logging) { print LOG "datum: $datum\n"; } if ( $datum =~ /([(0123]\d)\.([01]\d)\.(\d\d)/ ) { # datum contains date $quoter->store_date( \%info, $fund, { day => $1, month => $2, year => $3 } ); $info{ $fund, "time" } = $quoter->isoTime("18:00"); } elsif ( $datum =~ /([012]\d:[0-5]\d:[0-5]\d)/ ) { #datum contains time $quoter->store_date( \%info, $fund ); $info{ $fund, "time" } = $quoter->isoTime($1); } my $kurs = $table->cell( 0, 1 ); next if not $kurs; $info{ $fund, "price" } = $info{ $fund, "last" } = trimtr($kurs); # Currency (Währung) my $whrg = $tree->look_down( "_tag", "div", "class", "whrg" ); if ($whrg) { my $whrgtext = $whrg->as_trimmed_text(); $whrgtext =~ s/.*hrung: // ; $info{ $fund, "currency" } = $whrgtext; } else { $info{ $fund, "currency" } = "EUR"; } my $symbol = $wpfacts_vals[4]->as_trimmed_text; $info{ $fund, "symbol" } = $symbol; # fund ok $info{ $fund, "success" } = 1; $info{ $fund, "errormsg" } = ""; # log if ($logging) { print LOG join( ':', $info{ $fund, "name" }, $info{ $fund, "symbol" }, $info{ $fund, "date" }, $info{ $fund, "time" }, $info{ $fund, "price" }, $info{ $fund, "currency" } ); print LOG "\n"; } $tree->delete; } else { $info{ $fund, "success" } = 0; $info{ $fund, "errormsg" } = "HTTP error " . $response->status_line; if ($logging) { print LOG "ERROR $fund: " . $info{ $fund, "errormsg" } . "\n"; } if ( $response->code == 503 && $max_retry-- > 0 ) { # The server limits the number of request per time and client sleep 5; redo; } } } if ($logging) { close LOG; } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::VWD - Obtain quotes from vwd Vereinigte Wirtschaftsdienste GmbH. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %stockinfo = $q->fetch("vwd","847402"); =head1 DESCRIPTION This module obtains information from vwd Vereinigte Wirtschaftsdienste GmbH http://www.vwd.de/. Many european stocks and funds are available, but at the moment only funds are supported. Information returned by this module is governed by vwd's terms and conditions. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::vwd: currency date isodate name price last symbol time. =head1 SEE ALSO vwd Vereinigte Wirtschaftsdienste GmbH, http://www.vwd.de/ =cut ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Yahoo/���������������������������������������������������������000755 �000765 �000024 �00000000000 12566055631 020133� 5����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/YahooJSON.pm���������������������������������������������������000644 �000765 �000024 �00000015207 12566055631 021170� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # This module is based on the Finance::Quote::BSERO module # It was first called BOMSE but has been renamed to yahooJSON # since it gets a lot of quotes besides Indian # # The code has been modified by Abhijit K to # retrieve stock information from Yahoo Finance through json calls # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA package Finance::Quote::YahooJSON; require 5.005; use strict; use JSON qw( decode_json ); use vars qw($VERSION $YIND_URL_HEAD $YIND_URL_TAIL); use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; use Time::Piece; our $VERSION = '1.38'; # VERSION my $YIND_URL_HEAD = 'http://finance.yahoo.com/webservice/v1/symbols/'; my $YIND_URL_TAIL = '/quote?format=json'; my %suffix_to_currency = ( NS => 'INR', CL => 'INR', BO => 'INR', ); sub methods { return ( yahoo_json => \&yahoo_json, ); } { my @labels = qw/name last date isodate p_change open high low close volume currency method exchange type/; sub labels { return ( yahoo_json => \@labels, ); } } sub yahoo_json { my $quoter = shift; my @stocks = @_; my ( %info, $reply, $url, $te, $ts, $row, @cells, $ce ); my ( $my_date, $my_last, $my_p_change, $my_volume, $my_high, $my_low, $my_open ); my $ua = $quoter->user_agent(); foreach my $stocks (@stocks) { $url = $YIND_URL_HEAD . $stocks . $YIND_URL_TAIL; $reply = $ua->request( GET $url); my $code = $reply->code; my $desc = HTTP::Status::status_message($code); my $headers = $reply->headers_as_string; my $body = $reply->content; #Response variables available: #Response code: $code #Response description: $desc #HTTP Headers: $headers #Response body $body $info{ $stocks, "symbol" } = $stocks; if ( $code == 200 ) { #HTTP_Response succeeded - parse the data my $json_data = JSON::decode_json $body; #print ref($json_data); #print "size of hash: " . keys( $json_data ) . ".\n"; my $json_data_count = $json_data->{'list'}{'meta'}{'count'}; if ( $json_data_count != 1 ) { $info{ $stocks, "success" } = 0; $info{ $stocks, "errormsg" } = "Error retrieving quote for $stocks - no listing for this name found. Please check scrip name and the two letter extension (if any)"; } else { my $json_resources = $json_data->{'list'}{'resources'}[0]; my $json_response_type = $json_resources->{'resource'}{classname}; # TODO: Check if $json_response_type is "Quote" # before attempting anything else my $json_symbol = $json_resources->{'resource'}{'fields'}{'symbol_requested'} || $json_resources->{'resource'}{'fields'}{'symbol'}; my $json_volume = $json_resources->{'resource'}{'fields'}{'volume'}; my $json_timestamp = $json_resources->{'resource'}{'fields'}{'ts'}; my $json_name = $json_resources->{'resource'}{'fields'}{'name'}; my $json_type = $json_resources->{'resource'}{'fields'}{'type'}; my $json_price = $json_resources->{'resource'}{'fields'}{'price'}; my $json_utctime = $json_resources->{'resource'}{'fields'}{'utctime'}; my $json_currency = $json_resources->{'resource'}{'fields'}{'currency'}; $info{ $stocks, "success" } = 1; $info{ $stocks, "exchange" } = "Sourced from Yahoo Finance (as JSON)"; $info{ $stocks, "method" } = "yahoo_json"; $info{ $stocks, "name" } = $stocks . ' (' . $json_name . ')'; $info{ $stocks, "type" } = $json_type; $info{ $stocks, "last" } = $json_price; $info{ $stocks, "volume" } = $json_volume; $info{ $stocks, "isodate" } = ( $json_utctime =~ /dddd-dd-dd/ ); if (defined $json_currency and length $json_currency) { $info{ $stocks, "currency" } = $json_currency; } else { if ($stocks =~ /\.([^.]+)$/ ) { # find suffix if (exists $suffix_to_currency{$1}) { $info{ $stocks, "currency" } = $suffix_to_currency{$1}; } } } $my_date = localtime($json_timestamp)->strftime('%d.%m.%Y %T'); if ( $json_utctime =~ /(\d\d\d\d)-(\d\d)-(\d\d)/ ) { $my_date = $3.".".$2.".".$1."."; } $quoter->store_date( \%info, $stocks, { eurodate => $my_date } ); } } #HTTP request fail else { $info{ $stocks, "success" } = 0; $info{ $stocks, "errormsg" } = "Error retrieving quote for $stocks. Attempt to fetch the URL $url resulted in HTTP response $code ($desc)"; } } return wantarray() ? %info : \%info; return \%info; } 1; =head1 NAME Finance::Quote::YahooJSON - Obtain quotes from Yahoo Finance through JSON call =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("yahoo_json","SBIIN.NS"); =head1 DESCRIPTION This module fetches information from Yahoo as JSON This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "YahooJSON" in the argument list to Finance::Quote->new(). This module provides the "yahoo_json" fetch method. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::YahooJSON : name, last, isodate, volume, method, exchange. =head1 SEE ALSO =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/YahooYQL.pm����������������������������������������������������000644 �000765 �000024 �00000013755 12566055631 021072� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # This module is based on the Finance::Quote::YahooJSON. It uses # the Yahoo Query Language interface to retrieve quotes. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA package Finance::Quote::YahooYQL; require 5.005; use strict; use JSON qw( decode_json ); use vars qw($VERSION $YIND_URL_HEAD $YIND_URL_TAIL); require LWP::Protocol::https; use HTML::TableExtract; use Time::Piece; our $VERSION = '1.38'; # VERSION # TODO: for now we issue one request per quote. we should group requests as follows: # https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22%2C%22AAPL%22%2C%22GOOG%22%2C%22MSFT%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback= my $YIND_URL_HEAD = "https://query.yahooapis.com/v1/public/yql?q=". "select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22"; my $YIND_URL_TAIL = "%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; sub methods { return ( yahoo_yql => \&yahoo_yql, ); } { my @labels = qw/name last date isodate p_change open high low close volume currency method exchange type/; sub labels { return ( yahoo_yql => \@labels, ); } } sub yahoo_yql { my $quoter = shift; my @stocks = @_; my ( %info, $reply, $url, $te, $ts, $row, @cells, $ce ); my ( $my_date, $my_last, $my_p_change, $my_volume, $my_high, $my_low, $my_open ); my $ua = $quoter->user_agent(); $ua->ssl_opts( verify_hostname => 0 ); foreach my $stocks (@stocks) { $url = $YIND_URL_HEAD . $stocks . $YIND_URL_TAIL; $reply = $ua->get($url); my $code = $reply->code; my $desc = HTTP::Status::status_message($code); my $headers = $reply->headers_as_string; my $body = $reply->content; #Response variables available: #Response code: $code #Response description: $desc #HTTP Headers: $headers #Response body $body $info{ $stocks, "symbol" } = $stocks; if ( $code == 200 ) { #HTTP_Response succeeded - parse the data my $json_data = JSON::decode_json $body; #use DDP; p $json_data; my $json_data_count = $json_data->{'query'}{'count'}; if ( $json_data_count != 1 ) { $info{ $stocks, "success" } = 0; $info{ $stocks, "errormsg" } = "Error retrieving quote for $stocks - no listing for this name found.". " Please check scrip name and the two letter extension (if any)"; } else { my $json_resources = $json_data->{'query'}{'results'}{'quote'}; my $json_symbol = $json_resources->{'Symbol'}; my $json_volume = $json_resources->{'Volume'}; my $json_timestamp = $json_resources->{'LastTradeDate'}; my $json_name = $json_resources->{'Name'} || ''; my $json_price = $json_resources->{'LastTradePriceOnly'}; my $json_currency = $json_resources->{'Currency'}; my $json_exchange = $json_resources->{'StockExchange'}; $info{ $stocks, "success" } = 1; $info{ $stocks, "exchange" } = $json_exchange; $info{ $stocks, "method" } = "yahoo_yql"; $info{ $stocks, "name" } = $stocks . ' (' . $json_name . ')'; $info{ $stocks, "type" } = "Unsupported"; $info{ $stocks, "last" } = $json_price; $info{ $stocks, "volume" } = $json_volume; $info{ $stocks, "currency" } = $json_currency; if ( $json_timestamp && $json_timestamp =~ m|(\d+)/(\d+)/(\d+)| ) { $info{ $stocks, "isodate" } = join( '-', sprintf( '%02d', $2 ), sprintf( '%02d', $1 ), $3 ); $my_date = $info{ $stocks, "isodate" } . '.'; $my_date =~ s/\-/\./g; } $quoter->store_date( \%info, $stocks, { eurodate => $my_date, date => $my_date } ); } } #HTTP request fail else { $info{ $stocks, "success" } = 0; $info{ $stocks, "errormsg" } = "Error retrieving quote for $stocks. Attempt to fetch the URL $url resulted in HTTP response $code ($desc)"; } } return wantarray() ? %info : \%info; return \%info; } 1; =head1 NAME Finance::Quote::YahooYQL - Obtain quotes from Yahoo Finance through YQL call =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("yahoo_yql","AAPL"); =head1 DESCRIPTION This module fetches information from YQL as JSON This module is loaded by default on a Finance::Quote object. It's also possible to load it explicity by placing "YahooYQL" in the argument list to Finance::Quote->new(). This module provides the "yahoo_yql" fetch method. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::YahooYQL : name, last, isodate, volume, method, exchange, currency. =head1 SEE ALSO =cut �������������������Finance-Quote-1.38/lib/Finance/Quote/ZA.pm����������������������������������������������������������000644 �000765 �000024 �00000014367 12566055631 017737� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # ZA.pm # # 2013.05.01 # Changes to table references to correct for new sharenet web page layout # Timothy Boyle # 2008.02.18 # This version corrects the data downloaded by removing spaces and converting # cent values into Rand values – this ensures that the Price Editor in GNUCash # can import the data. The rest of the module and all the hard work # remains that of Stephen Langenhoven! # Rolf Endres # # 2005.07.19 # Download of South African (ZA) stocks from sharenet # This version based largely upon FinanceCanada.pm module [any errors # are my own of course ;-) ] # Stephen Langenhoven package Finance::Quote::ZA; require 5.004; use strict; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; our $VERSION = '1.38'; # VERSION my $SHARENET_MAINURL = ("http://www.sharenet.co.za/"); my $SHARENET_URL = ( $SHARENET_MAINURL . "jse/" ); sub methods { return ( za => \&sharenet ); } sub labels { my @labels = qw/method source name symbol currency last date isodate high low p_change/; return ( sharenet => \@labels ); } sub sharenet { my $quoter = shift; my @symbols = @_; my %info; my ( $te, $ts, $row ); my @rows; return unless @symbols; my $ua = $quoter->user_agent; foreach my $symbol (@symbols) { my $url = $SHARENET_URL . $symbol; # print "[debug]: ", $url, "\n"; my $response = $ua->request( GET $url); # print "[debug]: ", $response->content, "\n"; if ( !$response->is_success ) { $info{ $symbol, "success" } = 0; $info{ $symbol, "errormsg" } = "Error contacting URL"; next; } $te = new HTML::TableExtract(); $te->parse( $response->content ); # print "[debug]: (parsed HTML)",$te, "\n"; unless ( $te->first_table_found() ) { # print STDERR "no tables on this page\n"; $info{ $symbol, "success" } = 0; $info{ $symbol, "errormsg" } = "Parse error"; next; } # Debug to dump all tables in HTML... # print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== START OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n"; # # foreach $ts ($te->table_states) {; # # printf "\n \n \n \n[debug]: //// \\\\ //// \\\\ //// \\\\ //// \\\\ START OF TABLE %d,%d //// \\\\ //// \\\\ //// \\\\ //// \\\\ \n \n \n \n", # $ts->depth, $ts->count; # # foreach $row ($ts->rows) { # print "[debug]: ", $row->[0], " | ", $row->[1], " | ", $row->[2], " | ", $row->[3], "\n"; # } # } # # print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== END OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n"; # GENERAL FIELDS $info{ $symbol, "success" } = 1; $info{ $symbol, "method" } = "sharenet"; $info{ $symbol, "symbol" } = $symbol; $info{ $symbol, "currency" } = "ZAR"; $info{ $symbol, "source" } = $SHARENET_MAINURL; # NAME $ts = $te->table_state( 2, 1 ); # new table reference if ($ts) { (@rows) = $ts->rows; $info{ $symbol, "name" } = $rows[2][1]; } $info{ $symbol, "name" } =~ tr/ //d; # DATE AND CLOSING PRICE $ts = $te->table_state( 3, 0 ); # change table for new sharenet layout # print "[debug]: ", "got this far...", "\n"; # print "[debug]: (table_state)",$ts, "\n"; if ($ts) { (@rows) = $ts->rows; # date for last trade sale, high, low # sharenet only gives the day and month. We could use today's date, but this would not # be correct over weekends and public holidays (if it matters) my $date = substr( $rows[0][0], 16, 5 ) . "/"; #extract the day/month from the string and add / # this does the same as above in a more robust fashion # my $date = $rows[0][0]; # day/month plus time plus text # $date =~ s/[^0-9\/]//g; # remove most unwanted characters # $date =~ s/\d{4}$/\//; # remove last 4 digits = time and add / for the year my $year = ( localtime() )[5] + 1900; # extract year from system time vector $date = $date . $year; # add it to the day/month # print $date, "\n"; # we now have the date of the trades as dd/mm/yyyy $quoter->store_date( \%info, $symbol, { eurodate => $date } ) ; # gives eurodate and isodate symbols # $quoter->store_date(\%info, $symbol, {today => 1}); # could use today's date # last traded price $info{ $symbol, "last" } = $rows[2][1]; $info{ $symbol, "last" } =~ tr/ //d; $info{ $symbol, "last" } = 0.01 * $info{ $symbol, "last" }; # highest price today $info{ $symbol, "high" } = $rows[16][1]; $info{ $symbol, "high" } =~ tr/ //d; $info{ $symbol, "high" } = 0.01 * $info{ $symbol, "high" }; # lowest price today $info{ $symbol, "low" } = $rows[18][1]; $info{ $symbol, "low" } =~ tr/ //d; $info{ $symbol, "low" } = 0.01 * $info{ $symbol, "low" }; # percent change from previous close $info{ $symbol, "p_change" } = $rows[10][1]; $info{ $symbol, "p_change" } =~ tr/ //d; # actual net change from previous close $info{ $symbol, "net" } = $rows[8][1]; $info{ $symbol, "net" } =~ tr/ //d; } } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::ZA - Obtain South African stock and prices from www.sharenet.co.za =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; # Don't know anything about failover yet... =head1 DESCRIPTION This module obtains information about South African Stocks from www.sharenet.co.za. =head1 LABELS RETURNED Information available from sharenet may include the following labels: method source name symbol currency date nav last price =head1 SEE ALSO Sharenet website - http://www.sharenet.co.za/ Finance::Quote =cut �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/ZA_UnitTrusts.pm�����������������������������������������������000644 �000765 �000024 �00000010614 12566055631 022152� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # This file is based purely on Stephen Langenhoven's original ZA.pm file. # In order to use this file, rather than using a stock code/number, the user # must look for the unit trust ID number in the path of the Equinox site that # profiles the relevant unit trust (or closest unit trust to). For instance, # http://www.equinox.co.za/unittrusts/funds/funddetails.asp?fundid=16200 is the # profile of the "Liberty Resources Fund (C)". As a result, the fundid to be used # to query that fund is 16200. # Rolf Endres # 2009.10.09 package Finance::Quote::ZA_UnitTrusts; require 5.004; our $VERSION = '1.38'; # VERSION use strict; use LWP::UserAgent; use HTTP::Request::Common; use HTML::TableExtract; my $EQUINOX_MAINURL = ("http://www.equinox.co.za/"); my $EQUINOX_URL = ( $EQUINOX_MAINURL . "unittrusts/funds/funddetails.asp?fundid=" ); sub methods { return ( za_unittrusts => \&za_unittrusts ); } sub labels { my @labels = qw/method source name symbol currency last date isodate high low p_change/; return ( EQUINOX => \@labels ); } sub za_unittrusts { my $quoter = shift; my @symbols = @_; my %info; my ( $te, $ts, $row ); my @rows; return unless @symbols; my $ua = $quoter->user_agent; foreach my $symbol (@symbols) { my $url = $EQUINOX_URL . $symbol; #print "[debug]: ", $url, "\n"; my $response = $ua->request( GET $url); #print "[debug]: ", $response->content, "\n"; if ( !$response->is_success ) { $info{ $symbol, "success" } = 0; $info{ $symbol, "errormsg" } = "Error contacting URL"; next; } $te = new HTML::TableExtract(); $te->parse( $response->content ); #print "[debug]: (parsed HTML)",$te, "\n"; unless ( $te->first_table_found() ) { #print STDERR "no tables on this page\n"; $info{ $symbol, "success" } = 0; $info{ $symbol, "errormsg" } = "Parse error"; next; } # GENERAL FIELDS $info{ $symbol, "success" } = 1; $info{ $symbol, "method" } = "Equinox"; $info{ $symbol, "symbol" } = $symbol; $info{ $symbol, "currency" } = "ZAR"; $info{ $symbol, "source" } = $EQUINOX_MAINURL; # NAME $ts = $te->table_state( 0, 0 ); if ($ts) { (@rows) = $ts->rows; $info{ $symbol, "name" } = $rows[0][0]; $info{ $symbol, "name" } =~ s/Funds//; $info{ $symbol, "name" } =~ s/Performances//; $info{ $symbol, "name" } =~ s/Companies//; $info{ $symbol, "name" } =~ s/Summary//; $info{ $symbol, "name" } =~ s/Company//; $info{ $symbol, "name" } =~ s/Management//; $info{ $symbol, "name" } =~ s/A//; $info{ $symbol, "name" } =~ s/Z//; $info{ $symbol, "name" } =~ s/Risk//; $info{ $symbol, "name" } =~ s/Funds//; $info{ $symbol, "name" } =~ s/Sector//; $info{ $symbol, "name" } =~ s/Funds//; $info{ $symbol, "name" } =~ s/Domestic(.*)//s; $info{ $symbol, "name" } =~ s/Foreign(.*)//s; $info{ $symbol, "name" } =~ s/[^A-Za-z ()]//sg; $info{ $symbol, "name" } =~ s/ //sg; $info{ $symbol, "name" } =~ s/ //sg; $info{ $symbol, "name" } =~ s/ //sg; $info{ $symbol, "name" } =~ s/ //sg; } # LAST $ts = $te->table_state( 1, 0 ); if ($ts) { (@rows) = $ts->rows; $info{ $symbol, "last" } = $rows[0][1]; $info{ $symbol, "last" } =~ tr/R //d; } # DATE if ($ts) { (@rows) = $ts->rows; $quoter->store_date( \%info, $symbol, { eurodate => $rows[0][0] } ); } } return wantarray() ? %info : \%info; } 1; =head1 NAME Finance::Quote::ZA_UnitTrusts - Obtain South African unit trust prices from www.equinox.co.za =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; # Don't know anything about failover yet... =head1 DESCRIPTION This module obtains information about South African Unit Trusts from www.equinox.co.za. =head1 LABELS RETURNED Information available from Equinox may include the following labels: method source name symbol currency date nav last price =head1 SEE ALSO Equinox website - http://www.equinox.co.za/ Finance::Quote =cut ��������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Yahoo/Asia.pm��������������������������������������������������000644 �000765 �000024 �00000010312 12566055631 021343� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # Copyright (C) 2001, M.R.Muthu Kumar <m_muthukumar@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> package Finance::Quote::Yahoo::Asia; require 5.005; use strict; use HTTP::Request::Common; use LWP::UserAgent; use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/; use vars qw( $YAHOO_ASIA_URL); our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $YAHOO_ASIA_URL = ("http://download.finance.yahoo.com/d/quotes.csv"); sub methods {return (asia => \&yahoo_asia,yahoo_asia => \&yahoo_asia)}; { my @labels = (base_yahoo_labels(),"currency","method"); sub labels { return (asia => \@labels, yahoo_asia => \@labels); } } # ======================================================================= # yahoo_asia gets quotes for Asian (Except Japan) markets from Yahoo. sub yahoo_asia { my $quoter = shift; my @symbols = @_; return unless @symbols; # Nothing if no symbols. # This does all the hard work. my %info = yahoo_request($quoter,$YAHOO_ASIA_URL,\@symbols); foreach my $symbol (@symbols) { next unless $info{$symbol,"success"}; $info{$symbol,"method"} = "yahoo_asia"; } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Yahoo::Asia - Fetch quotes from Yahoo Asia =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = $q->fetch("asia","CREA.SI"); # Failover to other methods ok. %info = $q->fetch("yahoo_asia","CREA.SI"); # Use this module only. =head1 DESCRIPTION This module fetches information from Yahoo Asia. Symbols should be provided in the format "SYMBOL.EXCHANGE", where the exchange code is one of the following: SI - Singapore BO - Bombay JK - Jakarta HK - Hong Kong NS - India KS - Korea KL - Kuala Lumpur NZ - New Zealand SS - Shanghai SZ - Shenzhen TW - Taiwan TH - Thailand This module provides both the "asia" and "yahoo_asia" methods. The "asia" method should be used if failover methods are desirable. The "yahoo_asia" method should be used you desire to only fetch information from Yahoo Europe. Stocks are returned in the currency of the local exchange. You can use Finance::Quote's set_currency() feature to change the currency in which information is returned. This module is loaded by default by Finance::Quote, but can be loaded explicitly by specifying the parameter "Yahoo::Asia" to Finance::Quote->new(). Information obtained by this module may be covered by Yahoo's terms and conditions. See http://sg.finance.yahoo.com/ for more details. =head1 LABELS RETURNED This module returns all the standard labels (where available) provided by Yahoo. See Finance::Quote::Yahoo::Base for a list of these. The currency label is also returned. =head1 BUGS The currency of each exchange has not been thoroughly confirmed. If you find an exchange is returning in an incorrect exchange, please use the bug tool at http://sourceforge.net/projects/finance-quote to report it. =head1 SEE ALSO Yahoo Asia, http://sg.finance.yahoo.com/ Finance::Quote::Yahoo::Base =cut ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Yahoo/Australia.pm���������������������������������������������000644 �000765 �000024 �00000007545 12566055631 022431� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. package Finance::Quote::Yahoo::Australia; require 5.005; use strict; use HTTP::Request::Common; use LWP::UserAgent; use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/; use vars qw/ $YAHOO_AUSTRALIA_URL/; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $YAHOO_AUSTRALIA_URL = ("http://download.finance.yahoo.com/d/quotes.csv"); sub methods {return (australia => \&yahoo_australia, yahoo_australia => \&yahoo_australia)}; { my @labels = (base_yahoo_labels(),"currency","method","exchange"); sub labels { return (australia => \@labels, yahoo_australia => \@labels); } } sub yahoo_australia { my $quoter = shift; my @symbols = @_; return unless @symbols; # Nothing if no symbols. # Yahoo Australia needs AX. appended to indicate that we're # dealing with Australian stocks. # This does all the hard work. my %info = yahoo_request($quoter,$YAHOO_AUSTRALIA_URL,\@symbols,".AX"); foreach my $symbol (@symbols) { next unless $info{$symbol,"success"}; $info{$symbol,"exchange"} = "Australian Stock Exchange"; $info{$symbol,"method"} = "yahoo_australia"; } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Yahoo::Australia - Fetch Australian stock quotes via Yahoo. =head1 SYNOPSIS use Finance::Quote; my $q = Finance::Quote->new; my %info = $q->fetch("yahoo_australia","BHP"); # Use this module only. my %info = $q->fetch("australia","BHP"); # Failover with other methods. =head1 DESCRIPTION This module allows information to be fetched from Yahoo abouts stocks traded on the Australian Stock Exchange. Information about indexes (such as the All Ordinaries) are not available through this module, although if information is requested from the "australia" source then these will automatically failover to direct queries from the Australian Stock Exchange. This module is loaded by default on a Finance::Quote object, although it can be explicitly loaded by passing the argument "Yahoo::Australia" to Finance::Quote->new(). This module provides both the "australia" and "yahoo_australia" fetch methods. You should use the "australia" method if you wish to allow failovers to other sources, and "yahoo_australia" if you only want to obtain quotes from this module. Information obtained via this module is governed by Yahoo's terms and conditions, see http://au.finance.yahoo.com/ for more details. =head1 LABELS RETURNED This module returns all the standard labels (where available) provided by Yahoo, as well as the currency label. See Finance::Quote::Yahoo::Base for more information. =head1 SEE ALSO Yahoo Australia, http://au.finance.yahoo.com/ Finance::Quote::Yahoo::Base =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Yahoo/Base.pm��������������������������������������������������000644 �000765 �000024 �00000031306 12566055631 021346� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This package provides a base class for the various Yahoo services, # and is based upon code by Xose Manoel Ramos <xmanoel@bigfoot.com>. # Improvements based upon patches supplied by Peter Thatcher have # also been integrated. package Finance::Quote::Yahoo::Base; require 5.005; use strict; use LWP::UserAgent; use HTTP::Request::Common; use Exporter; use vars qw/ @FIELDS @FIELD_ENCODING $MAX_REQUEST_SIZE @ISA @EXPORT @EXPORT_OK/; @ISA = qw/Exporter/; @EXPORT = qw//; @EXPORT_OK = qw/yahoo_request base_yahoo_labels/; our $VERSION = '1.38'; # VERSION # This is the maximum number of stocks we'll batch into one operation. # If this gets too big (>50 or thereabouts) things will break because # some proxies and/or webservers cannot handle very large URLS. $MAX_REQUEST_SIZE = 40; # Yahoo uses encodes the desired fields as 1-2 character strings # in the URL. These are recorded below, along with their corresponding # field names. @FIELDS = qw/symbol name last date time net p_change volume bid ask close open day_range year_range eps pe div_date div div_yield cap ex_div avg_vol currency/; @FIELD_ENCODING = qw/s n l1 d1 t1 c1 p2 v b a p o m w e r r1 d y j1 q a2 c4/; # This returns a list of labels that are provided, so that code # that make use of this module can know what it's dealing with. # It also means that if we extend the code in the future to provide # more information, we simply need to change this in one spot. sub base_yahoo_labels { return (@FIELDS,"price","high","low"); } # Yahoo uses a suffix on the stock symbol to denote the exchange on # which the stock is traded. Use this suffix to map from the stock # symbol to the currency in which its prices are reported. my %currency_tags = ( # Country City/Exchange Name US => "USD", # USA AMEX, Nasdaq, NYSE A => "USD", # USA American Stock Exchange (ASE) B => "USD", # USA Boston Stock Exchange (BOS) N => "USD", # USA Nasdaq Stock Exchange (NAS) O => "USD", # USA NYSE Stock Exchange (NYS) OB => "USD", # USA OTC Bulletin Board PK => "USD", # USA Pink Sheets X => "USD", # USA US Options BA => "ARS", # Argentina Buenos Aires VI => "EUR", # Austria Vienna AX => "AUD", # Australia SA => "BRL", # Brazil Sao Paolo BR => "EUR", # Belgium Brussels TO => "CAD", # Canada Toronto V => "CAD", # Toronto Venture SN => "CLP", # Chile Santiago SS => "CNY", # China Shanghai SZ => "CNY", # Shenzhen CO => "DKK", # Denmark Copenhagen PA => "EUR", # France Paris BE => "EUR", # Germany Berlin BM => "EUR", # Bremen D => "EUR", # Dusseldorf F => "EUR", # Frankfurt H => "EUR", # Hamburg HA => "EUR", # Hanover MU => "EUR", # Munich SG => "EUR", # Stuttgart DE => "EUR", # XETRA HK => "HKD", # Hong Kong BO => "INR", # India Bombay CL => "INR", # Calcutta NS => "INR", # National Stock Exchange JK => "IDR", # Indonesia Jakarta I => "EUR", # Ireland Dublin TA => "ILS", # Israel Tel Aviv MI => "EUR", # Italy Milan KS => "KRW", # Korea Stock Exchange KQ => "KRW", # KOSDAQ KL => "MYR", # Malaysia Kuala Lampur MX => "MXP", # Mexico NZ => "NZD", # New Zealand AS => "EUR", # Netherlands Amsterdam OL => "NOK", # Norway Oslo LM => "PEN", # Peru Lima IN => "EUR", # Portugal Lisbon SI => "SGD", # Singapore BC => "EUR", # Spain Barcelona BI => "EUR", # Bilbao MF => "EUR", # Madrid Fixed Income MC => "EUR", # Madrid SE CATS MA => "EUR", # Madrid VA => "EUR", # Valence ST => "SEK", # Sweden Stockholm S => "CHF", # Switzerland Zurich TW => "TWD", # Taiwan Taiwan Stock Exchange TWO => "TWD", # OTC BK => "THB", # Thialand Thailand Stock Exchange TH => "THB", # ??? From Asia.pm, (in Thai Baht) L => "GBP", # United Kingdom London ); # yahoo_request (restricted function) # # This function expects a Finance::Quote object, a base URL to use, # a refernece to a list of symbols to lookup. If a fourth argument is # used then it will act as a suffix that needs to be appended to the stocks # in order to obtain the correct information. This function relies upon # the fact that the various Yahoo's all work the same way. sub yahoo_request { my $quoter = shift; my $base_url = shift; # Extract our original symbols. my @orig_symbols = @{shift()}; # The suffix is used to specify particular markets. my $suffix = shift || ""; my %info; my $ua = $quoter->user_agent; # Generate a suitable URL, now all it needs is the # ticker symbols. $base_url .= "?f=".join("",@FIELD_ENCODING)."&e=.csv&s="; while (my @symbols = splice(@orig_symbols,0,$MAX_REQUEST_SIZE)) { # By pushing an extra symbol on to our array, we can # be sure that everythng ends up with the correct suffix # in the join() below. push(@symbols,""); my $url = $base_url . join("$suffix+",@symbols); chop $url; # Chop off the final + print "DEBUG - GET: $url\n" if $ENV{"FQ_DEBUG"}; my $response = $ua->request(GET $url); return unless $response->is_success; # Okay, we have the data. Just stuff it in # the hash now. foreach (split('\015?\012',$response->content)) { my @q; @q = $quoter->parse_csv($_); my $symbol = $q[0]; my ($exchange) = $symbol =~ m/\.([A-Z]+)/; # Strip out suffixes. Mmmm, functions as lvalues. substr($symbol,-length($suffix),length($suffix)) = ""; # If we weren't using a two dimesonal # hash, we could do the following with # a hash-slice. Alas, we can't. This just # loads all the returned fields into our hash. for (my $i=0; $i < @FIELDS; $i++) { # Every now and then on a failed # retrieval, Yahoo will drop in an # undefined field next unless (defined $q[$i] && length $q[$i]); # remove trailing spaces added for # yahoo::europe quotes, since currency # is returned with a trailing white # space $q[$i] =~ s/\s*$// ; $info{$symbol,$FIELDS[$i]} = $q[$i]; } # Yahoo returns a line filled with N/A's if we # look up a non-existant symbol. AFAIK, the # date flag will /never/ be defined properly # unless we've looked up a real stock. Hence # we can use this to check if we've # successfully obtained the stock or not. if ($info{$symbol,"date"} eq "N/A") { $info{$symbol,"success"} = 0; $info{$symbol,"errormsg"} = "Stock lookup failed"; next; } else { $info{$symbol,"success"} = 1; } # Whack the dates. This will add an isodate, # and regularize the us date. $quoter->store_date(\%info, $symbol, {usdate => $info{$symbol,"date"}}); $info{$symbol,"price"} = $info{$symbol,"last"}; # Remove spurious percentage signs in p_change. $info{$symbol,"p_change"} =~ s/%//; # Extract the high and low values from the # day-range, if available if ($info{$symbol,"day_range"} =~ m{^"?\s*(\S+)\s*-\s*(\S+)"?$}) { $info{$symbol, "low"} = $1; $info{$symbol, "high"} = $2; } if (defined($info{$symbol,"time"})) { # uniform time output $info{$symbol,"time"} = $quoter->isoTime($info{$symbol,"time"}); } # "cap" from Yahoo::USA sometimes has "B" for # billions suffix, eg. from "F" Ford -- expand that # to a plain number for ease of use if (defined($info{$symbol,"cap"})) { $info{$symbol,"cap"} = $quoter->B_to_billions ($info{$symbol,"cap"}); } # Convert prices (when needed). E.G. Some London sources # return in pence. Yahoo denotes this with GBP vs GBp # We'd like them to return in pounds (divide by 100). if (defined($exchange)) { if ((($exchange eq "L") && (($info{$symbol,"currency"} eq "GBp") || #Assume GBX also quoted in pence; if not remove next line ($info{$symbol,"currency"} eq "GBX"))) || ($exchange eq "TA")) { foreach my $field ($quoter->default_currency_fields) { next unless ($info{$symbol,$field}); $info{$symbol,$field} = $quoter->scale_field($info{$symbol,$field},0.01); } } ; if (($exchange eq "L") && defined($info{$symbol,"year_range"})) { # if a year range is returned for exchange=L if ($info{$symbol,"year_range"}=~ m/([\d\.]+)\s*-\s*([\d\.]+)/) { # take year low and high my ($year_low,$year_high) = ($1,$2) ; if ($info{$symbol,"close"} <= $year_low) { # sometimes year_range was expressed in .01 GBp $info{$symbol,"year_range"} = ($year_low/100)." - ".($year_high/100) ; } } } # Other exchanges here as needed. } if (defined($info{$symbol,"currency"})) { # Having converted London prices to GBP above we # make upper-case and turn GBX to GBP. $info{$symbol,"currency"} =~ tr/a-z/A-Z/; # yahoo started to return GBX instead of GBP # somewhere arround 9 oct 2008. $info{$symbol,"currency"} =~ s/GBX/GBP/; # printf "Currency %s specified by Yahoo\n", $info{$symbol,"currency"}; } else { # Determine the currency from the exchange name. # Symbols without an exchange are in USD. Symbols # starting with a hat are always indexes, so they # don't have a currency. if (defined($exchange)) { $info{$symbol,"currency"} = $currency_tags{$exchange}; # print "Set currency based on exchange $exchange\n"; } elsif (substr($symbol,0,1) ne "^") { # print "No exchange, not an index, set currency to USD\n"; $info{$symbol,"currency"} = "USD"; } $info{$symbol,"currency_set_by_fq"} = 1; } } # End of processing each stock line. } # End of lookup loop. # Return undef's rather than N/As. This makes things more suitable # for insertion into databases, etc. Also remove silly HTML that # Yahoo inserts to put in little Euro symbols and stuff. It's # pretty stupid to have HTML tags in a CSV file in the first # place, don't you think? foreach my $key (keys %info) { #if (!defined $info{$key}) { # printf STDERR "\n"; # printf STDERR "$key points to undefined value\n"; # printf STDERR "\n"; #} if (defined $info{$key}) { $info{$key} =~ s/<[^>]*>//g; $info{$key} =~ s/ .*$//; undef $info{$key} if ($info{$key} eq "N/A"); } } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Yahoo::Base - Common functions for fetching Yahoo info. =head1 SYNOPSIS Base functions for use by the Finance::Quote::Yahoo::* modules. =head1 DESCRIPTION This module is not called directly, rather it provides a set of base functions which other Yahoo-related modules can use. If you're thinking of writing a module to fetch specific information from Yahoo, then you might wish to look through the source code for this module. =head1 LABELS RETURNED Most Yahoo functions will return a standard set of labels. These include (where available): symbol, name, last, date, time, net, p_change, volume, bid, ask close, open, day_range, year_range, eps, pe, div_date, div, div_yield, cap, ex_div, avg_vol. =head1 SEE ALSO Finance::Quote::Yahoo::Australia, Finance::Quote::Yahoo::USA, Finance::Quote::Yahoo::Europe. =cut ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Yahoo/Brasil.pm������������������������������������������������000644 �000765 �000024 �00000006632 12566055631 021714� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. package Finance::Quote::Yahoo::Brasil; require 5.005; use strict; use HTTP::Request::Common; use LWP::UserAgent; use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/; use vars qw/ $YAHOO_BRASIL_URL/; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $YAHOO_BRASIL_URL = ("http://download.finance.yahoo.com/d/quotes.csv"); sub methods {return (brasil => \&yahoo_brasil, yahoo_brasil => \&yahoo_brasil)}; { my @labels = (base_yahoo_labels()); sub labels { return (brasil => \@labels, yahoo_brasil => \@labels); } } sub yahoo_brasil { my $quoter = shift; my @symbols = @_; return unless @symbols; # Nothing if no symbols. # This does all the hard work. my %info = yahoo_request($quoter,$YAHOO_BRASIL_URL,\@symbols,".SA"); foreach my $symbol (@symbols) { next unless $info{$symbol,"success"}; $info{$symbol,"exchange"} = "Bovespa"; $info{$symbol,"method"} = "yahoo_brasil"; } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Yahoo::Brasil - Fetch Brasiln stock quotes via Yahoo. =head1 SYNOPSIS use Finance::Quote; my $q = Finance::Quote->new; my %info = $q->fetch("yahoo_brasil","BHP"); # Use this module only. my %info = $q->fetch("brasil","BHP"); # Failover with other methods. =head1 DESCRIPTION This module allows information to be fetched from Yahoo abouts stocks traded on the Brasilian Stock Exchange. This module is loaded by default on a Finance::Quote object, although it can be explicitly loaded by passing the argument "Yahoo::Brasil" to Finance::Quote->new(). This module provides both the "brasil" and "yahoo_brasil" fetch methods. You should use the "brasil" method if you wish to allow failovers to other sources, and "yahoo_brasil" if you only want to obtain quotes from this module. Information obtained via this module is governed by Yahoo's terms and conditions, see http://br.finance.yahoo.com/ for more details. =head1 LABELS RETURNED This module returns all the standard labels (where available) provided by Yahoo, as well as the currency label. See Finance::Quote::Yahoo::Base for more information. =head1 SEE ALSO Yahoo Brasil, http://br.finance.yahoo.com/ Finance::Quote::Yahoo::Base =cut ������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Yahoo/Europe.pm������������������������������������������������000644 �000765 �000024 �00000012136 12566055631 021733� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> package Finance::Quote::Yahoo::Europe; require 5.005; use strict; use HTTP::Request::Common; use LWP::UserAgent; use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/; use vars qw( $YAHOO_EUROPE_URL); our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $YAHOO_EUROPE_URL = ("http://download.finance.yahoo.com/d/quotes.csv"); # Yahoo Europe switched date and time. sending t1d1 or d1t1 # returns the same : Time followed by date. This is a short # bug fix until yahoo changes back again. # # Yahoo Europe doens't return values for r1 (div_date) and q (ex_div) # Another solution might be to change Base.pm FIELDS labels to this # string + div_date and ex_div. Code would be nicier, but this will # need more testing for other yahoo modules and can be done later. our @YH_EUROPE_FIELDS = qw/symbol name last net p_change volume bid ask close open day_range year_range eps pe div div_yield cap avg_vol currency time date ex_div div_date/; our @YH_FIELD_ENCODING = qw/s n l1 c1 p2 v b a p o m w e r d y j1 a2 c4 t1 d1 q r1/; sub methods {return (europe => \&yahoo_europe,yahoo_europe => \&yahoo_europe)}; { my @labels = (base_yahoo_labels(),"currency","method"); sub labels { return (europe => \@labels, yahoo_europe => \@labels); } } # ======================================================================= # yahoo_europe gets quotes for European markets from Yahoo. sub yahoo_europe { my $quoter = shift; my @symbols = @_; return unless @symbols; # Nothing if no symbols. # localise the Base.FIELDS array. Perl restores the array at # the end of this sub. local @Finance::Quote::Yahoo::Base::FIELDS = @YH_EUROPE_FIELDS ; local @Finance::Quote::Yahoo::Base::FIELD_ENCODING = @YH_FIELD_ENCODING ; # This does all the hard work. my %info = yahoo_request($quoter,$YAHOO_EUROPE_URL,\@symbols); foreach my $symbol (@symbols) { next unless $info{$symbol,"success"}; $info{$symbol,"method"} = "yahoo_europe"; } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Yahoo::Europe - Fetch quotes from Yahoo Europe =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = $q->fetch("europe","UG.PA"); # Failover to other methods ok. %info = $q->fetch("yahoo_europe","UG.PA"); # Use this module only. =head1 DESCRIPTION This module fetches information from Yahoo Europe. Symbols should be provided in the format "SYMBOL.EXCHANGE", where the exchange code is one of the following: PA - Paris BC - Barcelona BE - Berlin BI - Bilbao BR - Brussels CO - Copenhagen D - Dusseldorf F - Frankfurt H - Hamburg HA - Hanover L - London MA - Madrid MC - Madrid (M.C.) MI - Milan MU - Munich O - Oslo ST - Stockholm SG - Stuttgart VA - Valence VI - Vienna DE - Xetra (was FX) This module provides both the "europe" and "yahoo_europe" methods. The "europe" method should be used if failover methods are desirable. The "yahoo_europe" method should be used you desire to only fetch information from Yahoo Europe. This module is loaded by default by Finance::Quote, but can be loaded explicitly by specifying the parameter "Yahoo::Europe" to Finance::Quote->new(). Information obtained by this module may be covered by Yahoo's terms and conditions. See http://finance.uk.yahoo.com/ for more details. =head1 SPECIFIC NOTES ON CERTAIN SYMBOLS Starting in November 2010, the Yahoo site didn't respond to ^DJI symbol retrieval. Use ^DJI.US instead. =head1 LABELS RETURNED This module returns all the standard labels (where available) provided by Yahoo. See Finance::Quote::Yahoo::Base for a list of these. The currency label is also returned. Note however that div_date and ex_div have been removed by yahoo europe site =head1 SEE ALSO Yahoo Europe, http://finance.uk.yahoo.com/ Finance::Quote::Yahoo::Base =cut ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Yahoo/NZ.pm����������������������������������������������������000644 �000765 �000024 �00000006557 12566055631 021035� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # This code gratefully based on the existing # Finance::Quote::Yahoo::Australia package Finance::Quote::Yahoo::NZ; require 5.005; use strict; use HTTP::Request::Common; use LWP::UserAgent; use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/; use vars qw/$YAHOO_NZ_URL/; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $YAHOO_NZ_URL = ("http://download.finance.yahoo.com/d/quotes.csv"); sub methods {return (nz => \&yahoo_nz, yahoo_nz => \&yahoo_nz)}; { my @labels = (base_yahoo_labels(),"currency","method","exchange"); sub labels { return (nz => \@labels, yahoo_nz => \@labels); } } sub yahoo_nz { my $quoter = shift; my @symbols = @_; return unless @symbols; # Nothing if no symbols. # Yahoo nz needs NZ appended to indicate that we're # dealing with nz stocks. # This does all the hard work. my %info = yahoo_request($quoter,$YAHOO_NZ_URL,\@symbols,".NZ"); foreach my $symbol (@symbols) { next unless $info{$symbol,"success"}; $info{$symbol,"exchange"} = "New Zealand Stock Exchange"; $info{$symbol,"method"} = "yahoo_nz"; } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Yahoo::NZ - Fetch nzn stock quotes via Yahoo. =head1 SYNOPSIS use Finance::Quote; my $q = Finance::Quote->new; my %info = $q->fetch("yahoo_nz","DPC"); # Use this module only. my %info = $q->fetch("nz","DPC"); # Failover with other methods. =head1 DESCRIPTION This module allows information to be fetched from Yahoo about stocks traded on the New Zealand Stock Exchange. Information about indexes is not available through this module. This module is loaded by default on a Finance::Quote object, although it can be explicitly loaded by passing the argument "Yahoo::nz" to Finance::Quote->new(). This module provides only the "yahoo_nz" fetch methods. The author (stephen@vital.org.nz) will write a module to access the NZX site if asked nicely. Information obtained via this module is governed by Yahoo's terms and conditions, see http://au.finance.yahoo.com/ for more details. =head1 LABELS RETURNED This module returns all the standard labels (where available) provided by Yahoo, as well as the currency label. See Finance::Quote::Yahoo::Base for more information. =head1 SEE ALSO Yahoo Australia, http://au.finance.yahoo.com/ Finance::Quote::Yahoo::Base =cut �������������������������������������������������������������������������������������������������������������������������������������������������Finance-Quote-1.38/lib/Finance/Quote/Yahoo/USA.pm���������������������������������������������������000644 �000765 �000024 �00000011641 12566055631 021124� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky <djpadz@padz.net> # Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org> # Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com> # Copyright (C) 2000, Paul Fenwick <pjf@cpan.org> # Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA # # # This code derived from Padzensky's work on package Finance::YahooQuote, # but extends its capabilites to encompas a greater number of data sources. # # This code was developed as part of GnuCash <http://www.gnucash.org/> package Finance::Quote::Yahoo::USA; require 5.005; use strict; use HTTP::Request::Common; use LWP::UserAgent; use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/; use vars qw/$YAHOO_URL/; our $VERSION = '1.38'; # VERSION # URLs of where to obtain information. $YAHOO_URL = ("http://download.finance.yahoo.com/d/quotes.csv"); sub methods {return (canada => \&yahoo, usa => \&yahoo, yahoo => \&yahoo, nyse => \&yahoo, nasdaq => \&yahoo, vanguard => \&yahoo, fidelity => \&yahoo_fidelity)}; { my @labels = (base_yahoo_labels(),"currency", "method"); sub labels { return (canada => \@labels, usa => \@labels, yahoo => \@labels, nyse => \@labels, nasdaq => \@labels, vanguard => \@labels, fidelity => [@labels,'yield','nav']); } } # This is a special wrapper to provide information compatible with # the primary Fidelity function of Finance::Quote. It does a good # job of a failover. { # Really this list should be common for both the Fidelity.pm # and this module. We could possibly get away with checking # for /XX$/, but I don't know how reliable that is. my %yield_funds = (FDRXX => 1, FDTXX => 1, FGMXX => 1, FRTXX => 1, SPRXX => 1, SPAXX => 1, FDLXX => 1, FGRXX => 1); sub yahoo_fidelity { my $quoter = shift; my @symbols = @_; return unless @symbols; # Call the normal yahoo function (defined later in this # file). my %info = yahoo($quoter,@symbols); foreach my $symbol (@symbols) { next unless $info{$symbol,"success"}; if ($yield_funds{$symbol}) { $info{$symbol,"yield"}=$info{$symbol,"price"}; } else { $info{$symbol,"nav"} = $info{$symbol,"price"}; } } return wantarray ? %info : \%info; } } sub yahoo { my $quoter = shift; my @symbols = @_; return unless @symbols; # Nothing if no symbols. # This does all the hard work. my %info = yahoo_request($quoter,$YAHOO_URL,\@symbols); foreach my $symbol (@symbols) { next unless $info{$symbol,"success"}; $info{$symbol,"method"} = "yahoo"; } return %info if wantarray; return \%info; } 1; =head1 NAME Finance::Quote::Yahoo::USA - Obtain information about stocks and funds in the USA and Canada. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = $q->fetch("usa","SGI"); =head1 DESCRIPTION This method provides access to financial information from a number of exhcanges in the United States and Canada. The following methods are available: canada usa yahoo nyse nasdaq vanguard fidelity These methods all use the same information source, and hence can be considered somewhat interchangable. However, the method "yahoo" should be passed to fetch if you wish to obtain information from any source that Yahoo tracks. This method is loaded by default by Finance::Quote, although it can be explicitly loaded by passing the argument "Yahoo::USA" to Finance::Quote->new(). Information returned by this module may be subject to Yahoo's terms and conditions. See http://finance.yahoo.com/ for more information. =head1 LABELS RETURNED This module returns all the standard labels that Yahoo provides, as well as the currency label. See Finance::Quote::Yahoo::Base for more information. =head1 BUGS Yahoo does not make a distinction between the various exchanges in the United States and Canada. For example, it is possible to request a stock using the "NYSE" method and still obtain data even if that stock does not exist on the NYSE but exists on a different exchange. =head1 SEE ALSO Yahoo Finance, http://finance.yahoo.com/ Finance::Quote::Yahoo::Base =cut �����������������������������������������������������������������������������������������������Finance-Quote-1.38/htdocs/developer.html������������������������������������������������������������000644 �000765 �000024 �00000013126 12566055631 020010� 0����������������������������������������������������������������������������������������������������ustar�00ec������������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<html> <head> <title>Finance::Quote Homepage
Finance :: Quote
Button Home
Button Documentation
Button Discussion Groups and Mailing Lists
Button Download
Button SourceForge Page

Important note

After the release 1.13 we took two important decisions :

  • Current evolution of development tools made us port the repository to Git
  • Since Finance::Quote releases are available through CPAN we also decided to make full use of the tools available on the Cpan platform.
  • Please note that we are in the early stages of the implementation of these changes. Some of the work has already been done, but some data has still to be ported or disgarded. Please take a look at this page for further evolution. Reports will also be posted to the developers mailing-list. We sincerely apologize for any inconvenience these changes may cause.

    Bug-tracking

    Bugs can be submitted and tracked via Cpan's RT bug-tracking system. Before submitting a bug, please make sure that someone else has not submitted the bug already.

    Bugs posted on the Sourceforge's bug tracking system after 1.7.2007 are ported to RT. Older bug reports (prior to release 1.13) will certainly be disgarded. Don't use the Sourceforge's BTS for new bug reports as those won't be checked.

    Patches

    Patches must be submitted as file attachments to bug reports (see above).

    Patches submitted on Sourceforge's site after 1.7.2007 will eventually be lookad at. Older patches will certainly be disgarded.

    For reference, we'll mention the link to the SourceForge's patch manager. Don't use it for new patches as those won't be checked.

    Before submitting a patch please make sure that you have the most up-to-date version of Finance::Quote, and that nobody has submitted an equivalent patch already.

    Mailing-lists

    A developer's mailing list exists for those people who are using or developing Finance::Quote. For more information, see our Discussion Groups and Mailing Lists page.

    Git

    Anonymous access to the development branch is available for those wishing to use the development branch of Finance::Quote. Details on anonymous Git access can be found here.

    CVS

    The development repository has been ported to Git. Please note that while CVS is still available, updates starting at version 1.13 won't be sent to the CVS repository.

    Details on anonymous CVS access can be found here.

    Hacker's Guide

    The Hacker's Guide contains information on how to extend Finance::Quote to make use of your own custom information sources. The most recent version of the Hacker's Guide can be found here.


    Finance-Quote-1.38/htdocs/discussion.html000644 000765 000024 00000006031 12566055631 020203 0ustar00ecstaff000000 000000 Finance::Quote Discussion
    Finance :: Quote
    Button Home
    Button Documentation
    Button Bugs, Patches and Development
    Button Download
    Button SourceForge Page

    Mailing lists.

    There are two Finance::Quote mailing lists. finance-quote-devel is a high-volume list for developers and technical issues. finance-quote-news is a low-volume list for announcements only. Archives of the mailing lists, and details on how to join, can be found here.

    Discussion Forums.

    Public discussion forums, including a general discussion and help forum, can be found here.


    Finance-Quote-1.38/htdocs/documentation.html000644 000765 000024 00000006064 12566055631 020677 0ustar00ecstaff000000 000000 Finance::Quote Homepage
    Finance :: Quote
    Button Home
    Button Discussion Groups and Mailing Lists
    Button Bugs, Patches and Development
    Button Download
    Button SourceForge Page

    Documentation

    Manual pages, the hacker's guide, and other documentation for Finance::Quote is available through SourceForge's documentation manager. It can be found here.

    The Perl Journal

    The Perl Journal published an article about Finance::Quote in issue number 19. The final draft of this article is also available via this website. It comes in three parts (text-only):

    HTML-ised versions of the article are being worked upon. However, the plain-text versions are very readable.


    Finance-Quote-1.38/htdocs/download.html000644 000765 000024 00000010054 12566055631 017627 0ustar00ecstaff000000 000000 Finance::Quote Downloads
    Finance :: Quote
    Button Home
    Button Documentation
    Button Discussion Groups and Mailing Lists
    Button Bugs, Patches and Development
    Button SourceForge Page

    Latest Release

    The latest tarball release of Finance::Quote can be downloaded here.

    Previous Releases

    The previous tarball release of Finance::Quote (version 1.13) can be downloaded here.

    Finance::Quote (version 1.12) can be downloaded here.

    Finance::Quote (version 1.11) can be downloaded here.

    Finance::Quote (version 1.10) can be downloaded here.

    Finance::Quote (version 1.08) can be downloaded here. The Debian package of Finance::Quote 1.08 is here.

    All Finance::Quote versions can be found here

    CVS Tree

    Those people who want to play with the development branch of Finance::Quote can should consult the directions regarding anonymous CVS access here. Alternatively, you can download a nightly tarball of the CVS tree.


    Finance-Quote-1.38/htdocs/Images/000755 000765 000024 00000000000 12566055631 016337 5ustar00ecstaff000000 000000 Finance-Quote-1.38/htdocs/index.html000644 000765 000024 00000020337 12566055631 017134 0ustar00ecstaff000000 000000 Finance::Quote Homepage
    Finance :: Quote
    Button Documentation
    Button Discussion Groups and Mailing Lists
    Button Bugs, Patches and Development
    Button Download
    Button SourceForge Page

    Welcome to the Finance::Quote webpage.

    Finance::Quote is a perl module which can be used to obtain information from a variety of sources, including markets in Australia, USA, Canada, Europe, and a number of managed funds.

    The latest version of Finance::Quote is (soon to be) available via CPAN, and is currently available on our download page.

    News

    2015-Aug-22 Release 1.38 is available both from CPAN and Sourceforge. This release encloses several website module updates.

    2015-Feb-02 Release 1.37 is available both from CPAN and Sourceforge. This removes some dependencies to obtain better compatibility.

    2014-Feb-17 Release 1.20 is available both from CPAN and Sourceforge. This autoinstalls Date::Calc if needed.

    2014-Feb-16 Release 1.19 is available both from CPAN and Sourceforge. It solves Yahoo quote retrieval changes and adds 2 new modules.

    2012-Sep-30 Release 1.18 is available both from CPAN and Sourveforge. It solves most used module errors.

    2009-Oct-5 Release 1.17 is available both from CPAN and Sourceforge.

    2009-Apr-13 Release 1.16 is available both from CPAN and Sourceforge. Thanks to Bradley Dean a currency_lookup function is available. As usual, some modules were patched due to site modifications.

    2008-Oct-26 Release 1.15 is available both from CPAN and Sourceforge. It is a bugfix release. Upgrade is strongly recommended.

    2008-Oct-15 Release 1.14 considered as the latest stable release has been uploaded to CPAN and Sourceforge.

    2008-Sep-21 The development of Finance::Quote is undergoing a lifting. More information is available on the developer page

    2006-Jul-10 Finance::Quote 1.12 has been released. The new version includes support for new information sources, including Bourso and LeRevenu in France, and the Helsinki stock exchange in Finland. This release also fixes the problem with retrieving quotes with the DWS and VWD modules. The full set of release notes are available here. You can download this release from our download page.

    2006-Jan-11 Finance::Quote 1.11 has been released. The new version includes support for new information sources, including Sharenet (South Africa) and U.S. Federal Bonds. This release also fixes the problem with retrieving currency quotes from Yahoo Finance. The full set of release notes are available here. You can download this release from our download page.

    2005-Jul-04 Finance::Quote 1.10 has been released. The new version includes support for new information sources, including the New Zealand stock exchange, TD Waterhouse Canada Efunds, the Swedish Bank, the U.S. Govt. Thrift Savings Plan, and several Yahoo sources. The full set of release notes are available here. You can download this release from our download page.

    2005-Jun-30 Finance::Quote 1.09 has been released. The new version includes support for new information sources, including the New Zealand stock exchange, TD Waterhouse Canada Efunds, the Swedish Bank, the U.S. Govt. Thrift Savings Plan, and several Yahoo sources. The full set of release notes are available here. You can download this release from our download page.

    2003-Jul-04 Finance::Quote 1.08 was released.

    2002-Apr-18 Finance::Quote 1.07 was released.

    2001-Jun-26 Finance::Quote 1.06 has been released. The new version includes support for many new information sources, including Dutch stocks and indexes, UK unit trusts, managed funds from TD waterhouse, and quote lookups from fool.com. The full set of release notes are available here. You can download this release from our download page.

    2001-Feb-23 Finance::Quote 1.05 has been released. This version fixes some bugs that people have been experiencing with currency conversion, and also provides easier methods for users to load their custom modules at run-time. The new release is available from our download page.

    2000-Nov-05 Finance::Quote 1.04 has been released. This version fixes a bug whereby the 40th symbol of a large Yahoo lookup would fail. It also removes some of the headaches people have been experiencing with the test suite. For the adventurous, support for proxy authentication has also been added. See the FAQ for more details.

    2000-Oct-30 An article on Finance::Quote was featured in The Perl Journal, issue number 19. The article is a good introduction to the module and well worth reading if you are beginning to work with Finance::Quote. The draft is available from our documentation page.

    Older news items and SourceForge page.


    Finance-Quote-1.38/htdocs/Stylesheet.css000644 000765 000024 00000001540 12566055631 017775 0ustar00ecstaff000000 000000 ul { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; font-style: normal; color: #FFFFFF} p,li { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; font-style: normal; color: #FFFFFF} h1 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 18pt; font-style: normal; color: #FFFFFF; background-position: center} h2 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 16pt; font-style: normal; color: #FFFFFF} h3 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14pt; font-style: normal; color: #FFFFFF} .footer { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; color: #FFFFFF} a { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; color: #AAAA77} h2[class^=new], p[class^=new], li[class^=new] { color : red }Finance-Quote-1.38/htdocs/tpj/000755 000765 000024 00000000000 12566055631 015727 5ustar00ecstaff000000 000000 Finance-Quote-1.38/htdocs/tpj/finance-quote-example000644 000765 000024 00000003601 12566055631 022041 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Example stock-ticker program. Can look up stocks from multiple # markets and return the results in local currency. # # Revision: 1.1 use strict; use Finance::Quote; my $CURRENCY = "AUD"; # Set preferred currency here, or empty string for # no conversion. # The stocks array contains a set of array-references. Each reference # has the market as the first element, and a set of stocks thereafter. my @STOCKS = ([qw/australia CML ITE BHP/], [qw/usa MSFT RHAT LNUX/] ); # These define the format. The first item in each pair is the label, # the second is the printf-style formatting, the third is the width # of the field (used in printing headers). my @labels = (["name", "%12s", 15], ["date", "%11s", 11], ["time", "%10s", 11], ["last", "%8.2f", 8], ["high", "%8.2f", 8], ["low", "%8.2f", 8], ["close", "%8.2f", 8], ["volume","%10d", 10]); my $REFRESH = 120; # Seconds between refresh. # --- END CONFIG SECTION --- my $quoter = Finance::Quote->new(); my $clear = `clear`; # So we can clear the screen. # Build our header. my $header = "\t\t\t\tSTOCK REPORT" .($CURRENCY ? " ($CURRENCY)" : "") ."\n\n"; foreach my $tuple (@labels) { my ($name, undef, $width) = @$tuple; $header .= sprintf("%".$width."s",uc($name)); } $header .= "\n".("-"x79)."\n"; # Header is all built. Looks beautiful. $quoter->set_currency($CURRENCY) if $CURRENCY; # Set default currency. for (;;) { # For ever. print $clear,$header; foreach my $stockset (@STOCKS) { my ($exchange, @symbols) = @$stockset; my %info = $quoter->fetch($exchange,@symbols); foreach my $symbol (@symbols) { next unless $info{$symbol,"success"}; # Skip failures. foreach my $tuple (@labels) { my ($label,$format) = @$tuple; printf $format,$info{$symbol,$label}; } print "\n"; } } sleep($REFRESH); } __END__ Finance-Quote-1.38/htdocs/tpj/finance-quote-sidebar000644 000765 000024 00000002374 12566055631 022025 0ustar00ecstaff000000 000000 SIDEBAR - Standard Finance::Quote Labels ======================================== Not all exchanges or stocks have all these labels available, but the range of information that Finance::Quote can return includes: name Company or Mutual Fund Name last Last Price high Highest trade today low Lowest trade today date Last Trade Date (MM/DD/YY format) time Last Trade Time net Net Change p_change Percent Change from previous day's close volume Volume avg_vol Average Daily Vol bid Bid ask Ask close Previous Close open Today's Open day_range Day's Range year_range 52-Week Range eps Earnings per Share pe P/E Ratio div_date Dividend Pay Date div Dividend per Share div_yield Dividend Yield cap Market Capitalization ex_div Ex-Dividend Date. nav Net Asset Value yield Yield (usually 30 day avg) exchange The exchange the information was obtained from. success Did the stock successfully return information? (true/false) errormsg If success is false, this field may contain the reason why. method The module (as could be passed to fetch) which found this information. Finance-Quote-1.38/htdocs/tpj/finance-quote.txt000644 000765 000024 00000041216 12566055631 021232 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # Run perl over this document to get Jon Orwant preferred formatting. :) # use strict; my $code_indent = -1; # -1 means we're not in code. while () { (/(\t*)#!\/\S+\/perl/) and $code_indent = length($1); $code_indent = -1 if (/__END__/); if ($code_indent >= 0) { s/^\t{0,$code_indent}//; } else { s/^\t*//; } print; } __END__ Finance::Quote (for TPJ) Paul Fenwick , Aug 2000 $Revision: 1.1 $ Introduction ============ If you have a reason to watch the world's financial markets, and you know a little about perl, then you may find that the Finance::Quote package comes in handy. I personally use it to remind myself that I should never buy shares, as I have a good history of losing money on the stock exchange. However, you can use Finance::Quote to help track those tasty stock options you've been offered, or even to help you build dynamic artwork driven by fluctuations in the world markets[1]. Finance::Quote is a perl module that makes accessing financial information easy. You can look up stocks and shares, managed funds, currency rates, and all this from a variety of countries and markets. It's even easy to add your own specialised sources if you find something the module does not do. [1] Yes, this actually exists and uses Finance::Quote to help drive the back-end. See . History (or credit where credit is due). ======================================== Finance::Quote started as the Quote module which was distributed as part of Gnucash . This module (simple called "Quote") was a modified version of Finance::YahooQuote written by DJ Padzensky . Linas Vepstas and Yannick LE NY had added extra sources for GnuCash, at which point I asked if anyone had any objections to me breaking it off into a separate project with a range of uses outside of GnuCash. Since that time, many people have contributed to Finance::Quote, including Xose Manoel Ramos (for inheritable Yahoo! methods), Brent Neal, Keith Refson, and Volker Stuerzl for writing pluggable modules, and Peter Thatcher, Jacinta Richardson and Steven Murdoch for various bugfixes and improvements. Ben Hemming was kind enough to save the world from my poor web-design skills and supply a web-page look-and-feel. Legality (Or what can I use it for?) ==================================== When discussing Finance::Quote, one question which often arises is "how legal is all this"? Finance::Quote obtains quotes of various organisations who make this information available via the web. Actually fetching the data is not illegal[2], web-browsers do it all the time, and Finance::Quote is just a rather specialised web-browser. The main problems occur with what you do with that data. Each organisation has a different set of restrictions and conditions pertaining to the data you obtain from them. The most common restriction is that forbidding redistribution, although some of them are as odd to limit the number of copies you can have in memory at any one time! The Finance::Quote manual pages provide some pointers as to where these licenses can be found, and it would be wise to check those licenses if you wish to be in safe legal waters. In general, obtaining information and displaying it or processing it into some useful form for personal use should be okay -- that's what your web-browser does. Obtaining the information and re-badging it as your own is probably a no-no. If in doubt, check with your lawyer. [2] Although there have been a couple of court cases where "deep linking" into web-page has been cast into legal shadow. Terminology =========== Before we begin, it's worth taking the time to explain a few pieces of terminology that may be otherwise a little confusing. For simplicity, a stock, mutual fund, index, or other parcel of information which can be fetched using Finance::Quote we will refer to as a "stock". All stocks have a unique identifier or "symbol" which we can use to look them up, and an "exchange" (or locality) in which they exist. For example, VA Linux Systems have the symbol "LNUX" on the Nasdaq exchange. Symbols are traditionally all upper-case, but there exist some symbols (such as the pseudo-symbols used in the TIAA-CREF module) that are mixed case. Finance::Quote essentially provides a way of taking a list of symbols for a given exchange, and returning information about those symbols. Each bit of information has a "label" (such as volume, close, high, low, etc), which identifies what that information is. All making sense? Good. Let's do something fun then. Using Finance::Quote ==================== The Basics ---------- I'll demonstrate the usage of Finance::Quote by way of a useful example, which will be expanded upon as we go. For starters, let's just say you're interested in stocks from a single market, and wish to print their current value and volume traded. #!/usr/bin/perl -w use strict; use Finance::Quote; @ARGV >= 2 or die "Usage: $0 exchange symbol symbol symbol ...\n"; my $exchange = shift; # Where do we fetch our stocks from. my @symbols = @ARGV; # Which stocks are we interested in. my $quoter = Finance::Quote->new; # Create the F::Q object. $quoter->timeout(30); # Cancel fetch operation if it takes # longer than 30 seconds. # Grab our information and place it into %info. my %info = $quoter->fetch($exchange,@symbols); foreach my $stock (@symbols) { unless ($info{$stock,"success"}) { warn "Lookup of $stock failed - ".$info{$stock,"errormsg"}. "\n"; next; } print "$stock:\t\t", "Volume: ",$info{$stock,"volume"},"\t", "Price: " ,$info{$stock,"price"},"\n"; } __END__ If our script was called "showstocks", and you were interested in Australian supermarkets, you could call it like this: showstocks australia CML WOW This will provide you with information about Coles-Myer and Woolworths. Alternatively, if you were interested some US technology stocks, you could try this: showstocks usa LNUX RHAT MSFT IBM which will provide you with information about VA Linux Systems, Red Hat, Microsoft and International Business Machines. This script demonstrates a number of capabilities of Finance::Quote. In particular: * Finance::Quote is object-oriented, and a Finance::Quote object can be generated using Finance::Quote->new(). * The fetch() method can be used for retrieving information. This method is very powerful, and will be explained in some depth later in this article. * The fetch method returns a two-dimensional hash. This is the topic of our next section. The Return Hash --------------- Finance::Quote's most useful function, fetch(), returns a two-dimensional hash. This contains a variety of information about the stocks you requested, including volume, price, highs and lows, percentage changes, and other information. Each key in the hash has two parts: $info{$symbol,$label} The symbol is the symbol that you've requested. In the examples above, "RHAT" and "LNUX" are examples of symbols. The label refers to a specific type of information about that stock, such as "volume", "price", "close", "p_change" or "name". Labels are always lower-case. There exists some very special labels that you should be aware of. The label "success" is used to indicate if the information could be successfully retrieved. If the value of the success label for a given stock is false, then no useful information could be gained about that symbol at this time. If a failure did occur, the reason for that failure will be in the label "errormsg". The special label "price" is used to indicate the worth or value of the given stock. This varies a little depending upon what you're fetching information on. For stocks, it's usually the last price the stock was traded at. For some investments, it's the current yield (a percentage per-annum). For currencies it's the exchange rate, and for indexes it's the last value of that index (in points). The reason the price label is important is that it allows for applications to track the movement of information without having to know if we're dealing with a stock or a managed fund or an indicator -- the price label will provide us with the information that we (usually) want. This is particularly useful for things such as stock-tickers, allowing them to track things other than just stocks. For applications that care about the details, there are a wide range of labels that can be returned. These include the highest and lowest prices for the day, dividend yields and dates, the time and date that the information is current for, the volume traded, the name of the stock, and many others. The standard labels are listed in the side-bar. It's important to remember that the information fetched by Finance::Quote is usually delayed, and so is often 30 minutes or more behind what's really happening. If you're doing currency conversions as well, then the currency conversion rate may also be delayed. You can use the labels "date" and "time" to determine when the data was valid -- it's not unknown for some sources to provide data that is a week old or more. Advanced Usage ============== Now, the basics of Finance::Quote are pretty simple. You create yourself a F::Q object, you ask it for some information, and you get that information back in a hash. For most applications, this is all you really need. However, Finance::Quote provides a wide range of extra features to help make your life easier. Currency Conversion ------------------- Finance::Quote has the ability to look up currency rates, and can even automatically convert foreign stocks into local currencies. Let's say that you live in Australia, but you have some stocks in the USA. You may be interested in knowing the value of those stocks in Australian dollars, which have more meaning to you than US dollars. Here's how to do it: #!/usr/bin/perl -w use strict; use Finance::Quote; my $market = shift; my @stocks = @ARGV; my $quoter = Finance::Quote->new(); $quoter->set_currency("AUD"); # Aussie dollars, thanks. my %info = $quoter->fetch($market,@stocks); # Print the info here. __END__ The set_currency() method asks Finance::Quote to convert all values into the given currency before returning them to you. Finance::Quote knows which things it can convert (like prices and ranges), and which things it cannot (like percentage changes and volumes). It's even smart enough to (usually) not touch indexes and other abstract indicators that don't have currencies attached to them. Be aware that set_currency() can significantly increase the time of a query, as currency lookup information has to be fetched as well as the stock information. It's also possible to fetch currency exchange rates directly. This is done using the currency() method. Eg: my $exchange_rate = $quoter->currency("USD","AUD"); print "1 US dollar is $exchange_rate Australian dollars.\n"; The currency() method can also do clever things like take a prefix to the FROM currency. Hence the following script is a quick'n'dirty command-line utility to convert between currencies: #!/usr/bin/perl -w use strict; use Finance::Quote; # Command-line currency conversion. die "Usage: $0 FROM TO\n" unless defined($ARGV[1]); my $quoter = Finance::Quote->new(); my $exchange_rate = $quoter->currency($ARGV[0],$ARGV[1]); die "Don't know how to convert $ARGV[0] to $ARGV[1]\n" unless $exchange_rate; print "$ARGV[0] -> $ARGV[1] = $exchange_rate\n"; __END__ If this script were to be called "currency-lookup", you could show the going rate between Australian and American dollars like this: currency-lookup AUD USD If you wanted to know how much 95 Australian Dollars were in French Francs, you could do this: currency-lookup "95 AUD" FRF Fail-over Support and Custom Modules ----------------------------------- Finance::Quote provides automatic fail-over support if you specify the market that you're interested in and not the actual source from which you want to fetch it. This means that if you use "nasdaq" instead of "yahoo" as your source, Finance::Quote will automatically try all sources of nasdaq data in case the first one failed. Fail-over support is on by default in all newly create Finance::Quote objects. Fail-over support can increase the time of a query, especially if you're searching for a non-existent stock. It's possible to (un)set fail-over support explicitly like this: $quoter->failover(0); # Disable failover support. Likewise, when you create your Finance::Quote object, it's possible to state which modules you'd like to be able to fetch information from. For example: my $quoter = Finance::Quote->new("Yahoo::Australia"); will only use the Finance::Quote::Yahoo::Australia module for queries. This is particularly useful if you have a deal with a particular information supplier, or otherwise wish to restrict where Finance::Quote can search for information. Specifying modules to load at creation time can also let you load custom modules that are not part of the standard Finance::Quote distribution. my $quoter = Finance::Quote->new("-defaults", "MyBank"); Here we would load the Finance::Quote::MyBank module, as well as all the default modules that are packaged with Finance::Quote. Note that "-defaults" as an argument to new is only magical when passed as the first argument (although in the future it MAY be legal to pass it anywhere in the arguments list). If you're interested in writing your own modules for Finance::Quote, then you should read the Hacker's Guide that comes with Finance::Quote, or which can be found in the Finance::Quote documentation manager at . Required Labels --------------- Fail-over support is a wonderful thing -- the source you're fetching data from may have fallen over and you might never have to worry. Unfortunately, not all sources provide all the information you're looking for, and having bits of information disappear when you're used to them being there can be a little surprising. Rather than having to worry about your fail-over sources not providing the information you're looking for, Finance::Quote allows you to define a list of things that are important to you, using the require_labels() method. Say that your program relies upon the labels price, date, high, low and volume. You can express this to your Finance::Quote object like so: $quoter->require_labels(qw/price date high low volume/); If you now use the $quoter->fetch() to obtain information, you can be guaranteed that those fields will be available if they apply to what you've requested. This means you can use fail-over methods safe in the knowledge that the information you actually care about will not disappear. Tricks with the user agent -------------------------- If you've ever used LWP::UserAgent before, then you'll be pleased to know that you can customise the underlying LWP::UserAgent object in Finance::Quote. For example: $quoter->user_agent->agent("MyTicker/0.1"); will cause the $quoter object to identify itself as "MyTicker/0.1" in HTTP sessions. Likewise, this lets you set your proxy explicitly: $quoter->user_agent->proxy('http',$MY_PROXY); Note that the UserAgent that Finance::Quote uses automatically respects proxy environment variables (such as "http_proxy") at creation time. For more information on what you can and cannot do here, check out the documentation for LWP::UserAgent. Rolling your own Finance::Quote module ======================================= As well as using the standard Finance::Quote modules, it's also possible to write your own module that you can ask Finance::Quote to use. Writing such a module can be a tricky task, and is beyond the scope of this article. The Finance::Quote package does come with its own Hacker's Guide explaining how to write a Finance::Quote module. This can be found with other documentation at Example program -- Stock ticker =============================== We'll finish off with an example of a useful, real-life program. In this case it's a text-based stock ticker. The code is intentionally simple to display the features of Finance::Quote, but it provides a very clear and useful display for stocks that you may have your eye on. [Example supplied in separate file] Finance-Quote-1.38/htdocs/Images/bg.jpg000644 000765 000024 00000011127 12566055631 017433 0ustar00ecstaff000000 000000 JFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" 5R`i=u7#n"+(D4sç4! s[Z̊JrkXYFfF27@gfv-˼tC[?x %4 ȩ$hAhL̾~RҪlB=$a@U^zE&yi044Qw18e:DFYEAaYmxT" --233[(+=rځ2 ^ !!1A" 2Bʮ1 <&`VK$J`Zr/j0[0$qn*m!)PZ[LEu9fC>M)%EPƅU?^TnQßdFW>4-f Q`IM׺SMM èUB!lzqn#^._QHٕm: OZMZ*EQ~^J_m6+T\0+̴j)CE#9OSmug k-fw7e8وev$,eG1Xk%UIV)*gՠɔY=ݖ$E&ْi$MSm4mBJ+ڥDIQ=SD*NS */p$IFiraC%!1AQaq?!HkU%Wa?4Gs5BScy^.QFqݮ$=sf3x*#SS.Xt<| Lb`ȵ;Opz +o,t1hbjSGXsRL1ˀ?vؕI N/`XnVW#KcǹygNF߳2 F۹SS;F1S/PLvsLQXq=ຈuT=Dj\J. -dK_re$BnL\kf%]Ea|g+ ޣ&4KFs VK ]ES5,CȕlSȗ:<|%0#P[5[]=, x:5uF"#|\Cq ]^&y'11NW0p~\`b]C*ܻ+6h]kLqG.`hu22۞2`q[JJ 7p GERp8R6Br,3< =DǨm~e:#Y(mZe!\;1]^b,p.Qh=ia^V^{kj # =UX8C4li{`Eۋ+ Ǒ4S<+˙C 0)lT!`?I !1A0?\UhBhʢ 0hL}_b{}q+Q>M1ɿO%!1AQaq?) j_16\N:0^߸]Z:0Tٚ5pFt x? 3 AY, Q(ٰJK/kiE0!̹hn^״pj W 72?j/gHrxI(apPsG#+r<1{4ޤF"*6V/6}t' syٙ=ݬY(.@3eSGͣ# ! =Xo`Ah߼ z<$Qw]qAM٬zw["  3TAE#qՈGo4ǂ) Zqqv ݉tyZ5¾?8ۜnU=;K cUjTY '=E%X=UR}fV>z l?[ o̓7*'((ie#Q6L)?ΩpG!pEV1CXppf GJbΙ/6њ9[M$߹6N k0TsE-yFq,`P ֩bC6#vb+~Q.i<TΩĶV+Ft3 0׎".XVdxݛ,F=!F ;F@4a Kk+xK`e:++,{e )k+@&E(Q" CXiP+1w?0_ˌ"m*kl:)vt6QN,O,J.,nʡ^ij/.m 06Q5uhD`*89spYr)p&\/gLJ}jXH0H]!V:-QbqNs .0J1Ҁ3_6R/lӈao~@F\WtO+ ܡtY}}c Ҁ½S%nz5gbTFxV:vwO [f,֥#B/Q.6cAZ=Q.[ 4`!^\BUN`j*|~ n^m5[xVOw k^-zdLLS mZ(DxK9E߈|CI|WXqu}"YYH*-P ٕ:{A ^b1#mLq4!w_V^ۏvW&ũpZEnʷQ=2V}ePCb.|{T"{LBjyoCR—qR fͿYUܱ-*w"p9` !j4jK"SK}.ŹFzGrU@_C z mP)շ.Ecܮ Z}bv#$X^WB&N 0.^}f9b9X p!0ܱn" ,"䈰eusH9[)պ@e)5+h5Bх밄J*yYP mq A4ȴ0JIi`U{BT(..*r3(T@!Ph樭\#4xf/%s&+I>`a-_Q`d,L#n*QX9l8ew{.CW9%= MVA/l*J5Z)h㧬 7p5]aPn2!Et;F[)xKTGKyblZBkCATIWV<{}=˥EH4IQϒBf@'{ bUJ ̪i~z\e5_nW|Abi[CN}}ߴgFB*߈Z.$fʪb7QxS3bMqypdx\egcC//cB8Bcccccccccccccccccccccccccccccccccccccccccccccccccc-,"5!1A"Qaq2#BR$3brC!1 ?Smj<13 fLL"*opX1ݬ LHj6fhYfϊ qFϊuu6$cVyA%~`f ¸;Vbi,R5 IR0h\kQx拺՗PRt#";J 9//jwAg `P-mv=0 B@2$LӥU! 1W~3@M'sJ@?6sZ5CH`cPQm\#$aG xڋ69,dwC`HuNd8čΐ@M䞀F4MV,p@(C2+8]f )TeA&ʫp&.1D11AF}l"'r"0c';OA/P2` 2yVke.!h$ݿp0x[ҩd 抟z]vą[.\-P`uЈoTï'ܖk$I5 m=K ɪF#W55Y ǹ:Ayah0'q qedu -'Gg?aYr 6$9MWR].4(;j!U85Chx?k̰UNI.hG#UJE|(p3MdNJ0ә* #H*ld!'HոڬH'pg$%H,d5&3iUƘ;4[\I5&pm HXި O} HrOIس- $̚\j:tm&4b C3{ռ/'Y\ޮ`@T MWMam{BҦl`UmTՕ9W0~N ISV_B`"ȟд 9ZϜ;PP#mLjFx!h1'nu;*n nx$ y ˴-l f1ƒ>N&ă3A$?Ny8*ih榁IkgpE%Zcbj]GRxdRI{V9 v;P0m ] zY"B /,; 8M- 0Wqr\Kchvlm\!:IZDk,`z Nu6jB^&D.!6"@t;V`AEZV#3S&@SD;) ڠZ9ިζKq ΓI. mN-8YN{CXsCN1l4m$|w(DY4 ni TKj~EV+BTmkթ?z U4\ޡJf!V%t̓ĈO'.Np0QKvI:T4[J3M@l),jFM: EDdj{wRx  HT]CڹZ^g{nn K (Y`-1c@dޔ+2f2(.ZoMjvpIV~I)fg d6S1 tu o[,GP1AsHX8}Bӊ Y@’f[cިTޘa@ &1>,'ibaM6☰V'|R ڀ:Li8'xaC |՝a b+#jxA4i`+U?IH,@ 4.HK}38t[Vw50p=cKc(u-X T9$ad?zFreE*jHXs52ŖtRYO{df~ҩ(cQ";&ju]7ͲpNkKth,r8J@ȁޘ(Dާw@ί= E j>65v&+r6`Ft]6 ';T^;@q]mmv Eǃ8J]$5;ezvX]MM@$GR.PMGH$s>hi 9@7rbkI74j$׺@ &@J~7njbY v@A  [Kq*.^7*Kt[p(;*\>tb|oH1 l&v" dj5$hZUZB&;Kq,s6ΧU*e Vղ (s3d,  ~Ns#&84SS@\:bDNP?Dڝ|V"'`yTH$N@EIz㮠"sPZDy6A@Ϛ FzH܍ڏ 1ϊ WXsV'QҎFgS}Fnv)L 2|b1qlg5/oQ c bB>(,حǒʯfwqV5Z (W: 3OސeR Lq&w*v^^0)IT繠-i$KaYQ -6ڐu?P}RFMцP8hp{WQRI$1=%EEd@u\cwP.{L?5狥 nx5e~5pHb:̓R{`WGo]8QE ;A\W6(uf^0޺ ha q9;UJ6hkZI?&QA V֡@8##R4LuYkw}#yY-o])x=N}-ʷ=?L%[P"QK5зH>(w&yo)&ڜ0kA*AgSop*=*v4޶1AF$@w?cT=ŏS Էg8H3*.=$$eĈ '`&6E%<7Emd5~ߦ` ZUa H BC0AOb\. !% 3M}5 1'5Z.Y[`##s^_w#P0 ikCl,oj]*w&mtev*G$p*\5e;M 0IިM[yfR el!usނZյ*4 WbwIl5@%Ac[(m/M=ꖡSmjw {ژhbuÓMB1ёD0kXyZIPNwO0'NdFG4ePI%P8CX *^G,C)sZBX14`~*u$QC9[J0 \{NT˃,YHGUQFE}Pd8"VE9a;xEuW^0ԍmF5He#fAΪGPfI+)Ћ֫=}쒀@*lgT d,Gٿ Uwu#C)~ +-[(\TMA2Dbi-2lA[WCZY2cSkY"=BhV_2\`&PR-fv_pr M(,Yl5kr<⻑n`MqoQ!a8A%Uv׬`zgp!Uq\, fTݨrL(29]oL( F!,IޠyjqNT*>M4"5C#14@ւ09r 7):gk`ic0b]@E! 3*]5pHmr@nPKLhJ2҂tdus@T K+='m^F+;ŧ*Ēvx`A4܉ w"p&Gz( vڪnXF+Ԧ0jJ'"Ƶy[5c,1'Ҧ2T{*k@mn1TJ ~#5`ůˤA7wj 'T@;=UKS1ڀG'vpE+LwKog_RKSO4pr0Go^fzl+K2-';vS^ w}:no-ɨzw?E2I*j7*5k Z:!/|W=mRY'⺘.3{+PT0~{W iX +sF$ѷ-5E}Y"nX)cUD'j Ѱ)t>|P c Sm1D fx3@D1f'j]JJT`80h8+DF 蹤 |T5Pge7uh#@\p8"J6AI #ArJć4vXLFMMP;NI?oZAS;M-?WuqڂDQЎEfLTܟa i6r`G޵'H؝/59&)5ipNLfQ#4m O=G-ɼu:da>€}r&HUvL %Hzk`+30`Uql2F{j[Fz{o21 0JK+6-3QlBfl^`0bn8W2U;'sT1f&2rrSu R_ i銢7}9mSD5J.U-!K$H` 8Ȧ@"2kZYCa@"N7c? SP|( F P qPVa RABөw Ff2 L/5mEc0vw}bF\7NCn`Qw[ 8-8*(WI0x>h*:J…, H#4z+PD|fc"w(+v[I#+[ 1S2>⋎1I:]`fUY+ڔjhE#hS (, }9Lam[kNb f@JO#K`H!q'y3Ojtsgq'z`YdQɩt\G5AE2%l,$JtoԢ0tpW(H&6A"m144  (m/v.}KJOڶ=%DL 85&T,zosBUV"r#4 4TH zSQ3;bQs@!qކT''DysCv'aTAD\emG&g+{zZqXIhPdsLrQ( Ep4 &#xLoA݄aAK,ېFf=n;^ mUk0Ҋ&T]rIJ"$ KG@ }[GjANOJ'Q3 Ӝ)?ȈvwUBkQj{Օ.i;NJ#)9$h4hElE t{ QuP$Q vڃaG5_Qί= (d0* `x<EA F` 9oe:nmGI\f$T̙q j( (22 X:B#W5Q[sm84Lj`ec8̘@Ha?aB;ж4 P z(2f:4mc04m@V?PVH#z*To0/:q'RB"E9 C x+Ãl3rr4  jQR`{ (ݺH3QqeCppUژݛd[:_qS`1ޠ@"6IMNwd0y3`CGOGiH4(FڎiC*)r iQ@6#V4yC% =& iu(̡ <NvUUAc(0,3#T4~ &>GqX}M1%ڥ9(GmDMeTLdCAZVA-BLTQbu"3I{9}v)Slv/Jr)#L-8]RHI.#ā(5B``| qUT&@0jAΨ$f› 0$FsH&uV\})nBp H&̤H;ԂaIo޶:<KZ3ȫ<7F$}'E@=$.8YҬ[pc5b" bNfެq\ޢܻI(sr7=L(ic궊䚣e5`6><{Zي d6v#$>ǑVbQ&{e`7j d cjtV`ADDf4qEcqB 2jP 2|w#9$xʧQ6'EIԻΐS.* TeLֶ`8`RzA"t:qHP*Fj^ݲ RܖRD}(2b }+.l)d@#&rKt"ȦЗ0mV^PU@{D-n{(%qZb8"WKrN(ZcpDj3+] LgT28(w~s &驭ʪvpdF@.)԰wcUCCCJκ*.o⾾lcU+ZSG320k䐐̼wkxgU|* ߶ܼĤLD>񯟑>Jg\Qggo2Z^zsƼvR{ux>2&::J*B"ra31!,(&DLz2ja*p4b**K2K*J92D=J#ZJG2ZZ:H1AySS Rn@l| e\Y8^8A'ˁ͜CxI ,|mObg16gYnVPDž}C9s|G uR E3Ď,p"aM{=,\W $i@;! (C"x^0A-OlE$|"pE]3@P,I(1FU! 5`R1LB J \!B ,LGxoߊqBuDB p0A cR]cpP@59QJ K/HXA9$jI4=ѧ|Q,P M `T Opc *A pt'Q@n$"bdA& z*pa1 XpmnzgzkG P5'l&|4Q\ kb^@aV葱2(!Optimized by Ulead SmartSaver!;Finance-Quote-1.38/htdocs/Images/Button2.gif000644 000765 000024 00000002354 12566055631 020367 0ustar00ecstaff000000 000000 GIF89a(&"FJNΒ F&g4/Ֆj˚}𾪯ils$¬nuj&6fDRPRV@~iTI~~n*%^ &&@8ҝ~ѸJA?]uy.264!̑x,+* :4l^V꺞``bĆ(~fVZG=ohRv&@,ΦƪG3ݽn<ìz> –U694#^HFxR6Awgumg622vD9.'"2Tr_ޮ]QԇG6.ү_QHсEHNndƬw_Qƺ;>G7*)!n!,(&!BMDWiH9d>HdAHA4 >999B9 /gHWE/;><.xn*]<ۘfi5--[:*<z/6[Z!|&ԘAT?/6VpZ4[Ӡ7,"F:̷4Y9r$` 3ɜ bJaI%pb#F F'0h)fPqrjc'|Iud҆Uŭsg1*by˔ b8s@'s$a 2t Z$jnH3#eV4FlGI@0pp8I{+ +l :5RDb\IJ'6!j~-,yXŰ2k/WLm{@ R/Sl& 1Ym;\ASP#4L!!Optimized by Ulead SmartSaver!;Finance-Quote-1.38/htdocs/Images/logo_big1.gif000644 000765 000024 00000044205 12566055631 020675 0ustar00ecstaff000000 000000 GIF89a{}? d'I8$ΕYdO'$ cH0+>:HHRǮwvi1,w]8/%ulhLN0hUL'-.WTYw_*'u<~yW?)͚mJ婊EǦѻNJ`;<$uSc~<XR0v[JcjP|vi:ۯ8ABgZ1K!?,{}pH,Ȥrl:ШtJZجvzxlXzn|N[̖|b) up1177  ; ;;|~gi 555 117w1 )) 10HxpF ڴƍ\ |ig^)2ثAƁ>hK4P@C›8sܹCӞEhrߒ^SDYЮ.MdJ?yKY7.4vm[ʴ]QfAZjF^?yǐ#pPيz+7_|N? 28`.+۸9|9:j] xq8bk jRP|y ҫ~{O΍1_"P A4W8݂ 6D&bj ~p P?ri.$ވ8ؠ6AL DGf(dbaA""*恂:)明i QΤfCYt9TR -Hzdd* Y@T6@rXbˣF(oV @"*ꨤJLpl  ƚyb:*ĺq5P Y m^|)ϴ3ĬjjD?ƶ@R-Lx -e «Nc+b8`8;6t}h箴,9Ip  E=tDہlǸ-r*{;h%$x ބvYЁuHͮEp^(ֈ=V&&ys*״ Khe}n "WcY٘,`p wؕ8G*Znת) BFE6} h@=ij](Ăh` }m%gעF:4IO ~{¢B7Rv R<+ :n&*RdN],5~qX+@B &(1AЙ_Px>,Tt`Ԓjj^9b`Da8 $.y?hҟ)) FPL)FZ^Z#de8p ZזGN(/Bt? A'u)0X.䱠='*v0Kq-HE(57T[Vr2@m_%p M1E=U0z%Y $V+`G Ms))xgjP8y_P^ x D+c@&A FM-bG@hQ7с!xŊ w,x{VZ.m `y Ĕ?2 Qh9&7Ζ3ɹaWBhv Z@%!œ;(w@+abR\)* ¨֫h O kIA r,WA ZA8óM] $`a@'`#k!K:.S&.e ԪV(+70<`M}4;:p30+UUh.s=dwGr #X9 HekŰt~&V_^SsCvPքY,qݒ\:o6w̚(`zDHLENG:.t[7x2Nn)euۀ&|M3@n^'|ixskEoN-P3|S՚w g W.Ζ2%Aa}RG9A rmʷ~>H K+Pz&Agv!ÊSTZ:uۃ)H8bpx-d n u`2}wn+0EaVf]&\3{aofvzTyzp9zgzpguwcWgׁdG'؁8eW!Gi&H{2'IRt&ps37.jUB[|V{L@tzp CNPD%4TwF%eYguv`c0 uPEhׇvh7PGC[ `P>pF2% nkdo1\Ff6ԁGãz;hwf@M9x*4rff98Qㅃ؋4`k!4}F{HHX[qc mu`b`8(!PjO'wO#( ^\&V# Q~6p@`lxcsB`P1և )U6c G(gl#vY+h밀ʐJ$@ReoSxw=z؁S B,Hw9.Ӂ8M1sC=tR0H3pi%(dg`a &3FF))Kuv %NDW}(+avd/" %<}6 <)5 BcPfcЛ ;'7 q&~IpE밝E1R&@he0D4cL#GyÌ9xT NƂj*`uo&Џsw?W GI4P0?G%V1iU^c'PĩN Ňi‡yȓH`+4ypx fZ^ I$44IenVG'RifHG\4:M7xyLJvV`37x~p+4ev39ؗODv P"{.Ⱥ.t5p OAGp{qj/O%9FjYWRl%:KM*QWT) y鷥6)9`JƩyYc)CBIY(QwP="_` H4Pp,,lr{BIxBF<˳ni8xf9W3P3"@fƴff\pz$2%PJ:<ЁB6saDP.CV{RWR"0Ot`rl'J*>e䊰"Bx)Pj~$ !~:9D df+'d;9 c56 .I E~Z=p.=-@-| )=9㤨Qnj6 fcko3pyGb8c+z1K3[ 0L˿<ЎǵZdcLcpoLh -+cF$ ݣ'Ez'8钮ZqN^r|KO,P|2,qr EAz]`fءV\Uʮ&Q!m7P u˩;eC? Gņ^ڮ :䯝Yn~lWZ^>\3@d^̍\ڍ-#UG+P acnnfckdV׳WLKma\ڶafXh n Z18n ~1W) H z #U+ŏ:H1ix*Ig]/B 'R".TrNn(,+K4(.@jVݣ]C- #wBmk_=7uԉ/-ToLk?(r(OƱ$1f֚DXk 0Ê(!WEERz-<®.^Uw^0hKePm{p-K0 *۫ QT4(pV+W^ h,xGgfC8oACPl0p`b&f_C 0HaE8lj g1R| ` % `aA6^)L;\ Ki6bԩ0+4BE@8(0#m!RXBJZ4h`iy m䑌藨H_,ԪD ס<:HwOhDB󰗊+`Z2PΤLgefcǞ9S,4ў[-nL1D,Щ EL}3<cF~&%(p`a`QLx˂~)n#(LBٮ KOSҊ[‚88)t@C ' + i&X ҂BJ*H0 18,15ءEC1l 2MCBdP3 F4DhhEt# vY ;&Y~$8>,@feJ.kHpT' +G$4 x9 $#q(ŐaR`]e‘# LX% Xcj/v!ŢN9Ra%@#i" F.v *b Ɂ! #k 4@+J* lv@-Ѡ@#B02Yc  lN;Ac58!:;@2NtD6;mBv S5[qE 3@(`#w&jC 0XeaDR aH@t%\b~}w}pwm,9r"6";k c-I>8%Wyx$HdYf h4p%OtSwNEpEG5X 5 y`^q4MpXp9* Ee2.ĪX{Dk GtXيeʊp " Εt&Q8Dp`1&0/$^]o;LMh WAS˓0@XH`3!&DŽeS_!-&լf$rAF!X"~4c`5дOZiW? @+/qp b .s>߂LgK  `(  >9أ  XE-b\=BLڅ JDD;xLq ];=9EeA#=gK6a>6ayL fQ@A%„Ld#[d=TtdȄLBB3*3ը<_(J'EM,_' 9⪦o6 Q3);nd [ uok]J׼╯w,Qqd߀!(RCrF[[a<õ *NS0TnzI6v@A ^]9jZlF( 0rE̠`aKrP"Lwz Z>-i„l|WQ&\zQXQ`!:VU 3ƪ8,E35c eOM Qo|('GJ8,51NQ*εl=DEM ^,b08TڅM@ 9-Cn Iun+٥iw/(%KpAytTJ9*Z_lz~J&4`(EVp/'Yfبrt.Ҙ0 Due ǘuOѨT*kAٚY"E0oA Uew`к Dm* lD#Sq*xk d*F s;#zЈ\} !!@%vm]0x4E}Qe Pvt7O??j'Q跿G ud!Q2xEuLH4pzIXqFb m,Pf!#l"x ~T :݃Pe{gcr,,}r ˇz%*<9fٳYm$Zr@`L%| "xbJ|WgF[pO 3HOчn8 NBnn9WU~hJEN~*F뾆o rŠ.m"@`Ȁ܎>  .vt]zl'-!nV^  F"jR$|#`BpX&B$n0 p o 0 o~`b /v6lɗz EP CNHLEf) f`<ƨ $ /6`vl)~gX@rcH (N,*",WrB'®"4@ >,p=^,#DgM2ˆ"vaP iAl#@M<m"$&P'q6'vHϢΨF**tу2 7h2 Q @6 pb" p3DNObQqe1?$QQQ4,qD;1 eQz2pNi'/)CPj6(|A*,sу@ 8$זMa=0? b [¨R`Lz /k$ //A҆ I/"l^,޸(H'p,l:l~1^#MJIzt^7 $ 8/I#EfVa;R2i2s7%9uC;= `nƓ%ktMnqN@mW B,G;BQ80voW$B/-äp0Rj{;1"SM JYtlHVbE@n Vwedc;DD0DpLMB`QP1g:q# 72A6:?YÂ;"6,CfO?w:A#c d+$ +lRRhv @X w?Tِ)YHSkJsæWJ6%B0_Hk)lk[O![|97 I/T&c,U] G v^g8{3+:mbLMgMY_Ay4*GYOq!֕StWtJ @#tl B#y# mT, "v@$By 计{w@8z5" /ZG8E8eFDWUKoXȮJoa iKK-_@-q@VAlPbED@;qEM{bi6a-QN Zx}3, @w1b PY`b]E!qgr#P {=xiޑpj*Jtz+8x훠ˠk*L la(73C- !?_O- CZU{37O6JuqvkFS Oڅ[&W8GZڜi@:d[Xʹ[{ՙҷkgTwK_JLGfB@6QŰ{ǐ^1 7ܑגqHNwR?KviLWVv Ƞ{g + Ȯ@̅W#$Ww{Zυ_ѵdى[fTJ$$<ٝ,jY YP q%Ny@G=b_a#5]U91=~'h8)C}]-~_QqOKOu,Z}b׀e]{2J2֫MC`x=ks^jQ)8{j[$z>EFBF[֜n;%Z[u5?} H|8W)#q/A7=7<}<(|e2" LRVZ^bR^Dddxfа I온*R:If@:V>FNjf( :ZRJdt]Bptfp|@X.yXl¨chx줯tCRZ$$pPCg/7+f8Bfn FA hDRF(Ut 6(TYRGc"dU!I W-+3#H bL7/BbO—.6 GKUAQjc-l"x^/E114k."K;rny&H \@r Nm7tԕ<{(x.,#w!͛" ƴdI>J.!Q8TUexQhMOEPTKmpWqB#B@">gRb-A)@`gFܽÇ^b!,B0KOB哈u @5 C.b$f,TKBа 9$ &i@pEM4$q 8@H<2@ps`g^O ;Ф@L7@$ /1ЂpA 4R(M4  !P2 DOJUmԈJh >d[BVU}u!VZxc)O„DцqU=@W2@ߤ 7XjɥMfB bId}r #PQhD,azi&(hv$ݧ:&T0is@#о O  tA$tx0@ rM]u[sB.cRH#J"K@O1Ʉ`NwOJh3Xm!2U Y@ b!cFtkI@QnVYas5 8hDAJ^@ Iˤ '0ju1!)9?h 0)y: hG9ŵ-Bnd,J,[e &;%#wYX / 빁 "fQ`2 ~%PXIcD8}cctzFy=sbK25Np>0 D#=ؚ,+5&\ l'5ݐga@5lB_AD87(J,-9#r,X*#iMT;@ )X+ AQd0\h)GtU XdB>s!h&\dn |R6j֍NL;?sL0ReG Ly'RG'5\`!E<0d@^5G~r%*a΄ZLȓXʳ |+\ys|s[v7<+-XU:Eހ](11p':<%lhEf;Э5P&hMICODQAtܙpg,:l DzUR3妞d[& <N5K  xDT!4d U@*JfL6Z4I-$U1Nd1d{X`֛u5C\"n.B(O4 (ΌD;-Un0w7e$0Zb]-{ @"P`Qzx='qġ(]ERr_O4wHP) * pT*6cѷ4Y@8 3<};gp~V J &'P M^^NyFEG w;!D%tEπr:ohr>tQJɅ4)It7|9ՙ҄K@h%Z#'k%(ʁNO hϧ02,Q>+*`M?F@1=H D+83ig,5[x  =s6?c.$eKاQ a%/1wA[-+ @ ~3Q ePm9bC`YRQI-tmJ`KxFtpgz K#S1O`ulF?B](J]LW yDZUc$$ qA`MDd:[ fh5-hB A@}U\^ pAy`Vh^ HKؔЙlā%GlkGGP9"evaB9LxuLCÚȜtx@(͵| *( @@-Y }EU -qMişM)U@H `ڡ}@`}|ݹS O  d/2P]Ht u$ |][^ mImDԳт\Tb+ A51^^jXK1Z -"LoO@TYcP٣ԣ?0~(٤_r\DYR9P@"ځ)%%2eXHHU]_`([)f8,7db/Ȍ <%TTVef E..^2SP2 Y] ȎFyQ`p 4̥4T@z@'|cxvΩrMMal!ha(BaG@ؔw!w7!ˑ:d&}G?rft@ B!\ĭ9$ @&ĄFHP@Jd״$$Nb 4@LDžJxN:SdPAGJ1BHXg /fWTFeRA 8e/H-@S\ [5} %H&eXIcPR|uH?DI\&NYT AA ϐ\>uNvvrV` @@EWS.ZUJef-\eR嚪^BE^|A$(`pQ5 adƕE$X6hVgXလBY()>&0+5f4.hGq(0|Gr,ܐF@ άZDxRo@T@$h \@ZԫL\$' wPFQsvIGOx'U,) Y#l!b|}4U'Qm)E)hl`` be&B ΈU (XZm`:9#eQ'7L@ x4`jffvZh@ o tutR"@J@CrLkn) b>C|ё.% 0@ -@@M>,Rw^HL]` ,d/Ё9I jlGVB+~Q48-@ F}(hE-1/ V& l})@P4cd\*pY܊T\ Pޢ\pnZd?tW /"H @@^T o^@TonLH < nBh  7$RqfxwDx@vJNZP,Nl-B@(VV@Q3,R@0-.Y(>u~-kl]-j/]"B'(. 3Z!K B 8.IGA?XG(W )G*d@|Ȧ,hҥ-;so24\GUJDHCe^Z*R Fa,,q4)5@@π TJw[Ti]Kwngؑ5 LDBB5RY8BL 5DfmTn-r6\V zI~BIv6"VTtAntH4JN Og@\Lo e#NQ+U ȲS2i@LY t7}݀",YHWE{5 P ĖH/p\3@|>]nɧ9vAWq@< =?Y%9_} h×u]4$d4p8@oGBPR 7"I2ҶpRŘ|C (4b5ʖ$t3\:ˍ@~Rs.pwy)1t&H$%3X 픦\x,4oO\dnc<@5Pڇkx SzJcz^xg+¢wKCkBt_k 𾶙Cl#7n+i6|$4]rkw 4@R&Tw_(Sv$((-Xkޔ-sj_:tG dwSXxaI:gx<Z.Ws--W_o j%/&C+T™',^LE[܍y- Ws<5Z ZYLCbh̘&(x牥2)n@ "e}1oewLnRsh0D! itر* $l̤+̤KU5Ce%$((XmM  p8vmv~󸈙PSV{cuӘ0wabRz+}8j'@~,(8rd2PIٛ5qa LFP3'G,!,`NGL:Ie萆CNSbPINRBG1M&Tǜ*-h03GQ)6sPa}y;Ms_Gg"o8?ٜa qJFiw*U $Ґa 0qA % `@k^+9(0$"j35&62Y]Tb>g{Y]Ɖ۬ Ԫ][\ٗn ``o! #^³)Ș ,3%\"'h("P%h(rE"}ƮMd깦*qCCQ8mK,YK*8Sn ƛ)N;K؀Ϧa m :2ʨa򎼭)A `> :3>/vqWL1:>ī7.64ሊK+B;'C:fLc(c;h3JQƔ)c^ ׹ اDFobځ) ' rY> QL (itfjd+tԱRueM7+2GcttT $R˦ $ :/ Z|N ABG{TpyxB~{Omg9.ݓBy呡+YvgfS,;+׵hQ 2zM*G+J$u MWTĂ>䫭m}q۔Qkmn +XِZ e3p(VNQ&.JrCVre)c.nPMg- Xce4I9Y{\_6<Z[C7skuwö>{ %qmh5OipXIՏNP,8׾.h!^fX??8D"(FKQgZMr(a[׵>$N CXD.vы_tB d! M6>"8G:Q XF)­BTWΎDd"Eea_ ]g\d&5IN,FU~( )b'UJVґb#'Cpt]K^җ$E@p1GDf2Ρ5-9MjVӚK"6uMnvӛ 39NrӜyNvӝg<9OzӞg>!Optimized by Ulead SmartSaver!;Finance-Quote-1.38/htdocs/Images/logo_medium1.gif000644 000765 000024 00000037546 12566055631 021426 0ustar00ecstaff000000 000000 GIF89ab BH*|JF3!,(xkǎbc ()zh`SKfQKU27 xZs|Y$m^B);4B88'-/R\ADZVW5!|vC'ٌ~Y+;9ո£_dQrYIC>!_iJm^5026;<0GDlfPD6+T@2*)~htUgWM謋TN0ǫĘX{C_t_zڹĝA?IKTgc;`GXdfh\xk;xAp;dY{w˽ϰGpR8BTL>Vrabvmy:4լzןT=&feojrpobK4q`5# s?p՛aC@GpUYbb[hdZ3!,bi1M|yMM010%i%i6i6Ăƅi˥i88'8''>>4ȒǍ/7A7|8(F)8@s>M2bu(S\ɲ˗0c$eҚxɋg'@>0ԃ FXjNӥtXEغՄ13\QgٳhӪ]˶m4&g{x>WТH*eꔎQ^O+lY3k̹ښ6ɇ/O~]x0ӦN!Dp@#(aŠ1b/HṸȓ'[}:Bjխ'Nm:.q˟Oi62y@.ǁqD᠃`PD EcAyeW#TapW߉("|QS weqXmh6`58!e8ƌqXCuU`'GذXfeLbd!$ihIk@nfL /dA 3c &n)蠄Mԡ=֌k 餒@yiifvWGmHXvIJ#{0.] *Sn02}?r>T0#`dЇ`}QZO hX-"TӚE0@s@ *3Dq~ 250 \%7@RaVEgIO]cN+ etT–§i@D(&3y!mhj:eόCQ|idV`:802'66% *EFpva8XE@Np0P`0f+ ){8C>+̛h (pv/qe9@í jRġ [" MkF2e*>jZXh ~‪8LQ͓"3P#(04'hU5=QIhkH;XY d w.h`:]bϘLvnP[:<1cg?c$sL^~Pٖ̅G\?m$9TPTs8[EcM!p9`{^谠/(ڽs꣓Z <)` UCg!T}&r \My2ӑ78 RV`?zu ʃ~@]< ~^Mc_WNɢA:⃺WlLƎ?n69(n@'1"ɲ=h0UA =p`""`}e`ЇLg*`Ke8kX&X^M@ <_:hQTh<uD*ʙQy~ HB \Yy:tā|Q0l1G Uwu7l0*c7v`_ L_`bWpvWi3xR}cG}w`,0P2$4n?0`PIX,@\tV\5ÄXEUP([WExvzOp /0 b}]{g0qJKDp8t 6O0cX7diP'0L'KAR)v(sIm'\$+C[Rt'hjK1|ñ:p2v5@K/} q =e=1#'V#pyq6"aWuES0 b5aX 60rp̖$Y}PwDNd03n~dw=gV:UT(CR!r ,PgU\Q]z\X\q,\8zV o 3|D{|L\{EtU3`)R~,RuLt0%P|W~Li~EqoskNpv(c-xxxDy Љ5I0'PWӐng=ec0@YRt;6Y(9O$z<^,o6d3`Z{5X\wzi\!)?@w9lƐgy7  z#H +i}8%׆% )7w0h`U4Vu:I) ,hU8e7}b~Z D H90tt~([yx{ebٔq8R0yWkhb]4"OFsHᗤ3xgQZ HP7.Bv0((7fG:&0SPw)=C~Oi 615Ĺ4$Ixǐٓ$= ;?zɜR30d>DQA&uJL^g道c0=Ri0V˔;DE)pA) UTU_' .D|jtP^8ROP{"} /B>ЖPk>+D*g2z%<4PH!(kbPz0_(z\X{=E|wSn6~bxej?r#+GEf9p,dS~@C=Y4 ~@G׏{E۱?b.Kc1Mܐi@jǟr)ـ%}EQ*c zp@G1Vchj^y<>]pcĠ(n(j50vNG(`k:bSl+xx 䈙99Jxp<1j33p[T`{ Kq1}Tʺ\rJG%@ !f7,89,yKZ9a: v?;Epv=>wu8C]8h_ ;! #0m)xA]LW9#`(Qyqb[8j`; bf53h5{* x'`B%w%c( DACTD^R ?ɘ ك<Iy0΋ssla~*-ESu֋fZK$+/;Qj_1`rMPU!*Iˤ`LKE# <:JUY_YT_)Aw%lo $I.i ֪"qJV1tMO4G`pP*-l ցx| ,n(,)0uoDp(. `+. 2^fd,:.=.z-CK?C-7 ,3:?P) jT$z0*]"youO3P+1ހfZ|0_&+=RL Dk"T P袶‹TJS>P&tNV(5SPft{3HO`RKu,UDەxuhe1 H O!/ #\\A_!R`Bi52 JS _D.d塒rkM3& ih)OoGYpEK3u'W`> )uu)/yy}'%,G22[Abb- II^^zz"6%11  ))"u6UP")66~Pssݿ)0s ?Us,~s|~ɩM3 AhjBІ d NhxÉ78bƄY!f͒"|瓟o䴹p@t+.I/<0qWu%5ASS4AC/x 'ADŽ +&:< DIFrŌ.5JL7"KUn\f4ld v+q7$a,e/ VBcnjH EprT6ǚUj̻a={lHϯ9U C@pЃs/PF~%iAH_TRPÉ^XWm5\)Xmp GYV<4E 3HՐUh5xP4bHgId0[]I 2՗|e<u@b&,C)|z HI/8j`8h^o"@nԡT p  \001\LvʴcHc gl/W}U4wB5݇> #(0 5XNjtF5P!6 SIYH4o lpU

    hV"8Jct:%:Ky>dl R}@< 0a3%DPi- Df>$QkV\ >߄8'|qGS TȀA@$(a < Hlo1($0!H*/gsk\ahp KbEQ9`AXȌ-Ay4怅FKuH%-7>CG" U88 ]!@ T:Ad@{f1L)j|܀&Tzǝ@gluLq0紿`\x3L;mMlاeg<(jJSl#κ>|P/|~MjU6'ѼE, fhN P@nsˀ<|P{a'5xЂGE'λ<=Dw*`ۇ̋J@:y8Ĥ4\(*B@GD'gʓ$ղ}p0( pI>!bmIN. C4lMS #3dn^:o :sD 5V>d#`̤ B67 BȎ\ɇ`MQ.sˉ8AldL_h ~%7+@r bo+6F+ Uu{Q,I%mr {7^˥ro{O^PӴ')X  {݁ӏ 50!2DE& ͖ `v!ڔ kȒ44I;Dl :ȁ(mp$dn_ޠ 3Av&6B=A1հA |`ϼ/і6ʷ|IJqY'b̉Wi4! JZB|F@s@iheQ]E'PЮx Q?"89 n Xr> ;@]~^1&pѓ*UiCN `ሹ9{fIÒ+*2m) 4[5po /D 3̾Q0X L}zY^?yD-)h"2YAU[ ͇p eiXx1g@@h{ P:$}X!u ;[ 7~U u\a$ awxXNI55T80Ȧ>9Jv>y PcWUFai1 n Tvwnm%)74P0G@(GB(\'pd&VWO#`PS0hFd! +ɈU9 s։/,x8?iLkɜiFa5u*V29e8S< T"U45+3=#Ua&Fx%Scp9)Pc+0+P!Rf8\/Yb1W11>Q'%bHr1cҍmlN3rcTjX0d}(eMp5N'(ΦCb)Б% A!6*E!PPZuɜr`_ޠyLP _ uDEpcQdSbqpƧlj:=Cw=b1q0x2R@nN <man3 ( @*o@X(J/0И 7˴n0Jf.`@aT3g ~S@ +  'i P]StKVPj2rLŝH'J|NTq#E *NN@C@8{ v1*F%ˋnBJm9*&"w#z0`8돈ó1? '#!FK}4MT;Ij6o֍}P*!@Dt!@cǾKI;)^{tL̹j|[ Sup`X:@j?E y!l$G|gnO#f5>XjfJNqBbl{E̻Iʠ}⳴e<@{3Tfe`U< [vPfru@v0<v@s1M|Vw VƇ;-ɜLڀ"EMRDiF^M.x V Іʹ4&QW1`>9 J!2~ZI1F_d5uC9ohءfJ&G dq0f\뀙|bm%%IJ(9u@T (ϡV2R&!9wSw uE8'7 tEщV[[=sѦL@w<$=[/`fnI{vᇈHq3$#H$YM p`ܻ˗ 1#*`53[3˪kM$p9eg}/f{p*.7@gQ0Pϲ rDͭ497]A)^ZJE`~P0ěX]ѥ S5ps925usx,psH\ҶY L4cGr12&2,f-Z;R/@n#plmz͡Q-DW=Y-{?oU,43)Z6\xU<}kP4l8[CY%=hwv~p"=w ! zLP;,4^^jctKS N8%FzX"hsPJ%/_앧)>K#`m4<U,Mk)dxgn oIJ MA@PRzLqͼm|N[$獢e}n)pT`D^*b%DΤ@\wc7GP+~i ~Q`iCJi_0þ 1MXڲ V4n&Ho+ lPF~* {v#ubuڗ2=͘苒)H7I& Rބގa#0UX7YhN|^Ce8 _H(@DDP7n7w }d`w5 qlrD"PcEQ_N]];aSO0Hsu)5XVVVsiu8'5mm) ut#+)#<m)<.m)7&m4ȧ #ttu0&)/fvX0|hF@~ &͕WcCѠ"=bRT #QDL7x)`966 ##F01BA7lġW+נA~+ )D(RI[E~J5Ŝ0pن6+yaBׯUf2p]kɊ# ,LAA 9AtK8q"@$D>tdI;Xƌ:#x$8-[3Ҩx!Bh:q!v2tCmxΓ PewONSgLC8ȷJrEpB ɷ 1%EM+!CЄӈ^<PGT%lI! 46!PM`!O#l4<uژ0&uvwp $NzPC>^S}4(?yG&a!ZbM9M N AXB0SLPTŎXa/1 =XHn5YēbX_qa8| (%^ɥ-mXd37'dQZ OcQjjhp#h@@qmȃ9AFa[0CCL-$I(PyKTAD^+iVTʣ*|tY2%g8*Y9taX*}YI\ 1^Z*X`@X0:B*x%*q3RX|Lal̈́t![8w]bQ s+` pjC #0֊kDs'KpִAZ4Zε}F<ƅ-U%P=qp ^Bq\Wo`-<@U‹…_AXK!jRST2aAzLT%ip,f0IwOri~\Qd5åwOC.,Ama@AޏL !(u# pP,{*CSI wt$ wQ3adxZ 3pmb`RBaYHG z pn@nOd<3g{fCbfdCqK&@xFY+Tdp {p^C k@}Wwnv,f8s}~W~х& @@*`=XvpW3y6 f~~50paGkp){wpHnwal!h@45'4Qbw(2@ЌW)J9yp,<@g `zfY y7Rqõd3 ?t 5,Kxo05Ge&|`g`9nHupXSjM Xgh0D Pl0cB[jxЊGW`&P=5*5C`aXplu0f =cJBHm|ЌI5Hr]ӃNI v h@aYr}ph>s5+Pw(RcXaVB'PZ] raCm8a/  I.F7p7) )%xtb?6n5Q3=cPudXOmǓfxQ)0V((h30pjn 25`aAbbヾ(NgysuK@tH)Kx +<w>OIbA#lO" Z); 4y0m7V0GL:IhD[<P_>!CTOYĜg|` % 4̢89QHqa'RR q|9ۡ )lDMO- _6w=TH9Epvb5: >4d ivM@5(]6>3'>PJ 69R)4t5h`z+45iY5SoA 28`33p bzV'rN9sa{D ;DD! :,FR@ܳD5w4 wyG;jƺɩ93g3]+ #zy+"\05҈\~>O(ܸƒp;ɖ|̡U[lOVڲuŕj, < 6HyPDj`\{ |w5s˘P;̓w-܏k5lp ,00 wȂ <&1,< * , :"Aj3wˬg|=M쾅Zڼ͊{Ǘ[ r?h́Z57[lR:[G20)}`JtvA9帬ɻ͜l]4{}=8*0,TcW/-[YeY@)us~XP0|`DH0B@N*"m:6.ؽMIZv˰[W4OJ.qk?0+)(]]=c]h¦!!u?93"nai*88|l;6A<|{500dZ3* XQ^DJp/J/dyAhȠjN5dpQ{Bb>FکbeBfc~3GF|R[eh {kd֚fGN,9"E1K?B8%~zFshڽBVVd7@(dOCYcCN@/7OM\Pzq|d[x[~vRRU6βW>"eWQvsAONpdqd7+0apT;ͦddm0nNB@6LPQ-@=|sB?2)ʔbʐRM PO]|nw:/QX[zb77'D@zf6`ʹ"B"ޤC?)sdI2|tjF:F*sZJ^jNnfqز))eO7b!,^EH p)ȰÇ#JHŋ3jȱǏ / (dIc̉IC !`zgϙ3(i&͘14M:`@0%- A0IիXjʵׯ`ÊKٳe Rm.+nzAe.`A_[V1ښq1N du@K˘3k9k & WnU^sAHlVb֨LXP+XcŰ8H6K< _lr*ь6g*?J')h߀.̀E IrA*]Ye8ך6W"qeCᔛ%Ue1 3;nWb1-F]HZ"/<xF BWĀA0`_#)^Ц`C,kE,CqZ ;\WiB]s-UUH7a0 >j@'Bq d5ta˃R 5mn͋4T]*s2 y F}JH"1OЃPq@0yhzϋC7>p%z`D,g@ (ț|^u~pC",xt^rp/bt>TX øb)PFF!`׾`/`1n (1dAK "pG4ِavY mmMۦ=Mhy@@F1X8<0CSL{G4DA %?p)Ӟk;Ua({^z oA0hF"X&".a iH@Rt?+ b sX0}\{ J40UNv :*u PJ+0S|<+h` c+jujTVZ+U:Yd &iMi Y\ifqsXv!:^ɩ{z؂,Pa1]P@"dE   % " GP`qJ,: TT1Iyc H #|GQр 8p#j Щ(fS*U/: TMBQPaҶa kPC lAwĭIElŽ֐6 FhCBQ@A,rA *܂ rlq\BvKXpT Bq` \ \u~XxGtQ1/4#d\ 1أ‚ s2|`5KSaM!ef  cx ݃v^xC4^ `E *K$ea1%Atm 47 }D޼J6>1+^ g % ; ʍ"4c9.W=[i:pEBU:^ H;X+7ƭ{(ߝ2q`!,a; A8n0ڄw yZ@:),{ח֧++z˒jX*_t刓B0Q5ar.4&S{ zQF=I,Mq a6]P`/Z80Q+p3H A!_ԇ-G0)p}F_tH`?ʰiHʹ2 R E\\]iP|tfRAZta%*ZvaW:K01Pc o+ {P TUog+{t @qlP 1lOP-@ 4L@GX1t=RЙ? =@;(7T:T!t;[5NE4p HZ8Qk1c<'Rb@ PZ+Y/Zk^ O`Xq`CUrH`X6p s p $ zJ" @@Z&+T0 d Z,``mB+@ ɀk0g nfIxBP5*`#[&A[`#a(^ଓq ^tx(C%,ْ3&:_Q X"5zDK ) zF_Pj$<Vbk5.p <ٓ'`̀pp‹ GCg) LU.0P j ӫk;2:"˽uK0cP ʩΨI*ЖĘ   ҘC9yI P#Qp$p0z ֚(Wƺ=WY'X0Xk`iDޠT+`<`cGh|P~"Ri; Ö˒6ghPmӶ2h.Q|0ۓ 'pǀmph,XGĔ DžL{LIB%S0ȃ\*K0dPP堍Z+u'Ғ^'ܐ,,(c*ԝW ;?%TT*)kk~X!˫ ,:%qm(@%U[aP ހIpޡEqPK<ֹ: Pc'  04wS.JKF3U:5vqvؘ2:D$\KN?s=#ra4`I'5 =Viq݆uT4X#,#" rف@?0%Vw! œ(De3C 9ʏZI%Ҡ5R*z>Tr'ӷ~gxzi=ϸ7 mA1LTc(3Pj,bk-=@x #, Š>RDNb /,ڂhbV=`mWwL1Eq̀bHV7@nAW o~;,84F@('~ Quˁѕu9fs:L%ʰ0(*1&2Ibmj Q;D[A2lw;DA@Ll o'L7oЀfЁ$deI ?+bk@X-IiH; 48_  D`$h0+'0Ǩ 2`"]HI[5o-\{tpaG0HIB{@L@@WGV_h 'Luo 7.kXyd OExKy 0zcgf4, px!4'{aRd 53xFe DO٢bDH`}x~4iPq39,B)Tj DD`?SO(! YA-s Yg-q u*?Q6 ݅7L/'D\QԢXB !Bі NAR(#v̧"H0S-d_>,@u㮐7 & WPQZ#WxAպ j ^ !HD#"mh5R0Ն阁Ly j 3Q3 ې+( 8ݛ.D#aڐKhዄO80fHk%t)gsH3 i^@Gr5.iG:RHA,)6B?ؓdAQ(1²"K.8@ 8  f/ 8V9P+ Ai'K`sH4t4CP sJ,Q1qHGLQ$-A3$'Y61ОBi0:w lWS@g4 #E:LAoE=5ȼ0H:PFR"Aj́h.(+rt.o#. ^BP8r8#lh9>+DHUmh[$s,qĈ,tD@@%c%`=B?M#;N@rx(GIXd2Lѐp)E ytHTIE98g_B!(t,Z f0 b#b/AhN8=3yȁ?n)4s(7~%+]؅\ !,P>bo $y8ch4|,O1ƹXq4<4\hU=Y@1ՄT`ڔ?M/ee2$p)؜r2088@N HFX 5n#ZPIT`Ʌ̈@J>A}Ϩl=0+=}d!PStAV ؇jXw(_U%,8QF>]8+>o++(L0BX%4"Ǥ4`xgІ[hNk%i6(?a@4Tz(/$?Da1G4} >؀,6)18 q0dx T!6s9܅q g`P31l-O@(*Vo@@F:pՎdIТih\\0"PEaK.(L{0 *kP9:(b0%0X ' c(І("52hrL5f uhM5xSp@/ "rv'=xxA/KӈTM6[nS氻Z-݁Jr 8"y(J/{ \ܭbQE rE˧qH/8UafBoqb86+02#ShO.b:q>r(:p ihx3J"i6~EP2@'@@UB]njpjSPcfV،<(lJ%Nb.byI\vQ(Z2XFheMeN%)hf`;Q<oр-hT%$g#I$qn簉 Dh/x]g>'0op5n>hKa8zl"rS/Vvqظh<8Knm'Ѳ=jVIjoIUj0)`8x!o`+P]kTCX MCf5 EB]Z =mcyfkje^,pQi-;p-][8@2>`9E 62> ؈n9_Ian羷uPHt3nI.tVIco~9D_ 9L/wp--uQO/'vbXK1 Dir<=Y8$%rNoHZ戸P9YVXvi%rzBfhuk]h&_kp2/ #ސcg6JY^NTfu'Xlb2xvet er e6r2Xj(֎gg/y6 Jloy1wci2pVr-My/z7u&y #,#'r# bA9x-?zzXy-wVGZt&w{{?1gyF.ټ/y/|?kwG|ɟ|ʯ|-t#|||8`,}?}'r/wJ}}؏}ٟ}گ}ۿ}}}}}ڟ!Optimized by Ulead SmartSaver!;Finance-Quote-1.38/htdocs/Images/logo_small2.gif000644 000765 000024 00000022665 12566055631 021253 0ustar00ecstaff000000 000000 GIF89a,; M8ALLJB2|)'ҿ%$,[PQ &"dFTMgqPVP0'9+!FYcD81ojF7-\Yh05 *:knXi}oysIҚlfYb˩Ī"JF~xl_џiZTEz^9/JZQlSC:^&+LK41;gBB>X@uiuVqiyr<[abz~hUO[Pdexrj~2L@uDzvZ:> MBc]lt|Zdc>|PʸaQwll]5׸lsvND?ŶȔĬ׺Ď{y>FNdN@}EMEPOMSa]ѱ\ c¤r"U.9!۷B8Zz5-O* ;RF8{W(X|X'N)9lh? >bB$|JR}Ww>1뇐/Fɧ b*)1#"`aMFY9t B!!P=1L_TBRd\LD < #T-cLȴGtQA ,@VX(cG#Yzx30W\AKQ#T@ az&R=`D` R!*\J#5uGu~\b%첆C R4|p5L }W95Jɱjdj +9f   K9[$D@dPcL66Wi.iZ8oTQc1E8LiX" C iOc"16|B%E o/]ЃWT]Qf?}]Q >MDDoLfl,E.ك;|,ܳ}%`* 1,?d`b)`,V`m33fU_mJA)K, Ai`8DW^50ݔ]'N$]dX X!"5PAϏ4t| dP*Cd@ Ƒi%D@41l\/`RpM#,2d0/@xB: "  qM- 3vS 1?Wo03& 08&$C8Vp_a d`, ȁ4Рje "DT( >zH 9v:ul {8X2 V &-+]HP$D P"z@@WJC9H5 vJ0rHNJȘKg"#ɰFT+RNI%Y&W#4W"ZLftrjAA4[ŠjRBXІ:sI9_?L:vjDǀ"#V0}>2i,Kw(_uRmx#8dn|0Qr.aB:XCrIdLk%-4"-pP^ o 0 @¹ЃLJ4{@e| 'Ud$4p+ylzbAMX.hxc!^8=( ٠D!h!RD3/H5=Vh4,1M=xֳp?I TKǵ C 3bt?Pm@B& mm\g)E] i&1W@Hх+vp0fǹJ3͡2(V,kI0} (zG۹I,o4@`Q p˰/l 0cmټLB|SL4]|E9 NsƵ|=nL^ jU-& %-r?)4}l~,ei\Ɛ'# iV]e<SB BĩӤ9L&Y<]p_nĐ AA,A.}(/5ͰdX&?_ЩJ=cXP0@v2rq-iwmVAKqȡa r&s.)"~`3dX8}p1Bl2T-XAg A`ZLG l1v&  ;,7! `(,`+ `Xrr,z-ʇ *D $6q$%%;&A: |F0F7\p12 HF _GIȓ}ґ|j#_󑄖Gg1c)=?^M ue\s̔Ȗi|F Ji)EI2CO~5Ce`HE` gO `h -fR2O? DЀVwN_紦Š@S&5z78O`PLufsy$0P "pN'qZ `|] (jD"p-TKOp vPJpx=P{JAQZZ dG„=IW$Xl  15ђK:nH?JcMH|KEQ]WY#$ / W)EI&I2JB @SI,{A Ra+M p.y 291afZ ~"-9ctp~{P3}dX@hXE%)"|3q2PV`R"pq02W 06`7K_P`ZxX0(CNp 5Y0rPZ`) @m*u#% ,",2[[IɲZ25ZY7[ϲ:P|/p~={ %{:0p/}oP`^2B^I1:0 B^4JX<` 0S%pf % )IN+5`[5eC,\V5@7A57\1`/5c,b$[f t ^3czD…A f0"O:lCrE"a  Qj _ 01֞jc` S##'{lR

    A@P `>0 Q m5V`5m0д+5mC;0ns@/B嚚+Aer@ @7>6po+awcCV0"P~/ #C:EU!S$4pq%R@P-; #d s)0`E=.`gGv0s` ]T]@.GHw p>pD< F> ;/aZ?@<~f` >0 Buw~em@d` 12d[ `9f p*P@SDP d:^3CzZ #6RdDȬ;c Si"@P9o$qtDP jp0gT_р Pv3zTf &u`qKb$$x&,qoF ey{Q J @;) {@h^D͏%Y&H,yz$y0K#9Y"#tJEI=],k#i2ñ0SzLŹl9=? V}X(zW\ո p f=#`j UqIr/zD|Ň|"}!A}P} V@|}٘}LPa 穌 //@ M P ֐eoPpQ =#ٺBQqPp@= m+ʽ%`+e ^=Sݦ3"hO݂1OV0bkt}#K!! TOh)@sŀ HB<V>%i0 Z{c0wJVxIqwZy bH x &Q}UKŤrQy:0P t`O'hy}w}l :q d zI1hd_@ NOv {q0P8@vc`aaq@]OF`FW /PurQ4`!d  QDO ~b3ʚڈ3,%= l 0l @Ġ3L $Zb lSZ-p7p /`YpȰ ddp` D@ l030QDpFh`\ 6d8P , 7 ے7L¤ @ a?Q |偑*| >P\Iqy[DM9@RUn1]S3US0YS@Q=p rQJ5^5 #I 8S" } C0ׇr]ܰabȤJEPay'h,@3MA\KH Qjt*5g!.5jԃ'|҆״i$I2D>rɭNJ`>8s>-z1D16}ghr!'vXq`~̹sXKGV='}DtD&ONrXEƌaB=dE΄iatHXy"[z Xr'J9{K t+衭 c ip@>)! 8pgKD&x|J)b@kTQů"0>J2^7|`b(/kgႩAM8k`^3aNBM3r#'$GB8ez0PtQFGg2& u`C!VÀLHzb ܨ& ax?,L`@r`r^0T l( ]bعh2v\ qէ08v'[f. 99bCYI](KXJY,!jॆxC2>b::@:Xm 6|X`댌5k | ;%c ݄k'zxbWe}yV+U."2cZo՗ ;9,r*X5q [m;C]"q ;l(&>KG# {T% 8’_ ˗#KF0irY{BY-`̊".!Xs%ʯ V`jlA$b(<$pi8= >V`0;.`f`YAC8bV° X]qլƠ\0A2nЏbz:gmW ,p D nhJ:xbx.690B˨00|U,D6qO@yJP1 A{C؂|!|)g4zSG :3Cʷڼ,~dXVpJ(c?r@DGcX!0+a%|Ou@ ʐPh!)H@nDa pk=L&,GLGP&n?5MRv0N9Th@xJTnU(X ACE>2,M ( Џ`) "Ni(Y&[B>*5= B?4:鬧Cm9-= zPT$1Cdkl#H =Vpa+4!"6P!,G%0N,,ISh >CU@؀ 1 {&k [ha'B(/L4D&+ A`-@ʇ)X33q&;`@$gpS3t)ux0 zlp%ά|.zC* )I V5ZXO!"` Tu;ԃ4gWuh)H3%Lr k  i@ HFL*>C,k7q:^BP6?QǬA +,üL-K`T+GWDTX% d?\9 >cW|A,d"~-3㠲`@InSt8`8P,@I'Ɛr DI1Jj qu@3pb.;-IdE WԈd5wwQ9@"& 3ÝkC>\5nD*8@hıvo9cW ݂W :<᣽q2U#%{ c`@?( 1x 2Ӏ$AAIq#a$ (ސT=6 *9J^:%ct h|g,ucJџ'! Fft&x09z 1h r093 (Ѕ iHO ?;002l1U({7<0 (00(@4=_ 9"F@6Ix5;ΐ^`(p;x֪@q :XX2rȇsz|*9?SA(:ۮ23 0< ;90c)i Jn]A!, @@!z$&@UC 8&: ;>:МO0v8Iv`|Xbp"d#>RP ( #(c>>>>>>>>> @####.### @###.### @####.### @####.### @>>>>>>>> @####.### $name, $date, $last, $p_change, $high, $low, $volume, $close . my $quoter = Finance::Quote->new(); my $market = shift || die "Usage: $0 market stocks\n"; my %quote = $quoter->fetch($market,@ARGV); foreach my $code (@ARGV) { unless ($quote{$code,"success"}) { warn "Lookup of $code failed - ".$quote{$code,"errormsg"}."\n"; next; } $name = $code; $date = $quote{$code,'date'}; $last = $quote{$code,'last'}; $p_change = $quote{$code,'p_change'}; $high = $quote{$code,'high'}; $low = $quote{$code,'low'}; $volume = $quote{$code,'volume'}; $close = $quote{$code,'close'}; write; } Finance-Quote-1.38/Examples/currency-lookup.pl000755 000765 000024 00000000763 12566055631 021133 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use lib '../lib'; use Finance::Quote; # This script demonstrates how currencies can be converted using # Finance::Quote. # Example usage: currency-lookup.pl USD AUD # (Converts from US Dollars to Australian Dollars) die "Usage: $0 FROM TO\n" unless defined($ARGV[1]); my $q = Finance::Quote->new(); my $exchange_rate = $q->currency($ARGV[0],$ARGV[1]); die "Urgh! Nothing back\n" unless $exchange_rate; print $ARGV[0]."->".$ARGV[1]." = ".$exchange_rate."\n"; Finance-Quote-1.38/Examples/Quote_example.pl000755 000765 000024 00000004770 12566055631 020604 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w # # example script showing how to use the Quote perl module. # gets prices for some stocks, for some mutual funds # # This script was originally part of GnuCash. use lib '../lib'; use Finance::Quote; my $q = Finance::Quote->new(); # ----------------------------------- # get quotes for two stocks ... %quotes = $q->yahoo ("IBM", "SGI"); # print some selected values print "NYSE by Yahoo: ", $quotes {"IBM", "name"}, " last price: ", $quotes {"IBM", "last"}, "\n"; print "NYSE by Yahoo: ", $quotes {"SGI", "name"}, " last price: ", $quotes {"SGI", "last"}, "\n"; # loop over and print all values. # Notes that values are stored ion a multi-dimensional associative array foreach $k (sort (keys %quotes)) { ($sym, $attr) = split ($;, $k, 2); $val = $quotes {$sym, $attr}; # $val = $quotes {$k}; # this also works, if desired ... print "\t$sym $attr =\t $val\n"; } print "\n\n"; # ----------------------------------- # get quotes from Fidelity Investments @funds = ("FGRIX", "FNMIX", "FASGX", "FCONX"); %quotes = $q->fidelity (@funds); foreach $f (@funds) { $name = $quotes {$f, "name"}; $nav = $quotes {$f, "nav"}; print "Fidelity Fund $f $name \tNAV = $nav\n"; } print "\n\n"; # ----------------------------------- @funds = ("FGRXX"); %quotes = $q->fidelity (@funds); print "Not all funds have a NAV; some have Yeilds:\n"; foreach $f (@funds) { $name = $quotes {$f, "name"}; $yield = $quotes {$f, "yield"}; print "\tFidelity $f $name 30-day Yield = $yield percent\n"; } print "\n\n"; # ----------------------------------- # demo T. Rowe Price -- same as above @funds = ("PRFDX", "PRIDX"); %quotes = $q->troweprice (@funds); foreach $f (@funds) { $nav = $quotes {$f, "nav"}; $dayte = $quotes {$f, "date"}; print "T. Rowe Price $f NAV = $nav as of $dayte\n"; } print "\n\n"; # ----------------------------------- # demo for ASX. Grab the price of Coles-Myer and Telstra @funds = ("CML","TLS"); %quotes = $q->asx(@funds); foreach $f (@funds) { print "ASX Price of $f is ".$quotes{$f,"last"}." at ". $quotes{$f,"date"}."\n"; } print "\n\n"; # Demo for TIAA-CREF. @funds = qw/CREFstok BOGOname TIAAreal CREFmony/; %quotes = $q->tiaacref(@funds); foreach $f (@funds) { if ($quotes{$f,"success"} == 1) { print "TIAA-CREF Price of ".$quotes{$f,"name"}." is ".$quotes{$f,"nav"}. " at ".$quotes{$f,"date"}."\n"; } else { print "Error: ".$quotes{$f,"errormsg"}." for ".$f."\n"; } } print "\n\n"; Finance-Quote-1.38/Examples/stockdump.pl000755 000765 000024 00000000764 12566055631 020004 0ustar00ecstaff000000 000000 #!/usr/bin/perl -w use strict; use lib '../lib'; use Finance::Quote; use Data::Dumper; use Getopt::Std; # A very very simple script. Takes a source and a symbol, looks it up, # and dumps it to STDOUT. Useful for debugging. my %options = ('c' => ''); getopts('c:',\%options); die "Usage: $0 [-c currency] source symbol\n" unless (defined $ARGV[1]); my $q = Finance::Quote->new; if ($options{'c'}) { $q->set_currency($options{'c'}); } my %quotes = $q->fetch(@ARGV); print Dumper(\%quotes); Finance-Quote-1.38/Documentation/FAQ000644 000765 000024 00000005312 12566055631 017012 0ustar00ecstaff000000 000000 Finance::Quote FAQ Paul Fenwick (pjf at cpan.org) 0. TABLE OF CONTENTS ==================== 0. Table of Contents. 1. Where's the Finance::Quote webpage? 2. Where can I get a beginner's introduction to F::Q? 3. How can I use proxyauth (experimental)? 4. Is there anything similar to F::Q in other programming languages? 5. Where can I get more help? 6. Is there commercial support for F::Q available? 1. Where is the Finance::Quote webpage? ======================================= http://finance-quote.sourceforge.net/ 2. Where can I get a beginner's introduction to F::Q? ===================================================== A good beginner's guide is the Finance::Quote article in The Perl Journal (http://www.tpj.com/) edition #19. If you don't have a subscription to TPJ, you can also read the final draft of this essay at . 3. How can I use proxyauth (experimental)? ========================================== WARNING: THIS SUPPORT IS EXPERIMENTAL AND SYNTAX _WILL_ CHANGE IN THE FUTURE. If it breaks, you get to keep both pieces. Finance::Quote provides experimental support for authenticated proxies. If you wish to try this, then put the following at the top of your script. use Finance::Quote; $Finance::Quote::USE_EXPERIMENTAL_UA = 1; This adds extra features on top of the regular LWP::UserAgent class. In particular, you can now do things like this: my $q = Finance::Quote->new(); $q->user_agent->default_headers->proxy_authorization_basic($user,$pass); The result of $q->user_agent->default_headers is a HTTP::Headers object, and can use all the regular HTTP::Headers methods. This object is used as a template for any new HTTP requests made by Finance::Quote. 4. Is there anything similar to F::Q in other programming languages? ==================================================================== Vidyut Luther has written a stock-lookup library in PHP. It's available at Bill Bell has written a stock-lookup library in Java. It's available at . Follow the "Code Downloads" link in the left sidebar. 5. Where can I get more help? ============================= If you haven't already done so, try the Finance::Quote webpage at . There are also lots of fun things like bug-tracking systems, support requests, forums, and other goodies at . Finally, you can always try sending mail to the Finance::Quote developer's list, at . The archives of this list are available on-line at . Finance-Quote-1.38/Documentation/Hackers-Guide000644 000765 000024 00000025015 12566055631 021020 0ustar00ecstaff000000 000000 Finance::Quote Hackers Guide Paul Fenwick , May 2000 $Version$ 0. Table of Contents ==================== 1. Introduction 2. How to write a Finance::Quote module. 2.1. The package name. 2.2. The methods() subroutine. 2.3. The functions specified by methods(). 2.4. Currency. 2.5. Thngs to avoid. 2.6. Using your new module. 3. How to contribute your module to the world. 4. How to find out more? 5. How to join the mailing lists? 1. Introduction =============== This hacker's guide is primarily a tutorial on how to build your own Finance::Quote pluggable module. After reading this guide, you should be able to write your own module to provide extra methods and functionality to the Finance::Quote library. This guide assumes that you are familiar with perl. 2. How to write a Finance::Quote module ======================================= Finding a source of information, and writing code to parse and interpret that information is a difficult task. As such, we've aimed to make writing a Finance::Quote module as easy as possible. There are only a few simple rules you need to follow: 2.1. The package name. ---------------------- Finance::Quote expects that its loadable modules will be in the Finance::Quote namespace somewhere. Hence, if you were writing a module called "DodgyBank" that returned information on DodgyBank's managed funds, a reasonable name for that module would be Finance::Quote::DodgyBank. 2.2. The methods() subroutine. ------------------------------ Your module must have a subroutine named methods(). This function will be called by the Finance::Quote harness when it loads your module, and is used to determine which methods your module provides. The methods() function must return a hash of method names and subroutine references. For example, if you had written a module which provides access to DodgyBank's managed funds, you might have the following package Finance::Quote::DodgyBank; sub methods { return ( dodgyfunds => \&funds dodgyloans => \&loans ); } This would indicate that your package provides methods for "dodgyfunds" and "dodgyloans", and that the subroutines "funds" and "loans" should be called to access that information. The following method names should be used for the following information sources: Method-Name Source --------------------------------------------------------- australia Australian Stocks canada Canadian Stocks europe European Stocks fidelity Fidelity Investments nasdaq NASDAQ nyse New York Stock Exchange tiaacref TIAA-CREF troweprice T. Rowe. Price usa USA Stocks Method names should be lower-case, consist of alphanumeric characters (including underscore) only, and always begin with a letter. This is not enforced, but future versions of the Finance::Quote framework may rely upon it. It's strongly recommended that you also provide a unique name for your method, in case you (or others) wish to call that method exclusively in code. Hence if you had written a module to fetch information from the NYSE from Yohoo!, you might implement the following methods function: sub methods { return ( nyse => \&yohoo, yohoo => \&yohoo ); } This means that people who only want to use your function can use $quoter->fetch('yohoo',@stocks), but those who don't care where their NYSE stock information is fetched from can use $quoter->fetch('nyse',@stocks). The first form allows you to know exactly where the information is coming from. In the second, failover methods mean that many different functions could be used to fetch the stock information, not just the one you have defined. 2.3 The functions specified by methods(). ----------------------------------------- The functions referred to by methods() will be passed a Finance::Quote object when called, and a list of zero or more symbol names. The Finance::Quote object provides the following ready-to-use methods: user_agent(); # Provides a ready-to-use LWP::UserAgent parse_csv(); # Parses a list of comma-separated values # and returns an array. The user_agent() method should be used if possible to fetch the information, as it should be already configured to use the timeout, proxy, and other settings requested by the calling program. Your function should return a two-dimensional hash as specified in the Finance::Quote man-page. Eg: $hash{$symbol,'last'} = $last_price; $hash{$symbol,'name'} = $stock_name; # etc etc. When returning your hash, you should check the context that your function was called in. If it was called in a scalar context, then you should return a hashref instead. This can be easily done with the following: return wantarray() ? %hash : \%hash; It is ESSENTIAL that your hash contain a true value for {$symbol,'success'} for information that has been successfully obtained. If the information was not obtained for any reason, then {$symbol,'success'} should be set to a false value (preferably 0), and a human-readable error message placed in {$symbol,'errormsg'}. The following code snippet demonstrates this: sub funds { my $quoter = shift; # The Finance::Quote object. my @stocks = @_; my %info; my $DODGY_URL = "http://dodgybank.xxx/funds.csv?"; my $ua = $quoter->user_agent; # This gives us a user-agent # with timeouts, proxies, # etc already configured. my $response = $ua->request(GET $DODGY_URL); unless ($response->is_success) { foreach my $stock (@stocks) { $info{$stock,"success"} = 0; $info{$stock,"errormsg"} = "HTTP failure"; } return wantarray ? %info : \%info; } # Do stuff with the information returned.... } It is valid to use "return" with no arguments if all stock lookups failed, however this does not provide any information as to WHY the lookups failed. If at all possible, the errormsg labels should be set. It is also very very strongly recommended that you place your module's name in the {$stock,"source"} field. This allows others to check where information was obtained, and to use it appropriately. 2.4. Currency ------------- Finance::Quote has support for multiple currencies and for currency conversion. As long as you provide a little bit of information about the information you are returning, the Finance::Quote framework can do all the hard stuff for you. If you are returning information on a stock in a particular currency, then you can enter the ISO currency code into the "currency" field associated with the stock. Eg: $info{$stock,"currency"} = "AUD"; # Australian Dollars If the information you are returning does not have a currency (because it's an index like the Dow Jones Industrial or the All Oridinaries, or because you're returning percentages) then you should not set the currency field for that stock. Finance::Quote knows not to attempt currency conversion for stocks without a currency field. If you do have a currency field, then by default Finance::Quote will arrange for the automatic conversion of a number of fields. By default, these fields are last, high, low, net, bid, ask, close, open, day_range, year_range, eps, div, cap, nav and price. Of course, there may be some cases where this set is not appropriate, or where there are extra fields that should be converted. This can be indicated by writing a function called "currency_fields()" in your module, that returns a list of fields that can undergo currency conversion. Eg: sub currency_fields { return qw/high low price bid/; } currency_fields() will be passed a Finance::Quote object as its first argument, and a method called default_currency_fields() is available through this object. This is useful if you want to use the defaults, but also add some of your own: sub currency_fields { my $quoter = shift; return ($quoter->default_currency_fields, "commission"); } In the example above, the default fields would be available for currency conversion, but the "commission" field would also be converted. 2.5. Dates ---------- Do not parse dates directly in your module. Instead you should use the function $q->store_date(), which handles a variety of date formats. In its simplest form, you simply tell the function what format the date is in and it handles all the parsing. The code should look similar to this: $quoter->store_date(\%info, $stock, {eurodate => @$row[1]}); If the web site doesn't have a data available, somply call the function this way: $quoter->store_date(\%info, $stock, {today => 1}); See the documentation in Quote.pm for more information. 2.6. Things to avoid -------------------- Some sources of information will provide more stock information than requested. Some code may rely upon your code only returning information about the stocks that the caller requested. As such, you should never return information about stocks that were not requested, even if you fetch and/or process that information. 2.7. Using your new module -------------------------- Using your new module is easy. Normally when using Finance::Quote you'd do something like the following: use Finance::Quote; my $quoter = Finance::Quote->new(); To use your new module, simply specify the module name (without the Finance::Quote prefix) in the new function. Hence: use Finance::Quote; my $quoter = Finance::Quote->new("DodgyBank"); The DodgyBank methods will now be available: my %loaninfo = $quoter->fetch("dodgyloans","car","boat","house"); my %fundinfo = $quoter->fetch("dodgyfunds","lotto","shares"); The resulting Finance::Quote object will also arrange for your functions to be callable without using fetch. This syntax is strongly discouraged, as it results in pollution of the Finance::Quote namespace and provides little advantages over the fetch() method: my %loaninfo = $quoter->dodgyloans("car","boat","loan"); This mainly exists to maintain compatibility with previous versions of Finance::Quote. 3. How to contribute your module to the world. ============================================== If you'd like others to use your module, then send a post to to get in touch with the other finance-quote developers and maintainers. You can also submit your module using the patch manager at: http://sourceforge.net/project/?group_id=4232 4. How to find out more? ======================== The Finance::Quote webpage is located at: http://finance-quote.sourceforge.net/ You are welcome to make use of the tools at: http://sourceforge.net/project/?group_id=4232 5. How to join the mailing lists? ================================= There are two mailing lists for Finance::Quote. These can both be accessed from: http://sourceforge.net/mail/?group_id=4232 Finance-Quote-1.38/Documentation/License000644 000765 000024 00000043110 12566055631 017763 0ustar00ecstaff000000 000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. Finance-Quote-1.38/Documentation/README000644 000765 000024 00000003506 12566055631 017343 0ustar00ecstaff000000 000000 Welcome to Finance::Quote ========================= Maintained by: Paul Fenwick Erik Colson What does Finance::Quote provide? ================================= Finance::Quote provides access to time-delayed stockquotes from a number of sources. After you've installed the pacakage, try 'perldoc Finance::Quote' for full information. Alternatively, you can 'perldoc lib/Finance/Quote.pm' before the install. How do I install this package? ============================== See the `INSTALL' file. It's very simple. I've found a bug / written a patch / have an idea. What do I do? ================================================================= Well, you could always mail it to , which is read by all the active developers. Alternatively, you might wish to visit . How do I download the most recent copy of Finance::Quote? ========================================================= You can find all releases of Finance::Quote at: . You might also wish to consider subscribing to finance-quote-news, which can be done from: . How can I get a copy of the current CVS development tree? ========================================================= You can't. The CVS repo has been ported to GIT as of version 1.13_01. How can I get a copy of the current GIT development tree? ========================================================= The GIT repository is available at: . Where can I find more information? ================================== Try the Finance::Quote webpage. There are lots of goodies there. http://finance-quote.sourceforge.net/ Finance-Quote-1.38/debian/changelog000644 000765 000024 00000000571 12566055631 016745 0ustar00ecstaff000000 000000 libfinance-quote-perl (1.06-1) unstable; urgency=low * Version update. -- Ross Peachey Tue, 03 Jul 2001 21:14:12 +1000 libfinance-quote-perl (1.05-1) unstable; urgency=low * Initial Debian release. -- Ross Peachey Wed, 14 Feb 2001 15:24:49 +1100 Local variables: mode: debian-changelog user-mail-address: "rcp@debian.org" End: Finance-Quote-1.38/debian/control000644 000765 000024 00000000701 12566055631 016471 0ustar00ecstaff000000 000000 Source: libfinance-quote-perl Section: interpreters Priority: optional Maintainer: Ross Peachey Standards-Version: 3.5.2 Package: libfinance-quote-perl Architecture: all Depends: ${perl:Depends}, libhtml-tableextract-perl, debhelper(>=2.0.86) Description: Perl module for retrieving stock quotes from a variety of sources This is a Perl module that retrieves stock quotes and other securities information from various locations Finance-Quote-1.38/debian/copyright000644 000765 000024 00000001227 12566055631 017025 0ustar00ecstaff000000 000000 This is Debian GNU/Linux's prepackaged version of Finance::Quote. This is a set of perl modules which provide access to securities prices. This package was put together by Ross Peachey , from the original sources, available from: http://sourceforge.net/projects/finance-quote/ The library is also available from the Comprehensive Perl Archive Network (CPAN). Visit to find a CPAN site near you. The only change for the Debian package was the addition of the debian/ files. Finance::Quote is released under the GNU Public Licence, which can be found in /usr/share/common-licenses/GPL on Debian systems. Finance-Quote-1.38/debian/rules000755 000765 000024 00000003716 12566055631 016157 0ustar00ecstaff000000 000000 #! /usr/bin/make -f # -*- makefile -*- # debian/rules file for the Debian/GNU Linux libfinance-yahooquote-perl package # Copyright (C) 1999 by Dirk Eddelbuettel package := $(shell grep Package debian/control | sed 's/^Package: //') version := $(shell head -1 debian/changelog | \ perl -nle 'm/\S+\s+\((\S+)\)/ && print $$1') debtmp := $(shell pwd)/debian/tmp debdoc := $(debtmp)/usr/share/doc/$(package) # New Perl Policy by Raphael ifndef PERL PERL = /usr/bin/perl endif TMP =`pwd`/debian/tmp archlib =`$(PERL) -MConfig -e 'print $$Config{installarchlib}'` config =INSTALLDIRS=perl INSTALLMAN1DIR=$(TMP)/usr/share/man/man1 INSTALLMAN3DIR=$(TMP)/usr/share/man/man3 INSTALLPRIVLIB=$(TMP)/usr/lib/perl5 INSTALLARCHLIB=$(TMP)$(archlib) build: build-stamp build-stamp: dh_testdir $(PERL) Makefile.PL $(config) $(MAKE) CFLAGS="-O2 -g -Wall" touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp -test -f Makefile && $(MAKE) realclean dh_clean binary-indep: build dh_testdir dh_testroot dh_clean -k dh_installdirs $(MAKE) pure_install dh_perl find `pwd`/debian/tmp -type f -name .packlist | xargs -r rm -f -find `pwd`/debian/tmp -type d -empty | xargs -r rmdir -p --ignore-fail-on-non-empty dh_installdocs Documentation/README \ Documentation/Hackers-Guide Documentation/FAQ dh_installexamples Examples/*.pl # dh_installmenu # dh_installinit # dh_installcron # dh_installmanpages # dh_undocumented dh_installchangelogs ChangeLog dh_compress dh_fixperms # dh_suidregister dh_installdeb dh_gencontrol dh_md5sums dh_builddeb binary-arch: build source diff: @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary