Files
2026-10-30 09:20:09 +01:00

79 lines
2.5 KiB
Python

"""
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