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 )