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 )