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
#!/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;
}
_______________________________________________
gnucash-user mailing list
[email protected]
To update your subscription preferences or to unsubscribe:
https://lists.gnucash.org/mailman/listinfo/gnucash-user
If you are using Nabble or Gmane, please see
https://wiki.gnucash.org/wiki/Mailing_Lists for more information.
-----
Please remember to CC this list on all your replies.
You can do this by using Reply-To-List or Reply-All.