diff --git a/alpaca_trade_api/__init__.py b/alpaca_trade_api/__init__.py index 6d9636d1..dce49389 100644 --- a/alpaca_trade_api/__init__.py +++ b/alpaca_trade_api/__init__.py @@ -1,4 +1,4 @@ -__version__ = '2.3.0' +__version__ = '2.2.0' from .rest import REST, TimeFrame, TimeFrameUnit # noqa from .rest_async import AsyncRest # noqa diff --git a/alpaca_trade_api/rest.py b/alpaca_trade_api/rest.py index 6ff2b03d..30dc337d 100644 --- a/alpaca_trade_api/rest.py +++ b/alpaca_trade_api/rest.py @@ -557,7 +557,6 @@ def _data_get(self, resp_grouped_by_symbol: Optional[bool] = None, page_limit: int = DATA_V2_MAX_LIMIT, feed: Optional[str] = None, - asof: Optional[str] = None, **kwargs): page_token = None total_items = 0 @@ -578,8 +577,6 @@ def _data_get(self, path += f'/{symbol_or_symbols}' else: data['symbols'] = ','.join(symbol_or_symbols) - if asof: - data['asof'] = asof if endpoint: path += f'/{endpoint}' resp = self.data_get(path, data=data, feed=feed, @@ -600,21 +597,16 @@ def _data_get(self, if not page_token: break + def get_trades_iter(self, symbol: Union[str, List[str]], start: Optional[str] = None, end: Optional[str] = None, limit: int = None, feed: Optional[str] = None, - asof: Optional[str] = None, raw=False) -> TradeIterator: trades = self._data_get('trades', symbol, - start=start, - end=end, - limit=limit, - feed=feed, - asof=asof, - ) + start=start, end=end, limit=limit, feed=feed) for trade in trades: if raw: yield trade @@ -627,15 +619,9 @@ def get_trades(self, end: Optional[str] = None, limit: int = None, feed: Optional[str] = None, - asof: Optional[str] = None, ) -> TradesV2: trades = list(self.get_trades_iter(symbol, - start=start, - end=end, - limit=limit, - feed=feed, - asof=asof, - raw=True)) + start, end, limit, feed, raw=True)) return TradesV2(trades) def get_quotes_iter(self, @@ -644,15 +630,9 @@ def get_quotes_iter(self, end: Optional[str] = None, limit: int = None, feed: Optional[str] = None, - asof: Optional[str] = None, raw=False) -> QuoteIterator: quotes = self._data_get('quotes', symbol, - start=start, - end=end, - limit=limit, - feed=feed, - asof=asof, - ) + start=start, end=end, limit=limit, feed=feed) for quote in quotes: if raw: yield quote @@ -665,16 +645,13 @@ def get_quotes(self, end: Optional[str] = None, limit: int = None, feed: Optional[str] = None, - asof: Optional[str] = None, ) -> QuotesV2: quotes = list(self.get_quotes_iter(symbol=symbol, start=start, end=end, limit=limit, feed=feed, - raw=True, - asof=asof, - )) + raw=True)) return QuotesV2(quotes) def get_bars_iter(self, @@ -685,16 +662,11 @@ def get_bars_iter(self, adjustment: str = 'raw', limit: int = None, feed: Optional[str] = None, - asof: Optional[str] = None, raw=False) -> BarIterator: bars = self._data_get('bars', symbol, timeframe=timeframe, adjustment=adjustment, - start=start, - end=end, - limit=limit, - feed=feed, - asof=asof) + start=start, end=end, limit=limit, feed=feed) for bar in bars: if raw: yield bar @@ -709,7 +681,6 @@ def get_bars(self, adjustment: str = 'raw', limit: int = None, feed: Optional[str] = None, - asof: Optional[str] = None, ) -> BarsV2: bars = list(self.get_bars_iter(symbol, timeframe, @@ -718,7 +689,6 @@ def get_bars(self, adjustment, limit, feed=feed, - asof=asof, raw=True)) return BarsV2(bars) diff --git a/alpaca_trade_api/rest_async.py b/alpaca_trade_api/rest_async.py index bad717d0..9ee54927 100644 --- a/alpaca_trade_api/rest_async.py +++ b/alpaca_trade_api/rest_async.py @@ -22,8 +22,17 @@ def __init__(self, self._key_id, self._secret_key, _ = get_credentials(key_id, secret_key) self._data_url: URL = URL(data_url or get_data_url()) - def _get_historic_url(self, _type, symbol): - return f"{self._data_url}/v2/stocks/{symbol}/{_type}" + def _get_historic_url(self, _type, symbol, asset_type: str = 'stock'): + + if asset_type == 'stock': + endpoint_base = 'v2/stocks' + elif asset_type == 'crypto': + endpoint_base = 'v1beta1/crypto' + else: + endpoint_base = 'v2/stocks' + + return f"{self._data_url}/{endpoint_base}/{symbol}/{_type}" + def _get_latest_url(self, _type, symbol): return f"{self._data_url}/v2/stocks/{symbol}/{_type}/latest" @@ -33,7 +42,8 @@ async def _iterate_requests(self, payload, limit, entity_type: str, - entity_list_type: EntityList) -> pd.DataFrame: + entity_list_type: EntityList, + asset_type : str = 'stock') -> pd.DataFrame: """ iterates the api asynchronously until we get all requested data :param symbol: @@ -43,7 +53,7 @@ async def _iterate_requests(self, :return: """ df = pd.DataFrame({}) - url = self._get_historic_url(entity_type, symbol) + url = self._get_historic_url(entity_type, symbol,asset_type) async for packet in self._request(url, payload): if packet.get(entity_type): response = entity_list_type(packet[entity_type]).df @@ -58,19 +68,33 @@ async def get_bars_async(self, start, end, timeframe, - limit=1000, - adjustment='raw'): + asset_type: str = 'stock', + limit=10000, + adjustment='raw', + feed ='iex' + ): _type = "bars" + + payload = { "adjustment": adjustment, "start": start, "end": end, "timeframe": timeframe, "limit": limit, + "feed": feed } + + if asset_type == 'crypto': + del payload['adjustment'] + del payload['feed'] + payload['exchanges'] = 'FTXU' + + + df = await self._iterate_requests(symbol, payload, limit, _type, - BarsV2) + BarsV2, asset_type) return symbol, df