diff options
| author | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-04-02 10:26:52 +0900 |
|---|---|---|
| committer | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-04-02 10:26:52 +0900 |
| commit | 53cadcf7e34f05f77082e84f0696b56bcbcbae36 (patch) | |
| tree | e02650e10c4d5727bc1e32e27788c17327fa46f7 /cli/src/trading_cli/commands/data.py | |
| parent | f5521da2876a2c19afc24f370b3258f2be95f81a (diff) | |
refactor: remove all crypto/Binance code, update to US stock symbols
Diffstat (limited to 'cli/src/trading_cli/commands/data.py')
| -rw-r--r-- | cli/src/trading_cli/commands/data.py | 59 |
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()) |
