[GNC] When will there be a new Finance::Quote version on CPAN?
nvsoar
nvsoar at charter.net
Sat Dec 1 18:29:28 EST 2018
On 12/01/18 10:47, Eric Coates wrote:
> Hi
>
> I am about to expose my ignorance - sensitive people should look away
> now!
>
> I have found the file referred to (I think); on my Ubuntu system I
> found it at
>
> ~/.cpan/build/Finance-Quote-1.47-JrEF3h/lib/Finance/quote
>
> The last few lines of the file are:
>
> # divide USD quotes by 100 if suffix is '.IL'
> if ( ($suffix eq '.IL') && ($info{$stock,'currency'}
> eq 'USD') ) {
> foreach my $field (
> $quoter->default_currency_fields ) {
> next unless ( $info{ $stock, $field } );
> $info{ $stock, $field } =
> $quoter->scale_field( $info{ $stock,
> $field },
> 0.01 );
> }
> }
> }
> }
> else {
> $info{ $stock, 'currency' } = 'USD';
> }
>
> $info{ $stock, "currency_set_by_fq" } = 1;
>
> $quantity--;
> select(undef, undef, undef, .7) if ($quantity); sleep(15);
> }
>
> return wantarray() ? %info : \%info;
> }
>
> Unfortunately I am completely ignorant of Perl (I guess that's what it
> is). Could you please indicate exactly where the 'sleep 15' should be
> entered. And, if it's to be indented, is the indentation done with
> spaces or tabs and is the number of spaces/tabs critical.
>
> Many thanks
>
> Eric
>
> And, because I enjoy coincidences, , best wishes from the Soar Valley
> - the Soar being our local river
snip
Eric,
See the mod I made in your message above at the "select(undef, undef,
undef, .7) if ($quantity); line".
Attached to this message are: a modified version of AlphaVantage.pm ( a
text file) for my Win10 system; and an image of Ameet Sengar's message
of last Sept. Check and set the properties of AlphaVantage.pm to read
only if you choose to replace that file as a unit.
Have no idea why Sengar's message wasn't included in the 29Nov note.
Please be aware that while I have an Ubuntu system, I have had no
experience with Gnucash on that system.
All the best, nvsoar
-------------- next part --------------
#!/usr/bin/perl -w
# This module is based on the Finance::Quote::yahooJSON module
#
# 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::AlphaVantage;
require 5.005;
our $VERSION = '1.47'; # VERSION
use strict;
use JSON qw( decode_json );
use HTTP::Request::Common;
my $ALPHAVANTAGE_URL =
'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&outputsize=compact&datatype=json';
my $ALPHAVANTAGE_API_KEY = $ENV{'ALPHAVANTAGE_API_KEY'};
my %currencies_by_suffix = (
# 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
'.IL' => "USD", # United Kingdom London USD*100
);
sub methods {
return ( alphavantage => \&alphavantage, );
our @labels = qw/date isodate open high low close volume last/;
sub labels {
return ( alphavantage => \@labels, );
}
}
sub alphavantage {
my $quoter = shift;
my @stocks = @_;
my $quantity = @stocks;
my ( %info, $reply, $url );
my $ua = $quoter->user_agent();
foreach my $stock (@stocks) {
if ( !defined $ALPHAVANTAGE_API_KEY ) {
$info{ $stock, 'success' } = 0;
$info{ $stock, 'errormsg' } =
'Expected ALPHAVANTAGE_API_KEY to be set; get an API key at https://www.alphavantage.co';
next;
}
$url =
$ALPHAVANTAGE_URL
. '&apikey='
. $ALPHAVANTAGE_API_KEY
. '&symbol='
. $stock;
$reply = $ua->request( GET $url);
my $code = $reply->code;
my $desc = HTTP::Status::status_message($code);
my $body = $reply->content;
if ($code != 200) {
$info{ $stock, 'success' } = 0;
$info{ $stock, 'errormsg' } = $desc;
next;
}
my $json_data;
eval {$json_data = JSON::decode_json $body};
if ($@) {
$info{ $stock, 'success' } = 0;
$info{ $stock, 'errormsg' } = $@;
}
if ( !$json_data || $json_data->{'Error Message'} ) {
$info{ $stock, 'success' } = 0;
$info{ $stock, 'errormsg' } =
$json_data->{'Error Message'} || $json_data->{'Information'};
next;
}
my $last_refresh = $json_data->{'Meta Data'}->{'3. Last Refreshed'}; # when market is open this returns an isodate + time, otherwise only the isodate
$last_refresh = substr($last_refresh,0,10); # remove time if returned
if ( !$last_refresh ) {
$info{ $stock, 'success' } = 0;
$info{ $stock, 'errormsg' } = "json_data doesn't contain Last Refreshed";
next;
}
my $isodate = substr( $last_refresh, 0, 10 );
if ( !$json_data->{'Time Series (Daily)'} ) {
$info{ $stock, 'success' } = 0;
$info{ $stock, 'errormsg' } = "json_data doesn't contain Time Series hash";
next;
}
if ( !$json_data->{'Time Series (Daily)'}->{$last_refresh} ) {
$info{ $stock, 'success' } = 0;
$info{ $stock, 'errormsg' } = "json_data doesn't contain latest refresh data in Time Series hash";
next;
}
my %ts = %{ $json_data->{'Time Series (Daily)'}->{$last_refresh} };
if ( !%ts ) {
$info{ $stock, 'success' } = 0;
$info{ $stock, 'errormsg' } = 'Could not extract Time Series data';
next;
}
# %ts holds data as
# {
# '1. open' 151.5400,
# '2. high' 151.5900,
# '3. low' 151.5300,
# '4. close' 151.5900,
# '5. volume' 57620
# }
$info{ $stock, 'success' } = 1;
$info{ $stock, 'symbol' } = $json_data->{'Meta Data'}->{'2. Symbol'};
$info{ $stock, 'open' } = $ts{'1. open'};
$info{ $stock, 'close' } = $ts{'4. close'};
$info{ $stock, 'last' } = $ts{'4. close'};
$info{ $stock, 'high' } = $ts{'2. high'};
$info{ $stock, 'low' } = $ts{'3. low'};
$info{ $stock, 'volume' } = $ts{'5. volume'};
$info{ $stock, 'method' } = 'alphavantage';
$quoter->store_date( \%info, $stock, { isodate => $isodate } );
# deduce currency
if ( $stock =~ /(\..*)/ ) {
my $suffix = $1;
if ( $currencies_by_suffix{$suffix} ) {
$info{ $stock, 'currency' } = $currencies_by_suffix{$suffix};
# divide GBP quotes by 100
if ( ($info{ $stock, 'currency' } eq 'GBP') || ($info{$stock,'currency'} eq 'GBX') ) {
foreach my $field ( $quoter->default_currency_fields ) {
next unless ( $info{ $stock, $field } );
$info{ $stock, $field } =
$quoter->scale_field( $info{ $stock, $field },
0.01 );
}
}
# divide USD quotes by 100 if suffix is '.IL'
if ( ($suffix eq '.IL') && ($info{$stock,'currency'} eq 'USD') ) {
foreach my $field ( $quoter->default_currency_fields ) {
next unless ( $info{ $stock, $field } );
$info{ $stock, $field } =
$quoter->scale_field( $info{ $stock, $field },
0.01 );
}
}
}
}
else {
$info{ $stock, 'currency' } = 'USD';
}
$info{ $stock, "currency_set_by_fq" } = 1;
$quantity--;
select(undef, undef, undef, .7) if ($quantity); sleep(15);
}
return wantarray() ? %info : \%info;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: AmeetSengarAlphaVantage.pmModified.JPG
Type: image/jpeg
Size: 83626 bytes
Desc: not available
URL: <http://lists.gnucash.org/pipermail/gnucash-user/attachments/20181201/b821496e/attachment-0001.jpe>
More information about the gnucash-user
mailing list