Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

crypto optionality for async module + market hours feed async to be iex as a default #648

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion alpaca_trade_api/__init__.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
42 changes: 6 additions & 36 deletions alpaca_trade_api/rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -718,7 +689,6 @@ def get_bars(self,
adjustment,
limit,
feed=feed,
asof=asof,
raw=True))
return BarsV2(bars)

Expand Down
38 changes: 31 additions & 7 deletions alpaca_trade_api/rest_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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:
Expand All @@ -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
Expand All @@ -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

Expand Down