Spaces:
Sleeping
Sleeping
| from fastapi import APIRouter | |
| from pydantic import BaseModel | |
| import ccxt | |
| router = APIRouter() | |
| # In-memory dictionary to store bot states and historical memory buffers | |
| # Format: { user_id: { symbol: { config, memory_buffer: [] } } } | |
| active_bots = {} | |
| class ToggleBotRequest(BaseModel): | |
| user_id: str | |
| symbol: str | |
| is_active: bool | |
| risk_amount: float | |
| sl_percent: float | |
| tp_percent: float | |
| async def toggle_bot(req: ToggleBotRequest): | |
| if req.user_id not in active_bots: | |
| active_bots[req.user_id] = {} | |
| # Initialize an empty memory buffer | |
| memory_buffer = [] | |
| # 🚀 WARM-UP FETCH: If turning ON, grab 1,000 historical candles instantly for the AI | |
| if req.is_active: | |
| try: | |
| exchange = ccxt.binanceus() | |
| # Fetch 1m candles to match the live stream | |
| klines = exchange.fetch_ohlcv(req.symbol.replace('/', ''), timeframe='1m', limit=1000) | |
| # Store just the closing prices in the buffer for the Quant Engine | |
| memory_buffer = [kline[4] for kline in klines] | |
| print(f"✅ Downloaded {len(memory_buffer)} historical candles for {req.symbol} AI warmup.") | |
| except Exception as e: | |
| print(f"⚠️ Failed to fetch historical warmup data: {e}") | |
| active_bots[req.user_id][req.symbol] = { | |
| "is_active": req.is_active, | |
| "risk_amount": req.risk_amount, | |
| "sl_percent": req.sl_percent, | |
| "tp_percent": req.tp_percent, | |
| "memory_buffer": memory_buffer | |
| } | |
| status = "ON" if req.is_active else "OFF" | |
| print(f"🤖 Bot Engine for {req.user_id} on {req.symbol} is now {status}") | |
| return {"status": "success", "state": status} |