diff --git a/README.md b/README.md
index 5695683..92763a8 100644
--- a/README.md
+++ b/README.md
@@ -97,6 +97,28 @@ python3 prepare_cache.py --symbols BAC AAPL --day_start 2024-10-14 --day_stop 20
```
+## remote loaders
+
+Remote bars of given resolutions from Alpaca.
+
+Available resolutions Minute, Hours, Day. It s not possible to limit included trades.
+Use only when no precision required.
+
+```python
+from ttools.external_loaders import load_history_bars
+from ttools.config import zoneNY
+from datetime import datetime, time
+from alpaca.data.timeframe import TimeFrame, TimeFrameUnit
+
+symbol = "AAPL"
+start_date = zoneNY.localize(datetime(2023, 2, 27, 18, 51, 38))
+end_date = zoneNY.localize(datetime(2023, 4, 27, 21, 51, 39))
+timeframe = TimeFrame(amount=1,unit=TimeFrameUnit.Minute)
+
+df = load_history_bars(symbol, start_date, end_date, timeframe, main_session_only=True)
+df.loc[('AAPL',)]
+```
+
# vbtutils
Contains helpers for vbtpro
diff --git a/setup.py b/setup.py
index 7a82e84..4ecff9f 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name='ttools',
- version='0.7.1',
+ version='0.7.2',
packages=find_packages(),
install_requires=[
# list your dependencies here
diff --git a/tests/alpaca_loader.ipynb b/tests/alpaca_loader.ipynb
new file mode 100644
index 0000000..19a88c6
--- /dev/null
+++ b/tests/alpaca_loader.ipynb
@@ -0,0 +1,460 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "TTOOLS: Loaded env variables from file /Users/davidbrazda/Documents/Development/python/.env\n"
+ ]
+ }
+ ],
+ "source": [
+ "from ttools.external_loaders import load_history_bars\n",
+ "from ttools.config import zoneNY\n",
+ "from datetime import datetime, time\n",
+ "from alpaca.data.timeframe import TimeFrame, TimeFrameUnit\n",
+ "\n",
+ "symbol = \"AAPL\"\n",
+ "start_date = zoneNY.localize(datetime(2023, 2, 27, 18, 51, 38))\n",
+ "end_date = zoneNY.localize(datetime(2023, 4, 27, 21, 51, 39))\n",
+ "timeframe = TimeFrame(amount=1,unit=TimeFrameUnit.Minute)\n",
+ "\n",
+ "df = load_history_bars(symbol, start_date, end_date, timeframe, True)\n",
+ "df.loc[('AAPL',)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " open | \n",
+ " high | \n",
+ " low | \n",
+ " close | \n",
+ " volume | \n",
+ " trade_count | \n",
+ " vwap | \n",
+ "
\n",
+ " \n",
+ " | timestamp | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2023-02-28 09:30:00-05:00 | \n",
+ " 147.050 | \n",
+ " 147.380 | \n",
+ " 146.830 | \n",
+ " 147.2700 | \n",
+ " 1554100.0 | \n",
+ " 6447.0 | \n",
+ " 146.914560 | \n",
+ "
\n",
+ " \n",
+ " | 2023-02-28 09:31:00-05:00 | \n",
+ " 147.250 | \n",
+ " 147.320 | \n",
+ " 147.180 | \n",
+ " 147.2942 | \n",
+ " 159387.0 | \n",
+ " 6855.0 | \n",
+ " 147.252171 | \n",
+ "
\n",
+ " \n",
+ " | 2023-02-28 09:32:00-05:00 | \n",
+ " 147.305 | \n",
+ " 147.330 | \n",
+ " 147.090 | \n",
+ " 147.1600 | \n",
+ " 214536.0 | \n",
+ " 7435.0 | \n",
+ " 147.210128 | \n",
+ "
\n",
+ " \n",
+ " | 2023-02-28 09:33:00-05:00 | \n",
+ " 147.140 | \n",
+ " 147.230 | \n",
+ " 147.090 | \n",
+ " 147.1500 | \n",
+ " 171487.0 | \n",
+ " 7235.0 | \n",
+ " 147.154832 | \n",
+ "
\n",
+ " \n",
+ " | 2023-02-28 09:34:00-05:00 | \n",
+ " 147.160 | \n",
+ " 147.160 | \n",
+ " 146.880 | \n",
+ " 146.9850 | \n",
+ " 235915.0 | \n",
+ " 4965.0 | \n",
+ " 147.001762 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 15:26:00-04:00 | \n",
+ " 168.400 | \n",
+ " 168.415 | \n",
+ " 168.340 | \n",
+ " 168.3601 | \n",
+ " 163973.0 | \n",
+ " 1398.0 | \n",
+ " 168.368809 | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 15:27:00-04:00 | \n",
+ " 168.360 | \n",
+ " 168.400 | \n",
+ " 168.330 | \n",
+ " 168.3800 | \n",
+ " 130968.0 | \n",
+ " 1420.0 | \n",
+ " 168.364799 | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 15:28:00-04:00 | \n",
+ " 168.380 | \n",
+ " 168.430 | \n",
+ " 168.320 | \n",
+ " 168.3285 | \n",
+ " 152193.0 | \n",
+ " 1361.0 | \n",
+ " 168.372671 | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 15:29:00-04:00 | \n",
+ " 168.325 | \n",
+ " 168.330 | \n",
+ " 168.260 | \n",
+ " 168.2850 | \n",
+ " 208426.0 | \n",
+ " 1736.0 | \n",
+ " 168.297379 | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 15:30:00-04:00 | \n",
+ " 168.280 | \n",
+ " 168.350 | \n",
+ " 168.255 | \n",
+ " 168.3450 | \n",
+ " 218077.0 | \n",
+ " 1694.0 | \n",
+ " 168.308873 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
15162 rows × 7 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " open high low close volume \\\n",
+ "timestamp \n",
+ "2023-02-28 09:30:00-05:00 147.050 147.380 146.830 147.2700 1554100.0 \n",
+ "2023-02-28 09:31:00-05:00 147.250 147.320 147.180 147.2942 159387.0 \n",
+ "2023-02-28 09:32:00-05:00 147.305 147.330 147.090 147.1600 214536.0 \n",
+ "2023-02-28 09:33:00-05:00 147.140 147.230 147.090 147.1500 171487.0 \n",
+ "2023-02-28 09:34:00-05:00 147.160 147.160 146.880 146.9850 235915.0 \n",
+ "... ... ... ... ... ... \n",
+ "2023-04-27 15:26:00-04:00 168.400 168.415 168.340 168.3601 163973.0 \n",
+ "2023-04-27 15:27:00-04:00 168.360 168.400 168.330 168.3800 130968.0 \n",
+ "2023-04-27 15:28:00-04:00 168.380 168.430 168.320 168.3285 152193.0 \n",
+ "2023-04-27 15:29:00-04:00 168.325 168.330 168.260 168.2850 208426.0 \n",
+ "2023-04-27 15:30:00-04:00 168.280 168.350 168.255 168.3450 218077.0 \n",
+ "\n",
+ " trade_count vwap \n",
+ "timestamp \n",
+ "2023-02-28 09:30:00-05:00 6447.0 146.914560 \n",
+ "2023-02-28 09:31:00-05:00 6855.0 147.252171 \n",
+ "2023-02-28 09:32:00-05:00 7435.0 147.210128 \n",
+ "2023-02-28 09:33:00-05:00 7235.0 147.154832 \n",
+ "2023-02-28 09:34:00-05:00 4965.0 147.001762 \n",
+ "... ... ... \n",
+ "2023-04-27 15:26:00-04:00 1398.0 168.368809 \n",
+ "2023-04-27 15:27:00-04:00 1420.0 168.364799 \n",
+ "2023-04-27 15:28:00-04:00 1361.0 168.372671 \n",
+ "2023-04-27 15:29:00-04:00 1736.0 168.297379 \n",
+ "2023-04-27 15:30:00-04:00 1694.0 168.308873 \n",
+ "\n",
+ "[15162 rows x 7 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.loc[('AAPL',)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " | \n",
+ " open | \n",
+ " high | \n",
+ " low | \n",
+ " close | \n",
+ " volume | \n",
+ " trade_count | \n",
+ " vwap | \n",
+ "
\n",
+ " \n",
+ " | symbol | \n",
+ " timestamp | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | AAPL | \n",
+ " 2023-02-27 18:52:00-05:00 | \n",
+ " 148.0200 | \n",
+ " 148.02 | \n",
+ " 148.0200 | \n",
+ " 148.02 | \n",
+ " 112.0 | \n",
+ " 7.0 | \n",
+ " 148.020000 | \n",
+ "
\n",
+ " \n",
+ " | 2023-02-27 18:56:00-05:00 | \n",
+ " 148.0200 | \n",
+ " 148.02 | \n",
+ " 148.0200 | \n",
+ " 148.02 | \n",
+ " 175.0 | \n",
+ " 10.0 | \n",
+ " 148.020000 | \n",
+ "
\n",
+ " \n",
+ " | 2023-02-27 19:00:00-05:00 | \n",
+ " 148.0299 | \n",
+ " 148.03 | \n",
+ " 148.0299 | \n",
+ " 148.03 | \n",
+ " 1957.0 | \n",
+ " 10.0 | \n",
+ " 148.029993 | \n",
+ "
\n",
+ " \n",
+ " | 2023-02-27 19:06:00-05:00 | \n",
+ " 148.0600 | \n",
+ " 148.06 | \n",
+ " 148.0600 | \n",
+ " 148.06 | \n",
+ " 122.0 | \n",
+ " 7.0 | \n",
+ " 148.060000 | \n",
+ "
\n",
+ " \n",
+ " | 2023-02-27 19:09:00-05:00 | \n",
+ " 148.0500 | \n",
+ " 148.10 | \n",
+ " 148.0500 | \n",
+ " 148.10 | \n",
+ " 1604.0 | \n",
+ " 33.0 | \n",
+ " 148.075109 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 19:54:00-04:00 | \n",
+ " 167.8000 | \n",
+ " 167.80 | \n",
+ " 167.8000 | \n",
+ " 167.80 | \n",
+ " 534.0 | \n",
+ " 15.0 | \n",
+ " 167.800000 | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 19:56:00-04:00 | \n",
+ " 167.8800 | \n",
+ " 167.88 | \n",
+ " 167.8800 | \n",
+ " 167.88 | \n",
+ " 1386.0 | \n",
+ " 28.0 | \n",
+ " 167.880000 | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 19:57:00-04:00 | \n",
+ " 167.8000 | \n",
+ " 167.80 | \n",
+ " 167.8000 | \n",
+ " 167.80 | \n",
+ " 912.0 | \n",
+ " 60.0 | \n",
+ " 167.800000 | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 19:58:00-04:00 | \n",
+ " 167.8000 | \n",
+ " 167.88 | \n",
+ " 167.8000 | \n",
+ " 167.88 | \n",
+ " 3311.0 | \n",
+ " 22.0 | \n",
+ " 167.877333 | \n",
+ "
\n",
+ " \n",
+ " | 2023-04-27 19:59:00-04:00 | \n",
+ " 167.9000 | \n",
+ " 167.94 | \n",
+ " 167.9000 | \n",
+ " 167.94 | \n",
+ " 1969.0 | \n",
+ " 64.0 | \n",
+ " 167.918150 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
31217 rows × 7 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " open high low close volume \\\n",
+ "symbol timestamp \n",
+ "AAPL 2023-02-27 18:52:00-05:00 148.0200 148.02 148.0200 148.02 112.0 \n",
+ " 2023-02-27 18:56:00-05:00 148.0200 148.02 148.0200 148.02 175.0 \n",
+ " 2023-02-27 19:00:00-05:00 148.0299 148.03 148.0299 148.03 1957.0 \n",
+ " 2023-02-27 19:06:00-05:00 148.0600 148.06 148.0600 148.06 122.0 \n",
+ " 2023-02-27 19:09:00-05:00 148.0500 148.10 148.0500 148.10 1604.0 \n",
+ "... ... ... ... ... ... \n",
+ " 2023-04-27 19:54:00-04:00 167.8000 167.80 167.8000 167.80 534.0 \n",
+ " 2023-04-27 19:56:00-04:00 167.8800 167.88 167.8800 167.88 1386.0 \n",
+ " 2023-04-27 19:57:00-04:00 167.8000 167.80 167.8000 167.80 912.0 \n",
+ " 2023-04-27 19:58:00-04:00 167.8000 167.88 167.8000 167.88 3311.0 \n",
+ " 2023-04-27 19:59:00-04:00 167.9000 167.94 167.9000 167.94 1969.0 \n",
+ "\n",
+ " trade_count vwap \n",
+ "symbol timestamp \n",
+ "AAPL 2023-02-27 18:52:00-05:00 7.0 148.020000 \n",
+ " 2023-02-27 18:56:00-05:00 10.0 148.020000 \n",
+ " 2023-02-27 19:00:00-05:00 10.0 148.029993 \n",
+ " 2023-02-27 19:06:00-05:00 7.0 148.060000 \n",
+ " 2023-02-27 19:09:00-05:00 33.0 148.075109 \n",
+ "... ... ... \n",
+ " 2023-04-27 19:54:00-04:00 15.0 167.800000 \n",
+ " 2023-04-27 19:56:00-04:00 28.0 167.880000 \n",
+ " 2023-04-27 19:57:00-04:00 60.0 167.800000 \n",
+ " 2023-04-27 19:58:00-04:00 22.0 167.877333 \n",
+ " 2023-04-27 19:59:00-04:00 64.0 167.918150 \n",
+ "\n",
+ "[31217 rows x 7 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.11"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/tests/data_loader_tryme.ipynb b/tests/data_loader_tryme.ipynb
index 5ff47da..344b5ec 100644
--- a/tests/data_loader_tryme.ipynb
+++ b/tests/data_loader_tryme.ipynb
@@ -729,7 +729,7 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
@@ -741,7 +741,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
@@ -919,7 +919,7 @@
"[222754 rows x 6 columns]"
]
},
- "execution_count": 4,
+ "execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
diff --git a/ttools/__init__.py b/ttools/__init__.py
index bf5d974..06ea2dd 100644
--- a/ttools/__init__.py
+++ b/ttools/__init__.py
@@ -1,4 +1,5 @@
from .vbtutils import AnchoredIndicator, create_mask_from_window, isrising, isfalling, isrisingc, isfallingc, trades2entries_exits, figs2cell
from .vbtindicators import register_custom_inds
from .utils import AggType, zoneNY, zonePRG, zoneUTC
-from .loaders import load_data, prepare_trade_cache
\ No newline at end of file
+from .loaders import load_data, prepare_trade_cache
+from .external_loaders import load_history_bars
\ No newline at end of file
diff --git a/ttools/external_loaders.py b/ttools/external_loaders.py
new file mode 100644
index 0000000..8878b8c
--- /dev/null
+++ b/ttools/external_loaders.py
@@ -0,0 +1,55 @@
+from ctypes import Union
+from ttools import zoneUTC
+from ttools.config import *
+from datetime import datetime
+from alpaca.data.historical import StockHistoricalDataClient
+from ttools.config import ACCOUNT1_LIVE_API_KEY, ACCOUNT1_LIVE_SECRET_KEY
+from datetime import timedelta, datetime, time
+from alpaca.data.enums import DataFeed
+from typing import List, Union
+import pandas as pd
+from alpaca.data.historical import StockHistoricalDataClient
+from alpaca.data.requests import StockBarsRequest
+from alpaca.data.enums import DataFeed
+from alpaca.data.timeframe import TimeFrame, TimeFrameUnit
+
+def load_history_bars(symbol: Union[str, List[str]], datetime_object_from: datetime, datetime_object_to: datetime, timeframe: TimeFrame, main_session_only: bool = True):
+ """Returns dataframe fetched remotely from Alpaca.
+
+ Args:
+ symbol: symbol or list of symbols
+ datetime_object_from: datetime in zoneNY
+ datetime_object_to: datetime in zoneNY
+ timeframe: timeframe
+ main_session_only: boolean to fetch only main session data
+
+ Returns:
+ dataframe
+
+ Example:
+ ```python
+ from ttools.external_loaders import load_history_bars
+ from ttools.config import zoneNY
+ from datetime import datetime
+ from alpaca.data.timeframe import TimeFrame, TimeFrameUnit
+
+ symbol = "AAPL"
+ start_date = zoneNY.localize(datetime(2023, 2, 27, 18, 51, 38))
+ end_date = zoneNY.localize(datetime(2023, 4, 27, 21, 51, 39))
+ timeframe = TimeFrame(amount=1,unit=TimeFrameUnit.Minute)
+
+ df = load_history_bars(symbol, start_date, end_date, timeframe)
+ ```
+ """
+ client = StockHistoricalDataClient(ACCOUNT1_LIVE_API_KEY, ACCOUNT1_LIVE_SECRET_KEY, raw_data=False)
+ #datetime_object_from = datetime(2023, 2, 27, 18, 51, 38, tzinfo=datetime.timezone.utc)
+ #datetime_object_to = datetime(2023, 2, 27, 21, 51, 39, tzinfo=datetime.timezone.utc)
+ bar_request = StockBarsRequest(symbol_or_symbols=symbol,timeframe=timeframe, start=datetime_object_from, end=datetime_object_to, feed=DataFeed.SIP)
+ #print("before df")
+ df = client.get_stock_bars(bar_request).df
+ df.index = df.index.set_levels(df.index.get_level_values(1).tz_convert(zoneNY), level=1)
+ if main_session_only:
+ start_time = time(9, 30, 0)
+ end_time = time(15, 30, 0)
+ df = df.loc[(df.index.get_level_values(1).time >= start_time) & (df.index.get_level_values(1).time <= end_time)]
+ return df