79 lines
2.5 KiB
Python
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
|