From 53cadcf7e34f05f77082e84f0696b56bcbcbae36 Mon Sep 17 00:00:00 2001 From: TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:26:52 +0900 Subject: refactor: remove all crypto/Binance code, update to US stock symbols --- cli/src/trading_cli/commands/backtest.py | 4 +-- cli/src/trading_cli/commands/data.py | 59 +++++++++++++------------------- cli/src/trading_cli/commands/trade.py | 2 +- 3 files changed, 26 insertions(+), 39 deletions(-) (limited to 'cli') diff --git a/cli/src/trading_cli/commands/backtest.py b/cli/src/trading_cli/commands/backtest.py index 01fe092..3876f1b 100644 --- a/cli/src/trading_cli/commands/backtest.py +++ b/cli/src/trading_cli/commands/backtest.py @@ -20,9 +20,9 @@ def backtest(): @backtest.command() @click.option("--strategy", required=True, help="Strategy name to backtest") -@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="1h", show_default=True, help="Candle timeframe") -@click.option("--balance", default=10000.0, show_default=True, help="Initial balance in USDT") +@click.option("--balance", default=10000.0, show_default=True, help="Initial balance in USD") @click.option( "--output", "output_format", 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()) diff --git a/cli/src/trading_cli/commands/trade.py b/cli/src/trading_cli/commands/trade.py index f90e0ed..6bbd5a6 100644 --- a/cli/src/trading_cli/commands/trade.py +++ b/cli/src/trading_cli/commands/trade.py @@ -9,7 +9,7 @@ def trade(): @trade.command() @click.option("--strategy", required=True, help="Strategy name to run") -@click.option("--symbol", required=True, help="Trading symbol (e.g. BTCUSDT)") +@click.option("--symbol", required=True, help="Trading symbol (e.g. AAPL)") def start(strategy, symbol): """Start a trading bot for a strategy and symbol.""" click.echo(f"Starting trading bot: strategy={strategy}, symbol={symbol}...") -- cgit v1.2.3