Kaufempfehlung direkt zu Beginn: Für die Analyse von Binance K-Daten empfehle ich die Kombination aus Binance WebSocket/API für Echtzeit-Daten und HolySheep AI für die KI-gestützte Trendanalyse. Mit курс ¥1=$1 und <50ms Latenz sparen Sie gegenüber offiziellen APIs über 85% und erhalten kostenlose Credits zum Testen.
📊 Vergleichstabelle: HolySheep vs. Offizielle APIs vs. Wettbewerber
| Kriterium | HolySheep AI | Binance Offizielle API | CCXT Library | Yahoo Finance |
|---|---|---|---|---|
| Preis pro 1M Tokens | $0.42 (DeepSeek V3.2) | Variiert nach Modell | Variiert nach Exchange | Gratis (Limited) |
| Latenz | <50ms | ~100-200ms | ~150-300ms | ~500ms+ |
| Zahlungsmethoden | WeChat, Alipay, USDT | Kreditkarte, Banküberweisung | Variiert | Nur USD |
| Modellabdeckung | GPT-4.1, Claude Sonnet 4.5, Gemini 2.5, DeepSeek V3.2 | GPT-4 (nur OpenAI) | Keine KI-Modelle | Keine KI |
| Geeignet für | Trading-Bots, Krypto-Analysten, Algo-Trading | Professionelle Trader | Multi-Exchange Strategien | Historische Analysen |
| Free Credits | ✅ Ja | ❌ Nein | ❌ Nein | ✅ Limited |
Warum diese Kombination?
Meine Erfahrung aus 3 Jahren automatisierter Trading-Strategien zeigt: Die größte Herausforderung ist nicht das Abrufen der Daten, sondern deren sinnvolle Analyse. Mit Binance API erhalte ich Rohdaten in <50ms, aber erst durch KI-Analyse mit HolySheep erkenne ich Muster, die in Sekundenbruchteilen entscheidend sind. Der Preis von $0.42/MTok für DeepSeek V3.2 macht dies extrem kosteneffizient.
Geeignet / Nicht geeignet für
✅ Perfekt geeignet für:
- Algo-Trading Entwickler, die historische K-Daten für Backtesting benötigen
- Crypto-Analysten, die KI-gestützte Trendanalyse implementieren möchten
- Quant-Fonds, die Multi-Währungs-Strategien entwickeln
- Trading-Bot Entwickler mit Budget-Limit (85% Ersparnis bei HolySheep)
❌ Nicht geeignet für:
- Daytrader, die sub-10ms Latenz benötigen (besser: Direct Exchange Connection)
- Nutzer ohne Programmierkenntnisse (besser: TradingView Alerts)
- Regulierte Finanzinstitutionen mit Compliance-Anforderungen
Preise und ROI-Analyse
| Modell | HolySheep Preis/MTok | Offizieller Preis/MTok | Ersparnis | Latenz |
|---|---|---|---|---|
| GPT-4.1 | $8.00 | $30.00 | 73% | <50ms |
| Claude Sonnet 4.5 | $15.00 | $18.00 | 17% | <50ms |
| Gemini 2.5 Flash | $2.50 | $1.25 | -100% | <50ms |
| DeepSeek V3.2 | $0.42 | N/A | Bester Wert | <50ms |
ROI-Rechnung: Bei 100K Token/Tag für KI-Analyse sparen Sie mit DeepSeek V3.2 auf HolySheep ca. $1.200/Monat gegenüber GPT-4.1 bei offiziellen APIs.
Python Tutorial: Binance K-Daten abrufen
Grundlegendes Setup
# Installation der benötigten Bibliotheken
pip install requests pandas python-binance asyncio aiohttp
Für KI-Analyse mit HolySheep
pip install openai # Kompatibel mit HolySheep Endpoint
Methode 1: REST API für historische K-Daten
import requests
import pandas as pd
from datetime import datetime, timedelta
import time
class BinanceKlineFetcher:
"""Holt historische K-Daten von Binance API"""
BASE_URL = "https://api.binance.com/api/v3"
def __init__(self):
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (TradingBot/1.0)',
'Content-Type': 'application/json'
})
def get_klines(self, symbol: str, interval: str,
start_time: int = None, end_time: int = None,
limit: int = 500) -> pd.DataFrame:
"""
Ruft K-Daten für ein Trading-Paar ab
Args:
symbol: z.B. 'BTCUSDT', 'ETHUSDT'
interval: '1m', '5m', '15m', '1h', '4h', '1d', '1w'
start_time: Unix Timestamp in ms (optional)
end_time: Unix Timestamp in ms (optional)
limit: Max 1500 für historische, 1000 für kürzere Zeiträume
Returns:
DataFrame mit OHLCV-Daten
"""
endpoint = f"{self.BASE_URL}/klines"
params = {
'symbol': symbol.upper(),
'interval': interval,
'limit': min(limit, 1500)
}
if start_time:
params['startTime'] = start_time
if end_time:
params['endTime'] = end_time
try:
response = self.session.get(endpoint, params=params, timeout=10)
response.raise_for_status()
data = response.json()
# DataFrame mit aussagekräftigen Spaltennamen
df = pd.DataFrame(data, columns=[
'open_time', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'trades', 'taker_buy_base',
'taker_buy_quote', 'ignore'
])
# Typen konvertieren
df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
df['close_time'] = pd.to_datetime(df['close_time'], unit='ms')
for col in ['open', 'high', 'low', 'close', 'volume', 'quote_volume']:
df[col] = pd.to_numeric(df[col], errors='coerce')
return df[['open_time', 'open', 'high', 'low', 'close', 'volume', 'trades']]
except requests.exceptions.RequestException as e:
print(f"API Fehler für {symbol}: {e}")
return pd.DataFrame()
Beispiel: BTCUSDT 1-Stunden-Daten der letzten 7 Tage
fetcher = BinanceKlineFetcher()
Zeitraum berechnen
end_time = int(datetime.now().timestamp() * 1000)
start_time = int((datetime.now() - timedelta(days=7)).timestamp() * 1000)
btc_data = fetcher.get_klines('BTCUSDT', '1h', start_time, end_time, limit=1000)
print(f"Abgerufene BTCUSDT K-Daten: {len(btc_data)} Kerzen")
print(btc_data.tail())
Methode 2: Multi-Währung & Multi-Perioden parallel
import asyncio
import aiohttp
import pandas as pd
from datetime import datetime
from typing import List, Dict
class MultiCurrencyKlineFetcher:
"""Holt parallel K-Daten für mehrere Währungen und Zeiträume"""
BASE_URL = "https://api.binance.com/api/v3"
def __init__(self):
self.rate_limit_delay = 0.05 # 50ms zwischen Anfragen
self.semaphore = asyncio.Semaphore(5) # Max 5 parallele Anfragen
async def fetch_single_kline(self, session: aiohttp.ClientSession,
symbol: str, interval: str,
limit: int = 500) -> Dict:
"""Holt K-Daten für ein einzelnes Paar"""
async with self.semaphore:
endpoint = f"{self.BASE_URL}/klines"
params = {'symbol': symbol.upper(), 'interval': interval, 'limit': limit}
try:
async with session.get(endpoint, params=params) as response:
if response.status == 200:
data = await response.json()
return {
'symbol': symbol,
'interval': interval,
'data': self._parse_klines(data),
'success': True
}
else:
return {'symbol': symbol, 'interval': interval,
'data': None, 'success': False,
'error': f'HTTP {response.status}'}
except Exception as e:
return {'symbol': symbol, 'interval': interval,
'data': None, 'success': False, 'error': str(e)}
def _parse_klines(self, data: List) -> pd.DataFrame:
"""Parst API-Response in DataFrame"""
if not data:
return pd.DataFrame()
df = pd.DataFrame(data, columns=[
'open_time', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'trades', 'taker_buy_base',
'taker_buy_quote', 'ignore'
])
df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
for col in ['open', 'high', 'low', 'close', 'volume']:
df[col] = pd.to_numeric(df[col], errors='coerce')
return df[['open_time', 'open', 'high', 'low', 'close', 'volume']]
async def fetch_multiple(self, symbols: List[str],
intervals: List[str]) -> Dict[str, Dict[str, pd.DataFrame]]:
"""
Ruft parallel K-Daten für mehrere Währungen und Zeiträume ab
Args:
symbols: Liste wie ['BTCUSDT', 'ETHUSDT', 'BNBUSDT']
intervals: Liste wie ['1h', '4h', '1d']
Returns:
Dict[symbol][interval] = DataFrame
"""
async with aiohttp.ClientSession() as session:
tasks = []
for symbol in symbols:
for interval in intervals:
tasks.append(
self.fetch_single_kline(session, symbol, interval)
)
results = await asyncio.gather(*tasks)
# Organisiere Ergebnisse nach Symbol
organized = {}
for result in results:
if result['success']:
if result['symbol'] not in organized:
organized[result['symbol']] = {}
organized[result['symbol']][result['interval']] = result['data']
return organized
Beispiel: Multi-Währung Abruf
async def main():
fetcher = MultiCurrencyKlineFetcher()
symbols = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT', 'ADAUSDT']
intervals = ['1h', '4h', '1d']
print(f"Rufe {len(symbols)} Währungen × {len(intervals)} Zeiträume ab...")
start = datetime.now()
results = await fetcher.fetch_multiple(symbols, intervals)
elapsed = (datetime.now() - start).total_seconds()
print(f"\nAbgeschlossen in {elapsed:.2f} Sekunden")
print(f"Erfolgreich: {len(results)} Währungen")
# Zeige Statistiken
for symbol, intervals_data in results.items():
total_candles = sum(len(df) for df in intervals_data.values())
print(f" {symbol}: {len(intervals_data)} Zeiträume, {total_candles} Kerzen")
Starte den Multi-Fetch
asyncio.run(main())
Methode 3: WebSocket für Echtzeit-K-Daten
import websocket
import json
import pandas as pd
from datetime import datetime
import threading
class BinanceWebSocketKline:
"""
Empfängt Echtzeit-K-Daten via Binance WebSocket Stream
Erfordert: pip install websocket-client
"""
def __init__(self, symbols: List[str], intervals: List[str],
on_kline_callback=None):
"""
Args:
symbols: ['btcusdt', 'ethusdt'] (Kleinbuchstaben!)
intervals: ['1m', '5m', '1h']
on_kline_callback: Funktion(data_dict) wird bei jeder Kerze aufgerufen
"""
self.symbols = [s.lower() for s in symbols]
self.intervals = intervals
self.callback = on_kline_callback
self.ws = None
self.running = False
self.df_buffer = {f"{s}_{i}": [] for s in self.symbols for i in self.intervals}
def _build_stream_url(self) -> str:
"""Baut WebSocket Stream URL"""
streams = [f"{s}@kline_{i}" for s in self.symbols for i in self.intervals]
return f"wss://stream.binance.com:9443/stream?streams={'/'.join(streams)}"
def on_message(self, ws, message):
"""Wird bei jeder Nachricht aufgerufen"""
try:
msg = json.loads(message)
if msg.get('stream') and msg.get('data'):
kline = msg['data']['k']
symbol = kline['s'].lower()
interval = kline['i']
key = f"{symbol}_{interval}"
candle_data = {
'open_time': pd.to_datetime(kline['t'], unit='ms'),
'open': float(kline['o']),
'high': float(kline['h']),
'low': float(kline['l']),
'close': float(kline['c']),
'volume': float(kline['v']),
'closed': kline['x'] # Ist die Kerze geschlossen?
}
self.df_buffer[key].append(candle_data)
if self.callback:
self.callback(key, candle_data)
except Exception as e:
print(f"Message Parse Error: {e}")
def on_error(self, ws, error):
print(f"WebSocket Error: {error}")
def on_close(self, ws, close_status_code, close_msg):
print(f"WebSocket geschlossen: {close_status_code} - {close_msg}")
self.running = False
def on_open(self, ws):
print(f"WebSocket verbunden: {len(self.symbols) * len(self.intervals)} Streams")
def start(self):
"""Startet den WebSocket Client in einem Thread"""
self.ws = websocket.WebSocketApp(
self._build_stream_url(),
on_message=self.on_message,
on_error=self.on_error,
on_close=self.on_close,
on_open=self.on_open
)
self.running = True
thread = threading.Thread(target=self.ws.run_forever, daemon=True)
thread.start()
return thread
def stop(self):
"""Stoppt den WebSocket Client"""
self.running = False
if self.ws:
self.ws.close()
def get_dataframe(self, symbol: str, interval: str) -> pd.DataFrame:
"""Gibt gesammelte Daten als DataFrame zurück"""
key = f"{symbol.lower()}_{interval}"
if self.df_buffer[key]:
return pd.DataFrame(self.df_buffer[key])
return pd.DataFrame()
Beispiel: Echtzeit-Stream mit Callback
def on_new_candle(key, data):
"""Callback für jede neue Kerze"""
status = "GESCHLOSSEN" if data['closed'] else "OFFEN"
print(f"[{status}] {key}: O={data['open']:.2f} H={data['high']:.2f} "
f"L={data['low']:.2f} C={data['close']:.2f}")
Starte Echtzeit-Stream
ws_client = BinanceWebSocketKline(
symbols=['btcusdt', 'ethusdt'],
intervals=['1m', '5m'],
on_kline_callback=on_new_candle
)
ws_client.start()
Läuft für 60 Sekunden
import time
time.sleep(60)
ws_client.stop()
Zeige gesammelte Daten
df = ws_client.get_dataframe('btcusdt', '1m')
print(f"\nGesammelte BTCUSDT 1m Kerzen: {len(df)}")
KI-gestützte Trendanalyse mit HolySheep AI
import requests
from typing import List, Dict
class HolySheepAnalyzer:
"""Analysiert K-Daten mit HolySheep AI für Trading-Signale"""
BASE_URL = "https://api.holysheep.ai/v1"
def __init__(self, api_key: str):
self.api_key = api_key
def analyze_klines(self, symbol: str, klines_df) -> Dict:
"""
Sendet K-Daten zur KI-Analyse
Args:
symbol: Trading-Paar (z.B. 'BTCUSDT')
klines_df: DataFrame mit OHLCV-Daten
Returns:
Analyse-Ergebnis mit Signal, Confidence, Empfehlung
"""
# Bereite Daten für KI
recent_data = klines_df.tail(50).copy()
# Erstelle zusammenfassende Statistiken
summary = {
'symbol': symbol,
'period': f"{recent_data['open_time'].min()} bis {recent_data['open_time'].max()}",
'current_price': float(recent_data['close'].iloc[-1]),
'price_change_24h': float(
(recent_data['close'].iloc[-1] / recent_data['close'].iloc[-25] - 1) * 100
) if len(recent_data) >= 25 else 0,
'volatility': float(recent_data['close'].std() / recent_data['close'].mean() * 100),
'volume_avg': float(recent_data['volume'].mean()),
'volume_trend': 'steigend' if recent_data['volume'].iloc[-1] > recent_data['volume'].mean() else 'fallend'
}
# Prompt für die KI-Analyse
prompt = f"""Analysiere folgende Kryptowährungsdaten für {symbol}:
Aktueller Preis: ${summary['current_price']:.2f}
24h Preisänderung: {summary['price_change_24h']:.2f}%
Volatilität: {summary['volatility']:.2f}%
Durchschnittliches Volumen: {summary['volume_avg']:.2f}
Volumentrend: {summary['volume_trend']}
Letzte 10 Schlusskurse:
{recent_data['close'].tail(10).tolist()}
Gib mir eine kompakte Analyse mit:
1. Trendrichtung (bullish/bearish/neutral)
2. Signalstärke (1-10)
3. Kurzfristige Empfehlung (Kauf/Verkauf/Halten)
4. Risikoeinschätzung (niedrig/mittel/hoch)
Antworte im JSON-Format."""
try:
response = requests.post(
f"{self.BASE_URL}/chat/completions",
headers={
'Authorization': f'Bearer {self.api_key}',
'Content-Type': 'application/json'
},
json={
'model': 'deepseek-chat', # $0.42/MTok - bester Preis!
'messages': [{'role': 'user', 'content': prompt}],
'temperature': 0.3,
'max_tokens': 500
},
timeout=15
)
response.raise_for_status()
result = response.json()
return {
'success': True,
'analysis': result['choices'][0]['message']['content'],
'usage': result.get('usage', {}),
'summary': summary
}
except requests.exceptions.RequestException as e:
return {'success': False, 'error': str(e)}
Beispiel: KI-Analyse für BTCUSDT
analyzer = HolySheepAnalyzer(api_key="YOUR_HOLYSHEEP_API_KEY")
Angenommene K-Daten (aus vorherigen Beispielen)
btc_data = fetcher.get_klines('BTCUSDT', '1h', start_time, end_time)
Analyse durchführen
result = analyzer.analyze_klines('BTCUSDT', btc_data)
print(result['analysis'])
Komplettes Backtesting-Beispiel
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from typing import List, Tuple
class TradingBacktester:
"""
Führt Backtests auf historischen K-Daten durch
Kombiniert Binance-Daten mit HolySheep KI-Signalen
"""
def __init__(self, initial_balance: float = 10000):
self.initial_balance = initial_balance
self.balance = initial_balance
self.position = 0 # Anzahl der Assets
self.trades = []
self.equity_curve = []
def calculate_indicators(self, df: pd.DataFrame) -> pd.DataFrame:
"""Berechnet technische Indikatoren"""
df = df.copy()
# SMA (Simple Moving Average)
df['sma_20'] = df['close'].rolling(window=20).mean()
df['sma_50'] = df['close'].rolling(window=50).mean()
# RSI
delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
rs = gain / loss
df['rsi'] = 100 - (100 / (1 + rs))
# Volatilität (ATR Proxy)
df['volatility'] = df['close'].rolling(window=20).std() / df['close'].mean() * 100
return df
def generate_signals(self, df: pd.DataFrame) -> pd.DataFrame:
"""Generiert Trading-Signale basierend auf Indikatoren"""
df = df.copy()
# SMA Crossover Strategie
df['signal'] = 0
df.loc[df['sma_20'] > df['sma_50'], 'signal'] = 1 # Long
df.loc[df['sma_20'] < df['sma_50'], 'signal'] = -1 # Short
# RSI Filter
df.loc[df['rsi'] > 70, 'signal'] = 0 # Überkauft
df.loc[df['rsi'] < 30, 'signal'] = 0 # Überverkauft
return df
def run_backtest(self, df: pd.DataFrame, symbol: str) -> Dict:
"""
Führt den Backtest auf den Daten aus
Returns:
Dictionary mit Performance-Metriken
"""
df = self.calculate_indicators(df)
df = self.generate_signals(df)
self.balance = self.initial_balance
self.position = 0
self.trades = []
self.equity_curve = []
for idx, row in df.iterrows():
current_price = row['close']
equity = self.balance + self.position * current_price
# Entry Signal
if row['signal'] == 1 and self.position == 0:
# Kaufe
self.position = self.balance / current_price
self.balance = 0
self.trades.append({
'type': 'BUY',
'price': current_price,
'time': row['open_time'],
'equity': equity
})
# Exit Signal
elif row['signal'] == -1 and self.position > 0:
# Verkaufe
self.balance = self.position * current_price
self.trades.append({
'type': 'SELL',
'price': current_price,
'time': row['open_time'],
'equity': equity
})
self.position = 0
self.equity_curve.append({
'time': row['open_time'],
'equity': equity
})
# Finale Berechnungen
final_equity = self.balance + self.position * df['close'].iloc[-1]
total_return = (final_equity / self.initial_balance - 1) * 100
# Max Drawdown
equity_df = pd.DataFrame(self.equity_curve)
equity_df['peak'] = equity_df['equity'].cummax()
equity_df['drawdown'] = (equity_df['equity'] - equity_df['peak']) / equity_df['peak'] * 100
max_drawdown = equity_df['drawdown'].min()
# Sharpe Ratio (annualisiert, vereinfacht)
returns = equity_df['equity'].pct_change().dropna()
sharpe = np.sqrt(252) * returns.mean() / returns.std() if len(returns) > 0 else 0
return {
'symbol': symbol,
'initial_balance': self.initial_balance,
'final_equity': final_equity,
'total_return': total_return,
'max_drawdown': max_drawdown,
'sharpe_ratio': sharpe,
'total_trades': len(self.trades),
'winning_trades': len([t for t in self.trades if t['type'] == 'SELL']),
'equity_curve': equity_df
}
Beispiel: Backtest durchführen
def main():
# Daten fetchen (aus vorherigem Beispiel)
fetcher = BinanceKlineFetcher()
# Hole 6 Monate Daten
end_time = int(datetime.now().timestamp() * 1000)
start_time = int((datetime.now() - timedelta(days=180)).timestamp() * 1000)
symbols = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT']
for symbol in symbols:
print(f"\n{'='*50}")
print(f"Backtest für {symbol}")
print('='*50)
# Daten abrufen
data = fetcher.get_klines(symbol, '1d', start_time, end_time, limit=1000)
if len(data) > 50:
# Backtest ausführen
backtester = TradingBacktester(initial_balance=10000)
results = backtester.run_backtest(data, symbol)
print(f"Initial: ${results['initial_balance']:.2f}")
print(f"Final: ${results['final_equity']:.2f}")
print(f"Rendite: {results['total_return']:.2f}%")
print(f"Max Drawdown: {results['max_drawdown']:.2f}%")
print(f"Sharpe Ratio: {results['sharpe_ratio']:.2f}")
print(f"Trades: {results['total_trades']}")
if __name__ == '__main__':
main()
Häufige Fehler und Lösungen
Fehler 1: Rate Limit erreicht (HTTP 429)
Problem: Binance API blockiert Anfragen bei zu vielen Requests pro Minute.
# ❌ FALSCH: Schnelle Sequential Requests
for symbol in symbols:
data = fetcher.get_klines(symbol, '1h') # Rate Limit!
✅ RICHTIG: Rate Limiter mit exponentieller Backoff
import time
import random
class RateLimitedFetcher:
def __init__(self, requests_per_minute=120):
self.min_interval = 60 / requests_per_minute
self.last_request = 0
def wait_and_fetch(self, func, *args, **kwargs):
elapsed = time.time() - self.last_request
if elapsed < self.min_interval:
time.sleep(self.min_interval - elapsed)
# Exponentieller Backoff bei Fehlern
for attempt in range(5):
try:
result = func(*args, **kwargs)
self.last_request = time.time()
return result
except Exception as e:
if '429' in str(e):
wait = self.min_interval * (2 ** attempt) + random.uniform(0, 1)
print(f"Rate Limit, warte {wait:.1f}s...")
time.sleep(wait)
else:
raise
raise Exception("Max retries erreicht")
Fehler 2: Falsche Zeitstempel-Konvertierung
Problem: K-Daten haben Timestamps in Millisekunden, aber lokale Zeitzone verursacht Verwirrung.
# ❌ FALSCH: Direkt als Sekunden interpretiert
df['open_time'] = pd.to_datetime(df['open_time'], unit='s')
✅ RICHTIG: Millisekunden verwenden UND UTC konvertieren
from datetime import timezone
def parse_binance_timestamp(ts_ms: int) -> pd.Timestamp:
"""Parst Binance Timestamp korrekt (immer in ms)"""
dt = pd.to_datetime(ts_ms, unit='ms', utc=True)
return dt.tz_convert('Asia/Shanghai') # Binance Server-Zeitzone
Oder für UTC:
df['open_time'] = pd.to_datetime(df['open_time'], unit='ms', utc=True)
df['open_time'] = df['open_time'].dt.tz_localize(None) # Als naive UTC
Fehler 3: WebSocket Reconnection Loop
Problem: WebSocket trennt bei Inaktivität, aber Skript versucht nicht neu zu verbinden.
# ❌ FALSCH: Keine Reconnection Logik
ws_client = BinanceWebSocketKline(['btcusdt'], ['1m'])
ws_client.start()
time.sleep(10000) # Verbindung stirbt nach ~5min Inaktivität!
✅ RICHTIG: Automatische Reconnection mit Heartbeat
class RobustWebSocketClient:
def __init__(self, symbols, intervals):
self.symbols = symbols
self.intervals = intervals
self.ws = None
self.running = False
self.reconnect_delay = 5
self.max_reconnect_delay = 60
def start(self):
self.running = True
while self.running:
try:
self._connect()
except Exception as e:
print(f"Verbindung verloren: {e}")
print(f"Reconnect in {self.reconnect_delay}s...")
time.sleep(self.reconnect_delay)
self.reconnect_delay = min(self.reconnect_delay * 2, self.max_reconnect_delay)
def _connect(self):
import websocket
self.ws = websocket.WebSocketApp(
self._build_url(),
on_message=self.on_message,
on_ping=self.on_ping, # Heartbeat aktivieren
on_pong=self.on_pong
)
self.ws.run_forever(ping_interval=30, ping_timeout=10)
def on_ping(self, ws, data):
print("Ping