summaryrefslogtreecommitdiff
path: root/cli/src/trading_cli/commands/data.py
diff options
context:
space:
mode:
Diffstat (limited to 'cli/src/trading_cli/commands/data.py')
-rw-r--r--cli/src/trading_cli/commands/data.py59
1 files changed, 23 insertions, 36 deletions
diff --git a/cli/src/trading_cli/commands/data.py b/cli/src/trading_cli/commands/data.py
index 2810a07..1ecc15f 100644
--- a/cli/src/trading_cli/commands/data.py
+++ b/cli/src/trading_cli/commands/data.py
@@ -16,10 +16,10 @@ def data():
@data.command()
-@click.option("--symbol", required=True, help="Trading symbol (e.g. BTCUSDT)")
+@click.option("--symbol", required=True, help="Trading symbol (e.g. AAPL)")
@click.option("--timeframe", default="1m", show_default=True, help="Candle timeframe")
def collect(symbol, timeframe):
- """Start collecting live market data for a symbol."""
+ """Start collecting live stock market data for a symbol."""
click.echo(f"To collect live data for {symbol} at {timeframe}, run the data-collector service:")
click.echo()
click.echo(" docker compose up -d data-collector")
@@ -31,16 +31,14 @@ def collect(symbol, timeframe):
@data.command()
-@click.option("--symbol", required=True, help="Trading symbol (e.g. BTCUSDT)")
-@click.option("--timeframe", default="1m", show_default=True, help="Candle timeframe")
+@click.option("--symbol", required=True, help="Trading symbol (e.g. AAPL)")
+@click.option("--timeframe", default="1Day", show_default=True, help="Bar timeframe")
@click.option("--from", "since", default=None, help="Start date (ISO format)")
-@click.option("--limit", default=1000, show_default=True, help="Number of candles to fetch")
+@click.option("--limit", default=1000, show_default=True, help="Number of bars to fetch")
def history(symbol, timeframe, since, limit):
- """Download historical market data for a symbol."""
- sys.path.insert(0, str(_ROOT / "services" / "data-collector" / "src"))
-
+ """Download historical stock market data for a symbol."""
try:
- from data_collector.binance_rest import fetch_historical_candles
+ from shared.alpaca_client import AlpacaClient
from shared.db import Database
from shared.config import Settings
except ImportError as e:
@@ -48,59 +46,48 @@ def history(symbol, timeframe, since, limit):
sys.exit(1)
async def _fetch():
- import ccxt.async_support as ccxt
from datetime import datetime, timezone
settings = Settings()
db = Database(settings.database_url)
await db.connect()
- # Parse the since date to a timestamp in ms
+ start = None
if since:
try:
- dt = datetime.fromisoformat(since).replace(tzinfo=timezone.utc)
- since_ms = int(dt.timestamp() * 1000)
+ start = datetime.fromisoformat(since).replace(tzinfo=timezone.utc)
except ValueError:
click.echo(
f"Error: Invalid date format '{since}'. Use ISO format (e.g. 2024-01-01).",
err=True,
)
sys.exit(1)
- else:
- # Default: fetch from 1000 candles ago (approximate)
- since_ms = None
-
- # Normalize symbol for ccxt (BTCUSDT -> BTC/USDT)
- ccxt_symbol = symbol
- if "/" not in symbol and "USDT" in symbol:
- base = symbol.replace("USDT", "")
- ccxt_symbol = f"{base}/USDT"
-
- exchange = ccxt.binance(
- {
- "apiKey": settings.binance_api_key,
- "secret": settings.binance_api_secret,
- }
+
+ client = AlpacaClient(
+ api_key=settings.alpaca_api_key,
+ api_secret=settings.alpaca_api_secret,
+ base_url=getattr(settings, "alpaca_base_url", "https://paper-api.alpaca.markets"),
)
try:
- kwargs = {"limit": limit}
- if since_ms is not None:
- kwargs["since"] = since_ms
-
- candles = await fetch_historical_candles(exchange, ccxt_symbol, timeframe, **kwargs)
+ candles = await client.get_historical_bars(
+ symbol=symbol,
+ timeframe=timeframe,
+ start=start,
+ limit=limit,
+ )
count = 0
for candle in candles:
await db.insert_candle(candle)
count += 1
- click.echo(f"Saved {count} candles for {symbol} ({timeframe}) to database.")
+ click.echo(f"Saved {count} bars for {symbol} ({timeframe}) to database.")
except Exception as e:
- click.echo(f"Error fetching candles: {e}", err=True)
+ click.echo(f"Error fetching bars: {e}", err=True)
sys.exit(1)
finally:
- await exchange.close()
+ await client.close()
await db.close()
asyncio.run(_fetch())