Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/alpacahq/alpaca-trade-api-js
Node.js library for Alpaca Trade API.
https://github.com/alpacahq/alpaca-trade-api-js
api hacktoberfest javascript trading
Last synced: about 16 hours ago
JSON representation
Node.js library for Alpaca Trade API.
- Host: GitHub
- URL: https://github.com/alpacahq/alpaca-trade-api-js
- Owner: alpacahq
- License: apache-2.0
- Created: 2018-09-11T04:58:58.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-08-26T08:39:55.000Z (4 months ago)
- Last Synced: 2024-12-20T08:01:03.397Z (8 days ago)
- Topics: api, hacktoberfest, javascript, trading
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/@alpacahq/alpaca-trade-api
- Size: 877 KB
- Stars: 524
- Watchers: 44
- Forks: 136
- Open Issues: 37
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Codeowners: CODEOWNERS
Awesome Lists containing this project
README
# Alpaca Trade API JS
[![npm version](https://img.shields.io/npm/v/@alpacahq/alpaca-trade-api.svg)](https://www.npmjs.com/package/@alpacahq/alpaca-trade-api)
[![CircleCI](https://circleci.com/gh/alpacahq/alpaca-trade-api-js.svg?style=shield)](https://circleci.com/gh/alpacahq/alpaca-trade-api-js)Node.js library for Alpaca Trade API.
## API Documentation
The REST API documentation can be found in https://docs.alpaca.markets. For detailed information about an endpoint, please consult the REST API docs. Documentation specific to this library can be found below.
### News
We introduced Typescript support recently, which allows you to use strongly typed data structures and better IDE experience if you are using it.
## Installation
```sh
npm install --save @alpacahq/alpaca-trade-api
```## Runtime Dependencies
- Node.js v16.9 or newer
- npm version 6 and above## Usage
Import the module first.
```js
const Alpaca = require('@alpacahq/alpaca-trade-api')
```Instantiate the API with config options, obtained from the dashboard at app.alpaca.markets.
```js
const alpaca = new Alpaca({
keyId: 'AKFZXJH121U18SHHDRFO',
secretKey: 'pnq4YHlpMF3LhfLyOvmdfLmlz6BnASrTPQIASeiU',
paper: true,
})
```Note: `keyId` and `secretKey` may also be specified by setting the `APCA_API_KEY_ID` and `APCA_API_SECRET_KEY` environment variables, respectively. Also, rather than specifying `paper`, you may set `APCA_API_BASE_URL` as an environment variable to direct your API calls to the paper trading API.
Call methods, which will return a promise.
```js
alpaca.getAccount().then((account) => {
console.log('Current Account:', account)
})
```The websocket api is a good way to watch and react to the market
we have 2 types of websockets:
- data websocket: get updates to data equities
- account/trade websocket: get updates on your accountplease refer to this [example](https://github.com/alpacahq/alpaca-trade-api-js/blob/master/examples/websocket_example_datav2.js)
code to see how to use the websockets.##### Data WS
The Alapca websocket service now supports V2. Make sure you update your old sample code accordingly.
You could use it even if you don't have a funded account.## Methods
As a general rule, required method parameters are passed as plain function arguments, and the final parameter is an object containing any optional parameters to the method.
### Account API
#### Get Account
Calls `GET /account` and returns the current account.
```ts
getAccount() => Promise
```### Account Configurations API
#### Get Account Configurations
Calls `GET /account/configurations` and returns the current account configurations.
```ts
getAccountConfigurations() => Promise
```#### Update Account Configurations
Calls `PATCH /account/configurations` to update the account configurations, and returns
the updated configurations.```ts
updateAccountConfigurations(AccountConfigurations) => Promise
```#### Get Account Activities
Calls `GET /account/activities` and returns account activities.
```ts
getAccountActivities({
activityTypes: string | string[], // Any valid activity type
until: Date,
after: Date,
direction: string,
date: Date,
pageSize: number,
pageToken: string
}) => Promise
```### Portfolio History API
#### Get Portfolio History
Calls `GET /account/portfolio/history` and returns portfolio history.
```ts
getPortfolioHistory({
date_start: Date,
date_end: Date,
period: '1M' | '3M' | '6M' | '1A' | 'all' | 'intraday',
timeframe: '1Min' | '5Min' | '15Min' | '1H' | '1D',
extended_hours: Boolean
}) => Promise
```### Orders API
#### Create Order
Calls `POST /orders` and creates a new order.
```ts
createOrder({
symbol: string, // any valid ticker symbol
qty: number,
notional: number, // qty or notional required, not both
side: 'buy' | 'sell',
type: 'market' | 'limit' | 'stop' | 'stop_limit' | 'trailing_stop',
time_in_force: 'day' | 'gtc' | 'opg' | 'ioc',
limit_price: number, // optional,
stop_price: number, // optional,
client_order_id: string, // optional,
extended_hours: boolean, // optional,
order_class: string, // optional,
take_profit: object, // optional,
stop_loss: object, // optional,
trail_price: string, // optional,
trail_percent: string // optional,
}) => Promise
```#### Get Orders
Calls `GET /orders` and returns a list of orders.
```ts
getOrders({
status: 'open' | 'closed' | 'all',
after: Date,
until: Date,
limit: number,
direction: 'asc' | 'desc'
}) => Promise
```#### Get Order by ID
Calls `GET /orders/{id}` and returns an order.
```ts
getOrder(uuid) => Promise
```#### Get Order by Client ID
Calls `GET /orders:by_client_order_id` and returns an order by `client_order_id`.
You can set `client_order_id` upon order creation to more easily keep track of your orders.```ts
getOrderByClientOrderId(string) => Promise
```#### Update Order by ID
Calls `PATCH /orders/{id}` and updates an existing open order. The updated order will have
a new ID.```ts
replaceOrder(uuid) => Promise
```#### Cancel Order
Calls `DELETE /orders/{id}` and deletes an order.
```ts
cancelOrder(uuid) => Promise
```#### Cancel all Orders
Calls `DELETE /orders` and deletes all open orders.
```ts
cancelAllOrders() => Promise
```### Positions API
#### Get Position
Calls `GET /positions/{symbol}` and returns a position.
```ts
getPosition(symbol) => Promise
```#### Get All Positions
Calls `GET /positions` and returns all positions.
```ts
getPositions() => Promise
```#### Close a Position
Calls `DELETE /positions/{symbol}` and liquidates your position in the given symbol.```ts
closePosition(symbol) => Promise
```#### Close all Positions
Calls `DELETE /positions` and liquidates all open positions.```ts
closeAllPositions() => Promise
```### Assets API
#### Get All Assets
Calls `GET /assets` and returns assets matching your parameters.
```ts
getAssets({
status: 'active' | 'inactive',
asset_class: string
}) => Promise
```#### Get information about an asset
Calls `GET /assets/{symbol}` and returns an asset entity.
```ts
getAsset(symbol) => Promise
```### Calendar API
Calls `GET /calendar` and returns the market calendar.
```ts
getCalendar({ start: Date, end: Date }) => Promise
```### Clock API
Calls `GET /clock` and returns the market clock.
```ts
getClock() => Promise
```### Watchlist API
available methods for you to use:```js
module.exports = {
getWatchlists,
getWatchlist,
addWatchlist,
addToWatchlist,
updateWatchlist,
deleteWatchlist,
deleteFromWatchlist,
}
```#### Get All Watchlists
```js
alpaca.getWatchlists().then((response) => {
console.log(response)
})
```#### Get Specific Watchlist
```js
// xxxx.. are the watchlist id you get on creation or with get all
alpaca.getWatchlist('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx').then((response) => {
console.log(response)
})
```#### Add a Watchlist
```js
alpaca.addWatchlist("myWatchList", []).then((response) => {
console.log(response)
})
```
#### Add to Watchlist```js
alpaca.addToWatchlist('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', "AAPL").then((response) => {
console.log(response)
})
```
#### Update a Watchlist
```js
alpaca.updateWatchlist("myWatchList", ["AAPL", "GOOG"]).then((response) => {
console.log(response)
})
```
#### Delete a Watchlist
```js
alpaca.deleteWatchlist('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx').then((response) => {
console.log(response)
})
```#### Delete from Watchlist
```js
alpaca.deleteFromWatchlist('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', "AAPL").then((response) => {
console.log(response)
})
```### Data API - Stocks
#### Trades
```ts
getTradesV2(
symbol: string,
options: GetTradesParams,
config?: any,
): AsyncGenerator;
```
```ts
getMultiTradesV2(
symbols: Array,
options: GetTradesParams,
config?: any,
): Promise>;
```
```ts
getMultiTradesAsyncV2(
symbols: Array,
options: GetTradesParams,
config?: any,
): AsyncGenerator;
```
```ts
getLatestTrade(
symbol: string,
config?: any,
): Promise;
```
```ts
getLatestTrades(
symbols: Array,
config?: any,
): Promise>;
```
##### Example
```ts
const trade = await alpaca.getLatestTrade('AAPL');
console.log(trade);
```
###### Output:
```python
{
Timestamp: '2022-04-14T13:54:24.907840256Z',
Exchange: 'P',
Price: 169.33,
Size: 100,
Conditions: [ '@' ],
ID: 12272,
Tape: 'C'
}
```#### Quotes
```ts
getQuotesV2(
symbol: string,
options: GetQuotesParams,
config?: any,
): AsyncGenerator;
```
```ts
getMultiQuotesV2(
symbols: Array,
options: GetQuotesParams,
config?: any,
): Promise>;
```
```ts
getMultiQuotesAsyncV2(
symbols: Array,
options: GetQuotesParams,
config?: any,
): AsyncGenerator;
```
```ts
getLatestQuote(
symbol: string,
config?: any,
): Promise;
```
```ts
getLatestQuotes(
symbols: Array,
config?: any,
): Promise>;
```
##### Example
```ts
const trades = await alpaca.getMultiTradesV2(["PFE", "SPY"], {
start: "2022-04-18T08:30:00Z",
end: "2022-04-18T08:31:00Z",
limit: 2,
});
console.log(trades);
```
###### Output:
```ruby
{
'PFE' => [
{
Timestamp: '2022-04-18T08:30:59.988642304Z',
Exchange: 'P',
Price: 53.25,
Size: 5,
Conditions: [Array],
ID: 52983525028174,
Tape: 'A',
Symbol: 'PFE'
}
],
'SPY' => [
{
Timestamp: '2022-04-18T08:30:00.066013952Z',
Exchange: 'P',
Price: 436.39,
Size: 1,
Conditions: [Array],
ID: 52983525028949,
Tape: 'B',
Symbol: 'SPY'
}
]
}
```##### Bars
```ts
getBarsV2(
symbol: string,
options: GetBarsParams,
config?: any,
): AsyncGenerator;
```
```ts
getMultiBarsV2(
symbols: Array,
options: GetBarsParams,
config?: any,
): Promise>;
```
```ts
getMultiBarsAsyncV2(
symbols: Array,
options: GetBarsParams,
config?: any,
): AsyncGenerator;
```
```ts
getLatestBar(
symbol: string,
config?: any,
): Promise;
```
```ts
getLatestBars(
symbols: Array,
config?: any,
): Promise>;
```
##### Example
```ts
const bars = alpaca.getBarsV2("AAPL", {
start: "2022-04-01",
end: "2022-04-02",
timeframe: alpaca.newTimeframe(30, alpaca.timeframeUnit.MIN),
limit: 2,
});
const got = [];
for await (let b of bars) {
got.push(b);
}
console.log(got);
```
###### Output:
```python
[
{
Timestamp: '2022-04-01T08:00:00Z',
OpenPrice: 175.25,
HighPrice: 175.88,
LowPrice: 175.1,
ClosePrice: 175.35,
Volume: 30015,
TradeCount: 721,
VWAP: 175.357657
},
{
Timestamp: '2022-04-01T08:30:00Z',
OpenPrice: 175.32,
HighPrice: 175.37,
LowPrice: 175.26,
ClosePrice: 175.26,
Volume: 5929,
TradeCount: 123,
VWAP: 175.332243
}
]
```##### Snapshots
```ts
getSnapshot(
symbol: string,
config?: any,
): Promise;
```
```ts
getSnapshots(
symbols: Array,
config?: any,
): Promise;
```
##### Example
```ts
const snapshot = await alpaca.getSnapshot("TSLA");
console.log(snapshot);
```
###### Output:
```python
{
symbol: 'TSLA',
LatestTrade: {
Timestamp: '2022-04-19T10:09:23.844940801Z',
Exchange: 'Q',
Price: 1003,
Size: 501,
Conditions: [ '@', 'F', 'T' ],
ID: 1861,
Tape: 'C'
},
LatestQuote: {
Timestamp: '2022-04-19T10:10:09.139921353Z',
AskExchange: 'Q',
AskPrice: 1004.38,
AskSize: 1,
BidExchange: 'Q',
BidPrice: 1001,
BidSize: 3,
Conditions: [ 'R' ],
Tape: 'C'
},
MinuteBar: {
Timestamp: '2022-04-19T10:09:00Z',
OpenPrice: 1003,
HighPrice: 1003,
LowPrice: 1003,
ClosePrice: 1003,
Volume: 647,
TradeCount: 17,
VWAP: 1003.071345
},
DailyBar: {
Timestamp: '2022-04-18T04:00:00Z',
OpenPrice: 989.19,
HighPrice: 1014.92,
LowPrice: 973.41,
ClosePrice: 1004.29,
Volume: 17209682,
TradeCount: 543314,
VWAP: 997.42604
},
PrevDailyBar: {
Timestamp: '2022-04-14T04:00:00Z',
OpenPrice: 998.51,
HighPrice: 1012.7099,
LowPrice: 982.19,
ClosePrice: 985,
Volume: 19449944,
TradeCount: 579328,
VWAP: 991.712944
}
}
```
More detailed examples of stock data endpoints can be found in this [file](https://github.com/alpacahq/alpaca-trade-api-js/blob/master/examples/marketdataV2.ts).##### News
```ts
getNews(
options: GetNewsParams,
config?: any,
): Promise;
```
Details of the `options` parameter can be found [here](https://github.com/alpacahq/alpaca-trade-api-js/blob/687e58c8ff03cc70b56fc57844d78ca7801e0f85/lib/resources/datav2/rest_v2.ts#L714).
##### Example
```ts
const news = await alpaca.getNews({});
console.log(news[0]);
```
###### Output:
```python
{
ID: 26682466,
Headline: 'Plug Power Enters Agreement With Walmart Pursuant To Which The Co. Will Deliver Liquid Green Hydrogen To New And Existing Walmart Sites In The United States',
Author: 'Bill Haddad',
CreatedAt: '2022-04-19T10:09:38Z',
UpdatedAt: '2022-04-19T10:09:39Z',
Summary: '',
URL: 'https://www.benzinga.com/news/22/04/26682466/plug-power-enters-agreement-with-walmart-pursuant-to-which-the-co-will-deliver-liquid-green-hydrogen',
Images: [],
Symbols: [ 'PLUG', 'WMT' ],
Source: 'benzinga'
}
```
### Data API - Crypto
All the functions are similar to the stock ones.
#### Trades
* ```ts
getCryptoTrades(
symbols: Array,
options: GetCryptoTradesParams,
config?: any,
): AsyncGenerator;
```
* ```ts
getLatestCryptoTrades(
symbols: Array,
config?: any
): Promise>;
```#### Quotes
* ```ts
getCryptoQuotes(
symbols: Array,
options: GetCryptoQuotesParams,
config?: any,
): AsyncGenerator;
```
* ```ts
getLatestCryptoQuotes(
symbols: Array,
config?: any,
): Promise>;
```#### Bars
* ```ts
getCryptoBars(
symbols: Array,
options: GetCryptoBarsParams,
config?: any,
): AsyncGenerator;
```
* ```ts
getLatestCryptoBars(
symbols: Array,
config?: any,
): Promise>;
```#### Snapshots
* ```ts
getCryptoSnapshots(
symbol: Array,
config?: any,
): Promise;
```### Data API - Options
#### Bars
* ```ts
getOptionBars(
symbols: Array,
options: GetOptionBarsParams,
config?: any,
): Promise>;
```
#### Trades
* ```ts
getOptionTrades(
symbols: Array,
options: GetOptionTradesParams,
config = any,
): Promise>;
```
* ```ts
getOptionLatestTrades(
symbols: Array,
config = any,
): Promise>;
```
#### Quotes
* ```ts
getOptionLatestQuotes(
symbols: Array,
config = any,
): Promise>;
```
#### Snapshots
* ```ts
getOptionSnapshots(
symbols: Array,
config = any,
): Promise;
```
* ```ts
getOptionChain(
underlyingSymbols: string,
options: GetOptionChainParams,
config = any,
): Promise;
```### Data API - Corporate Actions
* ```ts
getCorporateActions(
symbols: Array,
options: GetCorporateActionParams,
config = any
): Promise;
```### Websockets
You can use data websocket with or without a funded account.
#### Working with websocket
```ts
const websocket = alpaca.data_stream_v2;
websocket.onConnect(() => {
websocket.subscribeForTrades(["AAPL"]);
});
websocket.onStateChange((status) => {
console.log("Status:", status);
});
websocket.onError((err) => {
console.log("Error:", err);
});
websocket.onStockTrade((trade) => {
console.log("Trade:", trade);
});
websocket.connect();
```
###### Output:
```python
Status: connecting
Status: authenticating
Status: connected
Status: authenticated
Trade: {
T: 't',
Symbol: 'AAPL',
ID: 68,
Exchange: 'V',
Price: 165.02,
Size: 50,
Conditions: [ '@', 'T', 'I' ],
Tape: 'C',
Timestamp: 2022-04-19T12:50:29.214Z
}
```
* The websocket is created when you first create the Alpaca instance
* `const websocket = alpaca.data_stream_v2`: Get the websocket client instance.
* `websocket.connect()`: Connect to the Alpaca server using websocket.
* `websocket.onConnect(() => {})`: all the following code will be executed after
the user authentication. You can also subscribe and unsubscribe for data
outside this function.
* `websocket.subscribeForTrades(["AAPL"])`: Subscribe for trades data for the
given symbol(s). You can do the same with quotes, bars, dailyBars, updatedBars, statuses and lulds.
* `websocket.onStockTrade((trade) => {})`: Get the data by subscribing for the trade data event
in JS/TS and process it inside this function.
* `websocket.unsubscribeFromTrades(["symbol"])`: Unsubscribe from symbol(s).
* `websocket.onDisconnect(() => {})` and `websocket.disconnect()`: the function
inside the `onDisconnect` will run when you disconnect then closes the connection
between the client and server.
Websocket client for real-time crypto and news data work the same. For a detailed example please take a look
at this [file](https://github.com/alpacahq/alpaca-trade-api-js/blob/master/examples/websocket_example_datav2.js).