@alpacahq/alpaca-trade-api
Version:
Javascript library for the Alpaca Trade API
130 lines (115 loc) • 4.04 kB
text/typescript
/**
* This Typescript example shows how to use the alpaca data v2 rest functions with some
* simple examples that log their results to the console in a readable tabled format.
* Don't forget to install the dependencies before running it.
*/
import Alpaca from "@alpacahq/alpaca-trade-api";
import {
AlpacaQuote,
AlpacaTrade,
AlpacaBar,
} from "@alpacahq/alpaca-trade-api/dist/resources/datav2/entityv2";
import * as _ from "lodash";
import moment from "moment";
(async () => {
// Create your alpaca object by setting your credentials
// There are more configurable options there, e.g.
// URLs and more
const alpaca = new Alpaca({
keyId: "API_KEY",
secretKey: "API_SECRET",
});
// Get all the trades between a start and end time. The paging was implemented
// in the SDK
const start = "2022-03-10T00:00:00Z";
const end = "2022-03-10T23:59:59Z";
let symbol = "TMF";
const trades = alpaca.getTradesV2(symbol, { start, end });
const tradeData: AlpacaTrade[] = [];
// Due to the pagination setup in the actual API, the SDK returns async generators
// for functions like getTradesV2. If you want to get results out of the generator
// it is recommend you use a for await loop like below.
for await (const t of trades) {
tradeData.push(t);
}
console.log("Trades for TMF");
console.table(tradeData.slice(0, 5));
// Do the same for quotes as well but set a limit
symbol = "IBM";
let quotes = alpaca.getQuotesV2(symbol, { start, end, limit: 5 });
let quoteData: AlpacaQuote[] = [];
for await (const q of quotes) {
quoteData.push(q);
}
console.log("Quotes for IBM");
console.table(quoteData);
// Did your order fill within the bid/ask spread?
// Find the fill price and exact fill time
quotes = alpaca.getQuotesV2(symbol, { start, end });
quoteData = [];
for await (const q of quotes) {
quoteData.push(q);
}
const filledPrice = 125.7;
const filledTime = "2022-03-10T14:34:24.04372096Z";
const q = quoteData.filter((q) => q.Timestamp === filledTime)[0];
const filledWithinSpread =
q.BidPrice <= filledPrice && filledPrice <= q.AskPrice;
console.log(
`order filled within spread: ${filledWithinSpread ? "yes" : "no"}`
);
// Get previous 10 daily bars for SPY
// First get the current day and all trading days
symbol = "SPY";
const clock = await alpaca.getClock();
const tradingDays = await alpaca.getCalendar();
const i = _.findLastIndex(
tradingDays,
(d: any) => d.date <= moment(clock).format("YYYY-MM-DD")
);
const last10TradingDays = tradingDays.slice(i - 9, i + 1);
const bars = alpaca.getBarsV2(symbol, {
start: last10TradingDays.shift().date,
end: last10TradingDays.pop().date,
timeframe: "1Day",
adjustment: "all",
});
let barsData: AlpacaBar[] = [];
for await (const b of bars) {
barsData.push(b);
}
console.log("Last 10 daily bars for SPY");
console.table(barsData);
// Fetch the current open, bid, ask, and last price in one call for multiple symbols
// Calculate the spread and todays gain for each
// First get all the data we need in a single snapshots call
const symbols = ["SPY", "IBM", "AAPL"];
const snapshots = await alpaca.getSnapshots(symbols);
const toDisplay: any = {};
for (const s of snapshots) {
const values = {
open: s.DailyBar.OpenPrice,
bid: s.LatestQuote.BidPrice,
ask: s.LatestQuote.AskPrice,
lastPrice: s.DailyBar.ClosePrice,
spread: s.LatestQuote.BidPrice - s.LatestQuote.AskPrice,
todaysGain: s.DailyBar.ClosePrice / s.DailyBar.OpenPrice - 1,
};
toDisplay[(s as any).symbol] = values;
}
console.log("Spreads and gains");
console.table(toDisplay);
// Get bars for Facebook
const FBBars = alpaca.getBarsV2("META", {
start: "2022-06-02",
end: "2022-06-22",
timeframe: "1Day",
asof: "2022-06-10",
});
barsData = [];
for await (const b of FBBars) {
barsData.push(b);
}
console.log("META bars");
console.table(barsData);
})();