Skip to content

Commit aac38e3

Browse files
authored
Add optional feed argument to the market data methods (#625)
1 parent e2303d4 commit aac38e3

File tree

1 file changed

+47
-18
lines changed

1 file changed

+47
-18
lines changed

alpaca_trade_api/rest.py

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,12 @@ def patch(self, path, data=None):
261261
def delete(self, path, data=None):
262262
return self._request('DELETE', path, data)
263263

264-
def data_get(self, path, data=None, api_version='v1'):
264+
def data_get(self, path, data=None,
265+
feed: Optional[str] = None, api_version='v1'):
265266
base_url: URL = get_data_url()
267+
if feed:
268+
data = data or {}
269+
data['feed'] = feed
266270
return self._request(
267271
'GET', path, data, base_url=base_url, api_version=api_version,
268272
)
@@ -552,6 +556,7 @@ def _data_get(self,
552556
endpoint_base: str = 'stocks',
553557
resp_grouped_by_symbol: Optional[bool] = None,
554558
page_limit: int = DATA_V2_MAX_LIMIT,
559+
feed: Optional[str] = None,
555560
**kwargs):
556561
page_token = None
557562
total_items = 0
@@ -574,7 +579,8 @@ def _data_get(self,
574579
data['symbols'] = ','.join(symbol_or_symbols)
575580
if endpoint:
576581
path += f'/{endpoint}'
577-
resp = self.data_get(path, data=data, api_version=api_version)
582+
resp = self.data_get(path, data=data, feed=feed,
583+
api_version=api_version)
578584
if not resp_grouped_by_symbol:
579585
k = endpoint or endpoint_base
580586
for item in resp.get(k, []) or []:
@@ -596,9 +602,10 @@ def get_trades_iter(self,
596602
start: Optional[str] = None,
597603
end: Optional[str] = None,
598604
limit: int = None,
605+
feed: Optional[str] = None,
599606
raw=False) -> TradeIterator:
600607
trades = self._data_get('trades', symbol,
601-
start=start, end=end, limit=limit)
608+
start=start, end=end, limit=limit, feed=feed)
602609
for trade in trades:
603610
if raw:
604611
yield trade
@@ -610,19 +617,21 @@ def get_trades(self,
610617
start: Optional[str] = None,
611618
end: Optional[str] = None,
612619
limit: int = None,
620+
feed: Optional[str] = None,
613621
) -> TradesV2:
614622
trades = list(self.get_trades_iter(symbol,
615-
start, end, limit, raw=True))
623+
start, end, limit, feed, raw=True))
616624
return TradesV2(trades)
617625

618626
def get_quotes_iter(self,
619627
symbol: Union[str, List[str]],
620628
start: Optional[str] = None,
621629
end: Optional[str] = None,
622630
limit: int = None,
631+
feed: Optional[str] = None,
623632
raw=False) -> QuoteIterator:
624633
quotes = self._data_get('quotes', symbol,
625-
start=start, end=end, limit=limit)
634+
start=start, end=end, limit=limit, feed=feed)
626635
for quote in quotes:
627636
if raw:
628637
yield quote
@@ -634,11 +643,13 @@ def get_quotes(self,
634643
start: Optional[str] = None,
635644
end: Optional[str] = None,
636645
limit: int = None,
646+
feed: Optional[str] = None,
637647
) -> QuotesV2:
638-
quotes = list(self.get_quotes_iter(symbol,
639-
start,
640-
end,
641-
limit,
648+
quotes = list(self.get_quotes_iter(symbol=symbol,
649+
start=start,
650+
end=end,
651+
limit=limit,
652+
feed=feed,
642653
raw=True))
643654
return QuotesV2(quotes)
644655

@@ -649,11 +660,12 @@ def get_bars_iter(self,
649660
end: Optional[str] = None,
650661
adjustment: str = 'raw',
651662
limit: int = None,
663+
feed: Optional[str] = None,
652664
raw=False) -> BarIterator:
653665
bars = self._data_get('bars', symbol,
654666
timeframe=timeframe,
655667
adjustment=adjustment,
656-
start=start, end=end, limit=limit)
668+
start=start, end=end, limit=limit, feed=feed)
657669
for bar in bars:
658670
if raw:
659671
yield bar
@@ -667,60 +679,77 @@ def get_bars(self,
667679
end: Optional[str] = None,
668680
adjustment: str = 'raw',
669681
limit: int = None,
682+
feed: Optional[str] = None,
670683
) -> BarsV2:
671684
bars = list(self.get_bars_iter(symbol,
672685
timeframe,
673686
start,
674687
end,
675688
adjustment,
676689
limit,
690+
feed=feed,
677691
raw=True))
678692
return BarsV2(bars)
679693

680-
def get_latest_bar(self, symbol: str) -> BarV2:
694+
def get_latest_bar(self, symbol: str, feed: Optional[str] = None) -> BarV2:
681695
resp = self.data_get(
682696
'/stocks/{}/bars/latest'.format(symbol),
697+
feed=feed,
683698
api_version='v2')
684699
return self.response_wrapper(resp['bar'], BarV2)
685700

686-
def get_latest_bars(self, symbols: List[str]) -> LatestBarsV2:
701+
def get_latest_bars(self, symbols: List[str],
702+
feed: Optional[str] = None) -> LatestBarsV2:
687703
resp = self.data_get(
688704
f'/stocks/bars/latest?symbols={_join_with_commas(symbols)}',
705+
feed=feed,
689706
api_version='v2')
690707
return self.response_wrapper(resp['bars'], LatestBarsV2)
691708

692-
def get_latest_trade(self, symbol: str) -> TradeV2:
709+
def get_latest_trade(self, symbol: str,
710+
feed: Optional[str] = None) -> TradeV2:
693711
resp = self.data_get(
694712
'/stocks/{}/trades/latest'.format(symbol),
713+
feed=feed,
695714
api_version='v2')
696715
return self.response_wrapper(resp['trade'], TradeV2)
697716

698-
def get_latest_trades(self, symbols: List[str]) -> LatestTradesV2:
717+
def get_latest_trades(self, symbols: List[str],
718+
feed: Optional[str] = None) -> LatestTradesV2:
699719
resp = self.data_get(
700720
f'/stocks/trades/latest?symbols={_join_with_commas(symbols)}',
721+
feed=feed,
701722
api_version='v2')
702723
return self.response_wrapper(resp['trades'], LatestTradesV2)
703724

704-
def get_latest_quote(self, symbol: str) -> QuoteV2:
725+
def get_latest_quote(self, symbol: str,
726+
feed: Optional[str] = None) -> QuoteV2:
705727
resp = self.data_get(
706728
'/stocks/{}/quotes/latest'.format(symbol),
729+
feed=feed,
707730
api_version='v2')
708731
return self.response_wrapper(resp['quote'], QuoteV2)
709732

710-
def get_latest_quotes(self, symbols: List[str]) -> LatestQuotesV2:
733+
def get_latest_quotes(self, symbols: List[str],
734+
feed: Optional[str] = None) -> LatestQuotesV2:
711735
resp = self.data_get(
712736
f'/stocks/quotes/latest?symbols={_join_with_commas(symbols)}',
737+
feed=feed,
713738
api_version='v2')
714739
return self.response_wrapper(resp['quotes'], LatestQuotesV2)
715740

716-
def get_snapshot(self, symbol: str) -> SnapshotV2:
741+
def get_snapshot(self, symbol: str,
742+
feed: Optional[str] = None) -> SnapshotV2:
717743
resp = self.data_get('/stocks/{}/snapshot'.format(symbol),
744+
feed=feed,
718745
api_version='v2')
719746
return self.response_wrapper(resp, SnapshotV2)
720747

721-
def get_snapshots(self, symbols: List[str]) -> SnapshotsV2:
748+
def get_snapshots(self, symbols: List[str],
749+
feed: Optional[str] = None) -> SnapshotsV2:
722750
resp = self.data_get(
723751
'/stocks/snapshots?symbols={}'.format(_join_with_commas(symbols)),
752+
feed=feed,
724753
api_version='v2')
725754
return self.response_wrapper(resp, SnapshotsV2)
726755

0 commit comments

Comments
 (0)