Finance-Alpaca
view release on metacpan or search on metacpan
lib/Finance/Alpaca.pm view on Meta::CPAN
return $res->is_error
? $res->json
: ( ArrayRef [ Dict [ body => Order, id => Uuid, status => Int ] ] )
->assert_coerce( $res->json );
}
sub close_position ( $s, $symbol_or_asset_id, $qty = () ) {
my $res
= $s->ua->get(
$s->endpoint . '/v2/positions/' . $symbol_or_asset_id . ( $qty ? '?qty=' . $qty : '' ) )
->result;
return $res->is_error ? () : to_Order( $res->json );
}
sub portfolio_history ( $s, %params ) {
$params{extended_hours} = ( !!$params{extended_hours} ) ? 'true' : 'false'
if defined $params{extended_hours};
$params{date_end}
= ref $params{date_end} eq 'Time::Moment'
? $params{date_end}->strftime('%F')
: $params{date_end}
if defined $params{date_end};
my $res = $s->ua->get( $s->endpoint . '/v2/account/portfolio/history' => json => \%params )
->result;
return $res->is_error ? $res->json : (
Dict [
base_value => Num,
equity => ArrayRef [Num],
profit_loss => ArrayRef [Num],
profit_loss_pct => ArrayRef [Num],
timeframe => Str,
timestamp => ArrayRef [Timestamp]
]
)->assert_coerce( $res->json );
}
sub watchlists ($s) {
return
@{ ( ArrayRef [Watchlist] )
->assert_coerce( $s->ua->get( $s->endpoint . '/v2/watchlists' )->result->json ) };
}
sub create_watchlist ( $s, $name, @symbols ) {
my $res
= $s->ua->post( $s->endpoint
. '/v2/watchlists' => json =>
{ name => $name, ( @symbols ? ( symbols => \@symbols ) : () ) } )->result;
return $res->is_error ? ( $res->json ) : to_Watchlist( $res->json );
}
sub delete_watchlist ( $s, $watchlist_id ) {
my $res = $s->ua->delete( $s->endpoint . '/v2/watchlists/' . $watchlist_id )->result;
return $res->is_error ? $res->json : 1;
}
sub watchlist ( $s, $watchlist_id ) {
my $res = $s->ua->get( $s->endpoint . '/v2/watchlists/' . $watchlist_id )->result;
return $res->is_error ? ( $res->json ) : to_Watchlist( $res->json );
}
sub update_watchlist ( $s, $watchlist_id, %params ) {
my $res
= $s->ua->put( $s->endpoint . '/v2/watchlists/' . $watchlist_id => json => {%params} )
->result;
return $res->is_error ? ( $res->json ) : to_Watchlist( $res->json );
}
sub add_to_watchlist ( $s, $watchlist_id, $symbol ) {
my $res
= $s->ua->post(
$s->endpoint . '/v2/watchlists/' . $watchlist_id => json => { symbol => $symbol } )
->result;
return $res->is_error ? ( $res->json ) : to_Watchlist( $res->json );
}
sub remove_from_watchlist ( $s, $watchlist_id, $symbol ) {
my $res = $s->ua->delete( $s->endpoint . '/v2/watchlists/' . $watchlist_id . '/' . $symbol )
->result;
return $res->is_error ? ( $res->json ) : to_Watchlist( $res->json );
}
sub configuration ($s) {
my $res = $s->ua->get( $s->endpoint . '/v2/account/configurations' )->result;
return $res->is_error ? ( $res->json ) : to_Configuration( $res->json );
}
sub modify_configuration ( $s, %params ) {
my $res = $s->ua->patch( $s->endpoint . '/v2/account/configurations' => json => {%params} )
->result;
return $res->is_error ? ( $res->json ) : to_Configuration( $res->json );
}
sub activities ( $s, %params ) {
$params{activity_types} = join ',', @{ $params{activity_types} } if $params{activity_types};
my $params = '';
$params .= '?' . join '&', map {
$_ . '='
. (
ref $params{$_} eq 'Time::Moment' ? $params{$_}->to_string()
: ref $params{$_} eq 'ARRAY' ? @{ $params{$_} }
: $params{$_}
)
} keys %params if keys %params;
my $res = $s->ua->get(
sprintf $s->endpoint . '/v2/account/activities%s',
$params ? $params : ''
)->result;
return $res->is_error
? $res->json
: map { $_->{activity_type} eq 'FILL' ? to_TradeActivity($_) : to_Activity($_) }
@{ $res->json };
}
}
1;
__END__
=encoding utf-8
=head1 NAME
Finance::Alpaca - Perl Wrapper for Alpaca's Commission-free Stock Trading API
( run in 0.564 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )