UNPKG

@alpacahq/alpaca-trade-api

Version:

Javascript library for the Alpaca Trade API

554 lines (553 loc) 18.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.mergeCorporateActions = exports.getCorporateActionsSize = exports.convertCorporateActions = exports.NewTimeframe = exports.TimeFrameUnit = exports.AlpacaNews = exports.AlpacaOptionSnapshotV1Beta1 = exports.AlpacaOptionQuoteV1Beta1 = exports.AlpacaOptionTradeV1Beta1 = exports.AlpacaOptionBarV1Beta1 = exports.AlpacaCryptoOrderbook = exports.AlpacaCryptoSnapshot = exports.AlpacaCryptoBar = exports.AlpacaCryptoQuote = exports.AlpacaCryptoTrade = exports.AlpacaCorrectionV2 = exports.AlpacaCancelErrorV2 = exports.AlpacaLuldV2 = exports.AlpacaStatusV2 = exports.AlpacaSnapshotV2 = exports.AlpacaBarV2 = exports.AlpacaQuoteV2 = exports.AlpacaTradeV2 = void 0; const mapKeys_1 = __importDefault(require("lodash/mapKeys")); const mapValues_1 = __importDefault(require("lodash/mapValues")); const trade_mapping_v2 = { S: "Symbol", i: "ID", x: "Exchange", p: "Price", s: "Size", t: "Timestamp", c: "Conditions", z: "Tape", }; const quote_mapping_v2 = { S: "Symbol", bx: "BidExchange", bp: "BidPrice", bs: "BidSize", ax: "AskExchange", ap: "AskPrice", as: "AskSize", t: "Timestamp", c: "Conditions", z: "Tape", }; const bar_mapping_v2 = { S: "Symbol", o: "OpenPrice", h: "HighPrice", l: "LowPrice", c: "ClosePrice", v: "Volume", t: "Timestamp", vw: "VWAP", n: "TradeCount", }; const snapshot_mapping_v2 = { symbol: "symbol", latestTrade: "LatestTrade", latestQuote: "LatestQuote", minuteBar: "MinuteBar", dailyBar: "DailyBar", prevDailyBar: "PrevDailyBar", }; const status_mapping_v2 = { S: "Symbol", sc: "StatusCode", sm: "StatusMessage", rc: "ReasonCode", rm: "ReasonMessage", t: "Timestamp", z: "Tape", }; const luld_mapping_v2 = { S: "Symbol", u: "LimitUpPrice", d: "LimitDownPrice", i: "Indicator", t: "Timestamp", z: "Tape", }; const cancel_error_mapping_v2 = { S: "Symbol", i: "ID", x: "Exchange", p: "Price", s: "Size", a: "CancelErrorAction", z: "Tape", t: "Timestamp", }; const correction_mapping_v2 = { S: "Symbol", x: "Exchange", oi: "OriginalID", op: "OriginalPrice", os: "OriginalSize", oc: "OriginalConditions", ci: "CorrectedID", cp: "CorrectedPrice", cs: "CorrectedSize", cc: "CorrectedConditions", z: "Tape", t: "Timestamp", }; const crypto_trade_mapping = { S: "Symbol", t: "Timestamp", x: "Exchange", p: "Price", s: "Size", tks: "TakerSide", i: "ID", }; const crypto_quote_mapping = { t: "Timestamp", bp: "BidPrice", bs: "BidSize", ap: "AskPrice", as: "AskSize", }; const crypto_bar_mapping = { t: "Timestamp", o: "Open", h: "High", l: "Low", c: "Close", v: "Volume", vw: "VWAP", n: "TradeCount", }; const crypto_snapshot_mapping = { latestTrade: "LatestTrade", latestQuote: "LatestQuote", minuteBar: "MinuteBar", dailyBar: "DailyBar", prevDailyBar: "PrevDailyBar", }; const crypto_orderbook_entry_mapping = { p: "Price", s: "Size", }; const crypto_orderbook_mapping = { t: "Timestamp", b: "Bids", a: "Asks", }; const news_image_mapping = { size: "Size", url: "URL", }; const news_mapping = { id: "ID", author: "Author", created_at: "CreatedAt", updated_at: "UpdatedAt", headline: "Headline", summary: "Summary", content: "Content", images: "Images", url: "URL", symbols: "Symbols", source: "Source", }; const option_bar_mapping = { S: "Symbol", o: "Open", h: "High", l: "Low", c: "Close", v: "Volume", t: "Timestamp", vw: "VWAP", n: "TradeCount", }; const option_tarde_mapping = { S: "Symbol", x: "Exchange", p: "Price", s: "Size", t: "Timestamp", c: "Condition", }; const option_quote_mapping = { S: "Symbol", bx: "BidExchange", bp: "BidPrice", bs: "BidSize", ax: "AskExchange", ap: "AskPrice", as: "AskSize", t: "Timestamp", c: "Conditions", z: "Tape", }; const option_snapshot_mapping = { symbol: "symbol", latestTrade: "LatestTrade", latestQuote: "LatestQuote", impliedVolatility: "ImpliedVolatility", greeks: "Greeks", }; function AlpacaTradeV2(data) { return aliasObjectKey(data, trade_mapping_v2); } exports.AlpacaTradeV2 = AlpacaTradeV2; function AlpacaQuoteV2(data) { return aliasObjectKey(data, quote_mapping_v2); } exports.AlpacaQuoteV2 = AlpacaQuoteV2; function AlpacaBarV2(data) { return aliasObjectKey(data, bar_mapping_v2); } exports.AlpacaBarV2 = AlpacaBarV2; function AlpacaSnapshotV2(data) { const snapshot = aliasObjectKey(data, snapshot_mapping_v2); return (0, mapValues_1.default)(snapshot, (value, key) => { return convertSnapshotData(key, value, false); }); } exports.AlpacaSnapshotV2 = AlpacaSnapshotV2; function AlpacaStatusV2(data) { return aliasObjectKey(data, status_mapping_v2); } exports.AlpacaStatusV2 = AlpacaStatusV2; function AlpacaLuldV2(data) { return aliasObjectKey(data, luld_mapping_v2); } exports.AlpacaLuldV2 = AlpacaLuldV2; function AlpacaCancelErrorV2(data) { return aliasObjectKey(data, cancel_error_mapping_v2); } exports.AlpacaCancelErrorV2 = AlpacaCancelErrorV2; function AlpacaCorrectionV2(data) { return aliasObjectKey(data, correction_mapping_v2); } exports.AlpacaCorrectionV2 = AlpacaCorrectionV2; function AlpacaCryptoTrade(data) { return aliasObjectKey(data, crypto_trade_mapping); } exports.AlpacaCryptoTrade = AlpacaCryptoTrade; function AlpacaCryptoQuote(data) { return aliasObjectKey(data, crypto_quote_mapping); } exports.AlpacaCryptoQuote = AlpacaCryptoQuote; function AlpacaCryptoBar(data) { return aliasObjectKey(data, crypto_bar_mapping); } exports.AlpacaCryptoBar = AlpacaCryptoBar; function AlpacaCryptoSnapshot(data) { const snapshot = aliasObjectKey(data, crypto_snapshot_mapping); return (0, mapValues_1.default)(snapshot, (value, key) => { return convertSnapshotData(key, value, true); }); } exports.AlpacaCryptoSnapshot = AlpacaCryptoSnapshot; function AlpacaCryptoOrderbook(data) { const mapFn = (entries) => entries.map((entry) => aliasObjectKey(entry, crypto_orderbook_entry_mapping)); const orderbook = aliasObjectKey(data, crypto_orderbook_mapping); return Object.assign(Object.assign({}, orderbook), { Bids: mapFn(orderbook.Bids), Asks: mapFn(orderbook.Asks) }); } exports.AlpacaCryptoOrderbook = AlpacaCryptoOrderbook; function AlpacaOptionBarV1Beta1(data) { return aliasObjectKey(data, option_bar_mapping); } exports.AlpacaOptionBarV1Beta1 = AlpacaOptionBarV1Beta1; function AlpacaOptionTradeV1Beta1(data) { return aliasObjectKey(data, option_tarde_mapping); } exports.AlpacaOptionTradeV1Beta1 = AlpacaOptionTradeV1Beta1; function AlpacaOptionQuoteV1Beta1(data) { return aliasObjectKey(data, option_quote_mapping); } exports.AlpacaOptionQuoteV1Beta1 = AlpacaOptionQuoteV1Beta1; function AlpacaOptionSnapshotV1Beta1(data) { const snapshot = aliasObjectKey(data, option_snapshot_mapping); return (0, mapValues_1.default)(snapshot, (value, key) => { return convertOptionSnapshotData(key, value); }); } exports.AlpacaOptionSnapshotV1Beta1 = AlpacaOptionSnapshotV1Beta1; function aliasObjectKey(data, mapping) { return (0, mapKeys_1.default)(data, (_value, key) => { return Object.hasOwn(mapping, key) ? mapping[key] : key; }); } function convertSnapshotData(key, data, isCrypto) { switch (key) { case "LatestTrade": return isCrypto ? AlpacaCryptoTrade(data) : AlpacaTradeV2(data); case "LatestQuote": return isCrypto ? AlpacaCryptoQuote(data) : AlpacaQuoteV2(data); case "MinuteBar": case "DailyBar": case "PrevDailyBar": return isCrypto ? AlpacaCryptoBar(data) : AlpacaBarV2(data); default: return data; } } function convertOptionSnapshotData(key, data) { switch (key) { case "LatestTrade": return AlpacaOptionTradeV1Beta1(data); case "LatestQuote": return AlpacaOptionQuoteV1Beta1(data); default: return data; } } function AlpacaNews(data) { const mappedNews = aliasObjectKey(data, news_mapping); if (mappedNews.Images) { mappedNews.Images.forEach((element) => { return aliasObjectKey(element, news_image_mapping); }); } return mappedNews; } exports.AlpacaNews = AlpacaNews; var TimeFrameUnit; (function (TimeFrameUnit) { TimeFrameUnit["MIN"] = "Min"; TimeFrameUnit["HOUR"] = "Hour"; TimeFrameUnit["DAY"] = "Day"; TimeFrameUnit["WEEK"] = "Week"; TimeFrameUnit["MONTH"] = "Month"; })(TimeFrameUnit || (exports.TimeFrameUnit = TimeFrameUnit = {})); function NewTimeframe(amount, unit) { if (amount <= 0) { throw new Error("amount must be a positive integer value"); } if (unit == TimeFrameUnit.MIN && amount > 59) { throw new Error("minute timeframe can only be used with amount between 1-59"); } if (unit == TimeFrameUnit.HOUR && amount > 23) { throw new Error("hour timeframe can only be used with amounts 1-23"); } if ((unit == TimeFrameUnit.DAY || unit == TimeFrameUnit.WEEK) && amount != 1) { throw new Error("day and week timeframes can only be used with amount 1"); } if (unit == TimeFrameUnit.MONTH && ![1, 2, 3, 6, 12].includes(amount)) { throw new Error("month timeframe can only be used with amount 1, 2, 3, 6 and 12"); } return `${amount}${unit}`; } exports.NewTimeframe = NewTimeframe; const cash_dividend_mapping = { ex_date: "ExDate", foreign: "Foreign", payable_date: "PayableDate", process_date: "ProcessDate", rate: "Rate", record_date: "RecordDate", special: "Special", symbol: "Symbol", }; const reverse_split_mapping = { ex_date: "ExDate", new_rate: "NewRate", old_rate: "OldRate", payable_date: "PayableDate", process_date: "ProcessDate", record_date: "RecordDate", symbol: "Symbol", }; const forward_split_mapping = { due_bill_redemption_date: "DueBillRedemptionDate", ex_date: "ExDate", new_rate: "NewRate", old_rate: "OldRate", payable_date: "PayableDate", process_date: "ProcessDate", record_date: "RecordDate", symbol: "Symbol", }; const unit_split_mapping = { alternate_rate: "AlternateRate", alternate_symbol: "AlternateSymbol", effective_date: "EffectiveDate", new_rate: "NewRate", new_symbol: "NewSymbol", old_rate: "OldRate", old_symbol: "OldSymbol", process_date: "ProcessDate", }; const cash_merger_mapping = { acquiree_symbol: "AcquireeSymbol", acquirer_symbol: "AcquirerSymbol", effective_date: "EffectiveDate", process_date: "ProcessDate", rate: "Rate", }; const stock_merger_mapping = { acquiree_rate: "AcquireeRate", acquiree_symbol: "AcquireeSymbol", acquirer_rate: "AcquirerRate", acquirer_symbol: "AcquirerSymbol", effective_date: "EffectiveDate", payable_date: "PayableDate", process_date: "ProcessDate", }; const stock_and_cash_merger_mapping = { stock_merger_mapping, cash_rate: "CashRate", }; const stock_dividends_mapping = { ex_date: "ExDate", payable_date: "PayableDate", process_date: "ProcessDate", rate: "Rate", record_date: "RecordDate", symbol: "Symbol", }; const redemption_mapping = { payable_date: "PayableDate", process_date: "ProcessDate", rate: "Rate", symbol: "Symbol", }; const spin_off_mapping = { ex_date: "ExDate", new_rate: "NewRate", new_symbol: "NewSymbol", process_date: "ProcessDate", record_date: "RecordDate", source_rate: "Rate", source_symbol: "SourceSymbol", }; const name_change_mapping = { new_symbol: "NewSymbol", old_symbol: "OldSymbol", process_date: "ProcessDate", }; const worthless_removal_mapping = { symbol: "Symbol", process_date: "ProcessDate", }; const rights_distribution_mapping = { source_symbol: "SourceSymbol", new_symbol: "NewSymbol", rate: "Rate", process_date: "ProcessDate", ex_date: "ExDate", payable_date: "PayableDate", record_date: "RecordDate", expiration_date: "ExpirationDate", }; function convertCorporateActions(data) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; let cas = {}; if (((_a = data.cash_dividends) === null || _a === void 0 ? void 0 : _a.length) > 0) { cas.CashDividends = cas.CashDividends ? cas.CashDividends : Array(); data.cash_dividends.forEach((cd) => { cas.CashDividends.push(aliasObjectKey(cd, cash_dividend_mapping)); }); } if (((_b = data.reverse_splits) === null || _b === void 0 ? void 0 : _b.length) > 0) { cas.ReverseSplits = cas.ReverseSplits ? cas.ReverseSplits : Array(); data.reverse_splits.forEach((rs) => { cas.ReverseSplits.push(aliasObjectKey(rs, reverse_split_mapping)); }); } if (((_c = data.forward_splits) === null || _c === void 0 ? void 0 : _c.length) > 0) { cas.ForwardSplits = cas.ForwardSplits ? cas.ForwardSplits : Array(); data.forward_splits.forEach((fs) => { cas.ForwardSplits.push(aliasObjectKey(fs, forward_split_mapping)); }); } if (((_d = data.unit_splits) === null || _d === void 0 ? void 0 : _d.length) > 0) { cas.UnitSplits = cas.UnitSplits ? cas.UnitSplits : Array(); data.unit_splits.forEach((fs) => { cas.UnitSplits.push(aliasObjectKey(fs, unit_split_mapping)); }); } if (((_e = data.cash_mergers) === null || _e === void 0 ? void 0 : _e.length) > 0) { cas.CashMergers = cas.CashMergers ? cas.CashMergers : Array(); data.cash_mergers.forEach((cm) => { cas.CashMergers.push(aliasObjectKey(cm, cash_merger_mapping)); }); } if (((_f = data.stock_mergers) === null || _f === void 0 ? void 0 : _f.length) > 0) { cas.StockMergers = cas.StockMergers ? cas.StockMergers : Array(); data.stock_mergers.forEach((sm) => { cas.StockMergers.push(aliasObjectKey(sm, stock_merger_mapping)); }); } if (((_g = data.stock_and_cash_mergers) === null || _g === void 0 ? void 0 : _g.length) > 0) { cas.StockAndCashMerger = cas.StockAndCashMerger ? cas.StockAndCashMerger : Array(); data.stock_and_cash_mergers.forEach((scm) => { cas.StockAndCashMerger.push(aliasObjectKey(scm, stock_and_cash_merger_mapping)); }); } if (((_h = data.stock_dividends) === null || _h === void 0 ? void 0 : _h.length) > 0) { cas.StockDividends = cas.StockDividends ? cas.StockDividends : Array(); data.stock_dividends.forEach((sd) => { cas.StockDividends.push(aliasObjectKey(sd, stock_dividends_mapping)); }); } if (((_j = data.redemptions) === null || _j === void 0 ? void 0 : _j.length) > 0) { cas.Redemptions = cas.Redemptions ? cas.Redemptions : Array(); data.redemptions.forEach((r) => { cas.Redemptions.push(aliasObjectKey(r, redemption_mapping)); }); } if (((_k = data.spin_offs) === null || _k === void 0 ? void 0 : _k.length) > 0) { cas.SpinOffs = cas.SpinOffs ? cas.SpinOffs : Array(); data.spin_offs.forEach((so) => { cas.SpinOffs.push(aliasObjectKey(so, spin_off_mapping)); }); } if (((_l = data.name_changes) === null || _l === void 0 ? void 0 : _l.length) > 0) { cas.NameChanges = cas.NameChanges ? cas.NameChanges : Array(); data.name_changes.forEach((nc) => { cas.NameChanges.push(aliasObjectKey(nc, name_change_mapping)); }); } if (((_m = data.worthless_removals) === null || _m === void 0 ? void 0 : _m.length) > 0) { cas.WorthlessRemovals = cas.WorthlessRemovals ? cas.WorthlessRemovals : Array(); data.worthless_removals.forEach((wr) => { cas.WorthlessRemovals.push(aliasObjectKey(wr, worthless_removal_mapping)); }); } if (((_o = data.rights_distributions) === null || _o === void 0 ? void 0 : _o.length) > 0) { cas.RightsDistributions = cas.RightsDistributions ? cas.RightsDistributions : Array(); data.rights_distributions.forEach((rd) => { cas.RightsDistributions.push(aliasObjectKey(rd, rights_distribution_mapping)); }); } return cas; } exports.convertCorporateActions = convertCorporateActions; function getCorporateActionsSize(cas) { let sum = 0; for (const key in cas) { sum += cas[key] ? cas[key].length : 0; } return sum; } exports.getCorporateActionsSize = getCorporateActionsSize; function mergeCorporateActions(ca1, ca2) { return { CashDividends: (ca1.CashDividends || []).concat(ca2.CashDividends || []), ReverseSplits: (ca1.ReverseSplits || []).concat(ca2.ReverseSplits || []), ForwardSplits: (ca1.ForwardSplits || []).concat(ca2.ForwardSplits || []), UnitSplits: (ca1.UnitSplits || []).concat(ca2.UnitSplits || []), CashMergers: (ca1.CashMergers || []).concat(ca2.CashMergers || []), StockMergers: (ca1.StockMergers || []).concat(ca2.StockMergers || []), StockAndCashMerger: (ca1.StockAndCashMerger || []).concat(ca2.StockAndCashMerger || []), StockDividends: (ca1.StockDividends || []).concat(ca2.StockDividends || []), Redemptions: (ca1.Redemptions || []).concat(ca2.Redemptions || []), SpinOffs: (ca1.SpinOffs || []).concat(ca2.SpinOffs || []), NameChanges: (ca1.NameChanges || []).concat(ca2.NameChanges || []), WorthlessRemovals: (ca1.WorthlessRemovals || []).concat(ca2.WorthlessRemovals || []), RightsDistributions: (ca1.RightsDistributions || []).concat(ca2.RightsDistributions || []), }; } exports.mergeCorporateActions = mergeCorporateActions;