#!/usr/bin/env perl
use strict;
use warnings;
use lib '..\lib';
use Getopt::Long qw(GetOptions);
use Pod::Usage qw(pod2usage);
use Finance::Robinhood;
$|++;
#
my ($help, $man, # Pod::Usage
$verbose, # Debugging
$username, $password, # New login
$token, # Stored access token
$symbol, $quantity
); # What to buy and how much
## Parse options and print usage if there is a syntax error,
## or if usage was explicitly requested.
GetOptions('help|?' => \$help,
man => \$man,
'verbose+' => \$verbose,
'username:s' => \$username,
'password:s' => \$password,
'token:s' => \$token,
'symbol=s' => \$symbol,
'quantity=i' => \$quantity
) or pod2usage(2);
pod2usage(1) if $help;
pod2usage(-verbose => 2) if $man;
pod2usage("$0: Not sure what to buy.") if !$symbol;
pod2usage("$0: Not sure how many shares of $symbol to buy.") if !$quantity;
pod2usage(
-message =>
"$0: Missing or incomplete username/password combo given and no authorization token either.",
-verbose => 1,
-exitval => 1
) if !(($username && $password) || ($token));
$Finance::Robinhood::DEBUG = $verbose; # Debugging!
#
my $rh = new Finance::Robinhood($token ? (token => $token) : ());
if ($username && $password && !$token) {
$rh->login($username, $password) || exit;
print "*** In the future, you may use $0 -token="
. $rh->token()
. " ...\n";
}
my $account = $rh->accounts()->{results}[0]; # Accounts are a paginated list
my $instrument = $rh->instrument($symbol); # Find the instrument we want
my $order =
Finance::Robinhood::Order->new(
account => $account,
instrument => $instrument,
type => 'limit',
price => $instrument->last_extended_hours_trade_price
// $instrument->last_trade_price // $instrument->quote()->ask_price(),
trigger => 'immediate',
time_in_force => 'gfd',
side => 'buy',
quantity => $quantity,
extended_hours => 1
);
$order
&& printf
'Market order to buy %d share%s of %s (%s) placed for $%f/share at %s',
$order->quantity(),
($order->quantity() > 1 ? 's' : ''),
$order->instrument->symbol(),
$order->instrument->name(),
$order->price(),
$order->updated_at();
__END__
=head1 NAME
buy - Buy Stocks for Free from the Command Line
=head1 SYNOPSIS
buy -symbol=... -quantity=... [options]
Examples:
buy -username=getMoney -password=*** -symbol=MSFT -quantity=2000
buy -token=9afcdbe... -symbol=MSFT -quantity=2000
Options:
-username your Robinhood username
-password your Robinhood password
-token your Robinhood access token
-symbol trading symbol of the security *
-quantity number of shares to buy *
-help brief help message
-man full documentation
* required arguments
=head1 OPTIONS
=over 4
=item B<-username>
Your Robinhood username.
=item B<-password>
Your Robinhood password.
=item B<-token>
Robinhood provides access tokens for authorization which is great because you
don't need to keep providing your username or password on the command line!
You can get it by passing a false C<-token> arg along with your C<-username>
and C<-password>:
$ buy -username=secret -password=supersecret -token=0 -symbol=MSFT -quantity=200
And on subsequent runs, just provide the C<-token>:
$ buy -token=a9c321... -symbol=RHT -quantity=50
=item B<-symbol>
The ticker symbol of the security you'd like to place an order for.
=item B<-quantity>
The number of shares you'd like to order.
=item B<-verbose>
Dumps a lot of random debugging stuff to the terminal including private keys.
B<Be very careful where you use this!>
=item B<-help>
Print a brief help message and exits.
=item B<-man>
Prints the manual page and exits.
=back
=head1 DESCRIPTION
B<buy> will place a market order for the security of your choice to
be executed immediatly.
=cut