Finance-Robinhood
view release on metacpan or search on metacpan
lib/Finance/Robinhood/Order.pm view on Meta::CPAN
package Finance::Robinhood::Order;
use 5.010;
use Carp;
our $VERSION = "0.21";
use Moo;
use strictures 2;
use namespace::clean;
require Finance::Robinhood;
#
has $_ => (is => 'ro', required => 1)
for (qw[average_price id cumulative_quantity fees price quantity
override_dtbp_checks extended_hours override_day_trade_checks
reject_reason side state stop_price time_in_force trigger type url]
);
has $_ => (is => 'ro',
required => 1,
coerce => \&Finance::Robinhood::_2_datetime
) for (qw[created_at last_transaction_at updated_at]);
has $_ => (is => 'bare', required => 1, accessor => "_get_$_")
for (qw[cancel executions position]);
has $_ => (
is => 'bare',
accessor => "_get_$_",
weak_ref => 1,
required => 1,
#lazy => 1,
#builder => sub { shift->account()->_get_rh() }
) for (qw[rh]);
has $_ => (is => 'bare', required => 1, accessor => "_get_$_")
for (qw[account instrument]);
around BUILDARGS => sub {
my ($orig, $class, @args) = @_;
# If this is a new order, create it with the API first
if (!defined {@args}->{url}) {
my ($status, $data, $raw)
= {@args}->{account}->_get_rh()->_send_request(
'POST',
Finance::Robinhood::endpoint('orders'),
{account => {@args}->{account}->_get_url(),
instrument => {@args}->{instrument}->url(),
symbol => {@args}->{instrument}->symbol(),
price => {@args}->{price}
// {@args}->{instrument}->last_extended_hours_trade_price()
// {@args}->{instrument}->quote->bid_price(),
(map {
{@args}
->{$_} ? ($_ => ({@args}->{$_} ? 'true' : 'false')) : ()
} qw[override_dtbp_checks extended_hours override_day_trade_checks]
),
(map {
{@args}
->{$_} ? ($_ => {@args}->{$_}) : ()
} qw[type trigger time_in_force stop_price side quantity]
)
}
);
croak join ' ', @{$data->{non_field_errors}}
if $data->{non_field_errors};
croak $data->{detail} // join ' ',
map { $_ . ': ' . join ' ', @{$data->{$_}} } keys %$data
if $status == 400;
$data->{rh} = {@args}->{account}->_get_rh();
@args = $data;
}
return $class->$orig(@args);
};
sub account {
my $self = shift;
my $result
= $self->_get_rh()->_send_request('GET', $self->_get_account());
return $result
?
Finance::Robinhood::Account->new(rh => $self->_get_rh, %$result)
: ();
}
sub executions {
my $self = shift;
my $return = $self->_get_executions();
map {
$_->{settlement_date}
= Finance::Robinhood::_2_datetime($_->{settlement_date});
$_->{timestamp} = Finance::Robinhood::_2_datetime($_->{timestamp})
} @$return;
return $return;
}
sub instrument {
my $self = shift;
my $result
= $self->_get_rh()->_send_request('GET', $self->_get_instrument());
return $result ? Finance::Robinhood::Instrument->new($result) : ();
}
sub position {
my $self = shift;
my $result
( run in 2.118 seconds using v1.01-cache-2.11-cpan-364913b4093 )