Finance-MtGox
view release on metacpan or search on metacpan
lib/Finance/MtGox.pm view on Meta::CPAN
}
return $paid_usd / $bought_btc;
}
=head2 market_price
Returns a volume-weighted USD price per BTC based on MtGox trades within
the last 24 hours. Returns C<undef> if there have been no trades in the
last 24 hours.
=cut
sub market_price {
my ($self) = @_;
my $trades = $self->call('getTrades');
my $threshold = time - 86400; # last 24 hours
my $trade_count = 0;
my $trade_volume_btc = 0;
my $trade_volume_usd = 0;
for my $trade (@$trades) {
next if $trade->{date} < $threshold;
$trade_count++;
$trade_volume_btc += $trade->{amount};
$trade_volume_usd += $trade->{price} * $trade->{amount};
}
return if $trade_count == 0;
return if $trade_volume_btc == 0;
return $trade_volume_usd / $trade_volume_btc;
}
### Private methods below here
sub _decode {
my ($self) = @_;
return $self->_json->decode( $self->_mech->content );
}
sub _json {
my ($self) = @_;
return $self->{json};
}
sub _mech {
my ($self) = @_;
return $self->{mech};
}
sub _key {
my ($self) = @_;
return $self->{key};
}
sub _secret {
my ($self) = @_;
return $self->{secret};
}
# build a URI object for the endpoint of an API call
sub _build_api_method_uri {
my ( $self, $version, $name, $prefix ) = @_;
my $version_url_token = "api/" . $version;
$prefix = $prefix ? "$prefix/" : '';
return URI->new($version == 0 ?
"https://mtgox.com/$version_url_token/$prefix$name.php"
: "https://data.mtgox.com/$version_url_token/$prefix$name");
}
# builds an HTTP::Request object for making an API call
sub _build_api_method_request {
my ( $self, $method, $version, $name, $prefix, $params ) = @_;
$method = uc $method;
$params ||= {};
# prepare for authentication
if ( $method eq 'POST') {
$params->{nonce} = $self->_generate_nonce;
}
my $uri = $self->_build_api_method_uri( $version, $name, $prefix );
if ( $method eq 'GET') {
# since March 19, 2013 no-auth requests need this hostname
$uri->scheme('http');
$uri->host('data.mtgox.com');
}
my $req = HTTP::Request->new( $method, $uri );
if ( keys %$params ) {
$uri->query_form($params);
if ( $method eq 'POST' ) {
# move params to the request body
my $query = $uri->query;
my $message = $version == 2 ? "$name\0$query" : $query;
$req->header( 'Content-Type' => 'application/x-www-form-urlencoded' );
$req->content($query);
$uri->query(undef);
# include a signature
$req->header( 'Rest-Key', $self->_key );
$req->header( 'Rest-Sign', $self->_sign($message) );
}
}
return $req;
}
# Returns an ever-increasing nonce value
# (Fails to increase when the system clock adjusts backwards)
sub _generate_nonce {
return sprintf '%s%06s', gettimeofday()
}
# Returns a signature for the given message (using the API secret)
sub _sign {
my ( $self, $message ) = @_;
my $secret = decode_base64( $self->_secret );
return encode_base64( hmac_sha512( $message, $secret ) );
}
( run in 0.681 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )