""" exchange.py — Kraken connector via CCXT Verantwoordelijk voor: marktdata ophalen, OHLCV, ticker info """ import ccxt import os import pandas as pd from typing import Optional import logging logger = logging.getLogger(__name__) def get_exchange() -> ccxt.kraken: """Initialiseer Kraken exchange connectie.""" return ccxt.kraken({ "apiKey": os.getenv("KRAKEN_API_KEY", ""), "secret": os.getenv("KRAKEN_SECRET", ""), "enableRateLimit": True, "options": { "defaultType": "spot", } }) # Universe van tradeable pairs — uitbreidbaar TRADING_UNIVERSE = [ "BTC/EUR", "ETH/EUR", "SOL/EUR", "ADA/EUR", "XRP/EUR", "DOT/EUR", "MATIC/EUR", "LINK/EUR", "AVAX/EUR", "ATOM/EUR", "UNI/EUR", "LTC/EUR", "ALGO/EUR", "NEAR/EUR", "FTM/EUR", "MANA/EUR", "SAND/EUR", "DOGE/EUR", "SHIB/EUR", "OP/EUR", ] def fetch_ohlcv(symbol: str, timeframe: str = "5m", limit: int = 100) -> pd.DataFrame: """ Haal OHLCV candledata op voor een pair. Timeframe: 1m, 5m, 15m, 1h, 4h, 1d """ exchange = get_exchange() try: raw = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit) df = pd.DataFrame(raw, columns=["timestamp", "open", "high", "low", "close", "volume"]) df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms") df.set_index("timestamp", inplace=True) return df except Exception as e: logger.error(f"OHLCV fetch mislukt voor {symbol}: {e}") return pd.DataFrame() def fetch_tickers(symbols: Optional[list[str]] = None) -> dict: """ Haal huidige ticker data op voor meerdere pairs tegelijk. Geeft dict terug met per symbol: prijs, volume, change%. """ exchange = get_exchange() targets = symbols or TRADING_UNIVERSE result = {} try: tickers = exchange.fetch_tickers(targets) for symbol, ticker in tickers.items(): result[symbol] = { "symbol": symbol, "price": ticker.get("last") or 0, "volume_24h": ticker.get("quoteVolume") or 0, "change_24h": ticker.get("percentage") or 0, "high_24h": ticker.get("high") or 0, "low_24h": ticker.get("low") or 0, "bid": ticker.get("bid") or 0, "ask": ticker.get("ask") or 0, } except Exception as e: logger.error(f"Ticker fetch mislukt: {e}") return result