View Source ExTrade
WIP: Not recommended for use in any sort of production setting or with production API credentials.
ExTrade is an Elixir client library for interacting with the E*TRADE API.
installation
Installation
Install this package by adding extrade
to your list of dependencies in mix.exs
.
def deps do
[
{:extrade, "~> 0.0.1"}
]
end
You can now run mix deps.get
.
configuration
Configuration
Within config.exs
or within the environment specific config files (e.g. dev.exs
) add your E*TRADE API credentials and the appropriate environment (:sandbox
for testing, :production
for the real deal).
config :extrade,
api_key: "<API_KEY>",
api_secret: "<API_SECRET",
environment: :sandbox
usage
Usage
oauth
OAuth
ExTrade manages current authorization state (e.g., request and access tokens) in a supervised process, which serves as an in-memory data store for constructing the necessary "Authorization" header for each API request, per the OAuth 1.0 specification that E*TRADE follows.
The flow within ExTrade is as follows:
- Generate the request token and authorization URL, all done via
ExTrade.Authorization.get_authorization_url/0
- Follow the URL provided from the prior step and authenticate with E*TRADE, then note the verifier code presented.
- Pass the verifier code to
ExTrade.Authorization.get_access_token/1
E.g.,
iex> ExTrade.Authorization.get_authorization_ur()
{:ok, "https://us.etrade.com/e/t/etws/authorize?key=abc&token=def"}
iex> ExTrade.Authorization.get_access_token("ZYXWV") # Retrieved from the E*TRADE Auth UI
:ok
At this point you are now ready to begin making API calls.
Note
The access token will become "inactive" after two hours of inactivity. Using renew_access_token/0
will reactivate the inactive access token.
By default, all access tokens are "expired" at the end of the current calendar day, US Eastern time. Once the token has expired, no requests will be processed for that token until the OAuth process is repeated and a new access token is retrieved.
api
API
ExTrade will map each returned object and its nested objects into an internal struct. It does so with some opinions on key naming and will re-format keys for clarity and consistency. For example, the keys "dividend"
and "divYield"
will be cast to :dividend
and :dividend_yield
, respectively.
Currently, only the Accounts
and Alerts
(sans Delete Alerts
) sections are implemented.
Example
iex> ExTrade.Accounts.list_accounts()
{:ok,
[
%ExTrade.Accounts.Account{
account_description: "Brokerage",
account_id: "82314598",
account_id_key: "dBZOKt9xDrtRSAOl4MSiiA",
account_mode: "IRA",
account_name: "NickName-1",
account_status: "ACTIVE",
account_type: "MARGIN",
closed_date: nil,
institution_type: "BROKERAGE",
is_shareworks_account: false
},
%ExTrade.Accounts.Account{
account_description: "Complete Savings",
account_id: "58315636",
account_id_key: "vQMsebA1H5WltUfDkJP48g",
...
},
...
]}