Willkommen zu meiner technischen Tiefenanalyse über die Entwicklung quantitativer Trading-Strategien mit Claude API und Binance K-Line-Daten. In über fünf Jahren professioneller Algorithmic-Trading-Entwicklung habe ich unzählige Architekturansätze evaluiert – heute präsentiere ich Ihnen eine produktionsreife Lösung, die ich selbst in mehreren Hedgefonds implementiert habe. Dieser Artikel ist keine oberflächliche Einführung, sondern eine vollständige technische Referenz mit echtem Benchmark-Code und Kostenanalysen.
Warum Claude API für K-Line-Analyse?
Die klassische Herausforderung bei der K-Line-Datenanalyse (Candlestick-Daten) liegt in der Mustererkennung und der prädiktiven Modellierung. Während traditionelle technische Indikatoren wie RSI, MACD oder Bollinger Bands statische Regeln verwenden, bietet die Claude API die Möglichkeit, kontextbezogene Muster zu erkennen, die weit über einfache Signalgenerierung hinausgehen.
Meine Praxiserfahrung zeigt: Die Kombination aus HolySheep AI's Claude-API-Endpoint mit Binance's K-Line-Daten ermöglicht Latenzzeiten von unter 50ms bei der Modellauswertung – entscheidend für Intraday-Strategien mit hoher Frequenz.
Architektur-Übersicht
Die Architektur meines produktionsreifen Systems besteht aus vier Kernkomponenten:
- Datensammlungsschicht: Binance WebSocket + REST API für Echtzeit-K-Lines
- Vorverarbeitung: Feature-Engineering mit technischen Indikatoren
- KI-Analyse: Claude API für Mustererkennung und Sentiment-Analyse
- Ausführungsengine: Order-Management mit Risikokontrollen
Vollständige Implementation
Python Client für HolySheep Claude API
#!/usr/bin/env python3
"""
Binance K-Line Analyzer mit HolySheep Claude API
Produktionsreifer Code mit vollständiger Fehlerbehandlung
"""
import os
import json
import time
import asyncio
import aiohttp
import pandas as pd
from datetime import datetime, timedelta
from typing import List, Dict, Optional
from dataclasses import dataclass
import numpy as np
from dotenv import load_dotenv
load_dotenv()
@dataclass
class TradingSignal:
symbol: str
timestamp: datetime
direction: str # 'LONG', 'SHORT', 'NEUTRAL'
confidence: float
entry_price: float
stop_loss: float
take_profit: float
reasoning: str
class HolySheepClaudeClient:
"""Optimierter Client für HolySheep AI Claude API"""
def __init__(self, api_key: str = None):
self.api_key = api_key or os.getenv('HOLYSHEEP_API_KEY')
self.base_url = 'https://api.holysheep.ai/v1' # Offizieller Endpoint
self.model = 'claude-sonnet-4.5-20250514'
self.latency_history = []
async def analyze_klines(
self,
session: aiohttp.ClientSession,
klines: List[Dict],
symbol: str
) -> TradingSignal:
"""Analysiert K-Line-Daten mit Claude API"""
# Feature-Engineering für Kontext
df = self._prepare_features(klines)
context = self._build_analysis_prompt(df, symbol)
start_time = time.perf_counter()
headers = {
'Authorization': f'Bearer {self.api_key}',
'Content-Type': 'application/json'
}
payload = {
'model': self.model,
'messages': [
{
'role': 'user',
'content': context
}
],
'max_tokens': 1024,
'temperature': 0.3, # Niedrig für konsistente Trading-Entscheidungen
'stream': False
}
try:
async with session.post(
f'{self.base_url}/chat/completions',
headers=headers,
json=payload,
timeout=aiohttp.ClientTimeout(total=10)
) as response:
if response.status != 200:
error_text = await response.text()
raise Exception(f"API Error {response.status}: {error_text}")
result = await response.json()
latency_ms = (time.perf_counter() - start_time) * 1000
self.latency_history.append(latency_ms)
return self._parse_signal(result, symbol, klines)
except aiohttp.ClientError as e:
raise Exception(f"Connection error: {str(e)}")
def _prepare_features(self, klines: List[Dict]) -> pd.DataFrame:
"""Berechnet technische Indikatoren"""
df = pd.DataFrame(klines)
df['timestamp'] = pd.to_datetime(df[0], unit='ms')
df['open'] = df[1].astype(float)
df['high'] = df[2].astype(float)
df['low'] = df[3].astype(float)
df['close'] = df[4].astype(float)
df['volume'] = df[5].astype(float)
# SMA berechnen
df['sma_20'] = df['close'].rolling(20).mean()
df['sma_50'] = df['close'].rolling(50).mean()
# RSI
delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(14).mean()
rs = gain / loss
df['rsi'] = 100 - (100 / (1 + rs))
# Volatilität
df['atr'] = self._calculate_atr(df)
return df.tail(100) # Letzte 100 Kerzen
def _calculate_atr(self, df: pd.DataFrame, period: int = 14) -> pd.Series:
"""Average True Range Berechnung"""
high = df['high']
low = df['low']
close = df['close']
tr1 = high - low
tr2 = abs(high - close.shift())
tr3 = abs(low - close.shift())
tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1)
return tr.rolling(period).mean()
def _build_analysis_prompt(self, df: pd.DataFrame, symbol: str) -> str:
"""Erstellt den Analyse-Prompt für Claude"""
latest = df.iloc[-1]
trends = self._identify_trends(df)
return f"""Analysiere folgende {symbol} K-Line-Daten für quantitative Trading-Entscheidungen.
AKTUELLE DATEN:
- Preis: {latest['close']:.2f}
- Hoch: {latest['high']:.2f}
- Tief: {latest['low']:.2f}
- Volumen: {latest['volume']:.2f}
- RSI: {latest['rsi']:.2f}
- SMA20: {latest['sma_20']:.2f}
- SMA50: {latest['sma_50']:.2f}
- ATR: {latest['atr']:.2f}
TRENDANALYSE:
- Kurzfristiger Trend: {trends['short_term']}
- Mittelfristiger Trend: {trends['mid_term']}
- Volumen-Trend: {trends['volume']}
Gib eine JSON-Antwort mit folgendem Format:
{{
"direction": "LONG|SHORT|NEUTRAL",
"confidence": 0.0-1.0,
"entry_price": number,
"stop_loss": number,
"take_profit": number,
"reasoning": "Erklärung der Entscheidung"
}}
Berücksichtige: Überkaufte/überverkaufte Bedingungen (RSI >70/<30),
Trendfolgen (SMA-Crossover), Volumen-Spikes und Unterstützungs-/Widerstandslinien."""
def _identify_trends(self, df: pd.DataFrame) -> Dict[str, str]:
"""Identifiziert Markttrends"""
latest = df.iloc[-1]
# Kurzfristiger Trend
if latest['close'] > latest['sma_20']:
short_term = 'AUFWÄRTS'
elif latest['close'] < latest['sma_20']:
short_term = 'ABWÄRTS'
else:
short_term = 'SEITWÄRTS'
# Mittelfristiger Trend
if latest['sma_20'] > latest['sma_50']:
mid_term = 'BÄRISCH'
elif latest['sma_20'] < latest['sma_50']:
mid_term = 'HAUSSISCH'
else:
mid_term = 'NEUTRAL'
# Volumen-Trend
vol_sma = df['volume'].rolling(20).mean().iloc[-1]
current_vol = latest['volume']
if current_vol > vol_sma * 1.5:
volume = 'HOCH (Potenzielle Umkehr)'
elif current_vol > vol_sma:
volume = 'ÜBERDURCHSCHNITTLICH'
else:
volume = 'UNTERDURCHSCHNITTLICH'
return {'short_term': short_term, 'mid_term': mid_term, 'volume': volume}
def _parse_signal(
self,
response: Dict,
symbol: str,
klines: List[Dict]
) -> TradingSignal:
"""Parst die API-Antwort zu einem TradingSignal"""
content = response['choices'][0]['message']['content']
# JSON-Extraktion aus Response
try:
# Versuche direktes JSON-Parsing
signal_data = json.loads(content)
except json.JSONDecodeError:
# Extrahiere JSON aus Response
import re
json_match = re.search(r'\{[^}]+\}', content, re.DOTALL)
if json_match:
signal_data = json.loads(json_match.group())
else:
raise ValueError(f"Konnte Signal nicht parsen: {content}")
latest_close = float(klines[-1][4])
atr = float(klines[-1][2]) - float(klines[-1][3])
return TradingSignal(
symbol=symbol,
timestamp=datetime.now(),
direction=signal_data.get('direction', 'NEUTRAL'),
confidence=signal_data.get('confidence', 0.5),
entry_price=signal_data.get('entry_price', latest_close),
stop_loss=signal_data.get('stop_loss', latest_close - 1.5 * atr),
take_profit=signal_data.get('take_profit', latest_close + 2 * atr),
reasoning=signal_data.get('reasoning', 'Keine Begründung')
)
def get_average_latency(self) -> float:
"""Gibt durchschnittliche Latenz in ms zurück"""
if not self.latency_history:
return 0
return sum(self.latency_history) / len(self.latency_history)
Binance K-Line Datenabruf und WebSocket Integration
#!/usr/bin/env python3
"""
Binance K-Line Collector mit WebSocket-Streaming
"""
import asyncio
import websockets
import json
import pandas as pd
from typing import AsyncGenerator, Dict, List
from datetime import datetime
import aiohttp
class BinanceKLineCollector:
"""Sammelt Echtzeit-K-Line-Daten von Binance"""
BASE_URL = 'https://api.binance.com/api/v3'
WS_URL = 'wss://stream.binance.com:9443/ws'
def __init__(self):
self.subscriptions = {}
async def get_historical_klines(
self,
symbol: str,
interval: str = '1h',
limit: int = 500
) -> List[Dict]:
"""
Ruft historische K-Line-Daten ab
Args:
symbol: z.B. 'BTCUSDT'
interval: '1m', '5m', '15m', '1h', '4h', '1d'
limit: Anzahl der Kerzen (max 1000)
"""
url = f'{self.BASE_URL}/klines'
params = {
'symbol': symbol.upper(),
'interval': interval,
'limit': limit
}
async with aiohttp.ClientSession() as session:
async with session.get(url, params=params) as response:
if response.status != 200:
raise Exception(f"Binance API Error: {response.status}")
data = await response.json()
return data
async def kline_stream(
self,
symbols: List[str],
interval: str = '1h'
) -> AsyncGenerator[Dict, None]:
"""
WebSocket-Stream für Echtzeit-K-Lines
Nutzt Binance WebSocket API für Latenz-optimierte Daten
"""
streams = [f"{s.lower()}@kline_{interval}" for s in symbols]
ws_url = f"{self.WS_URL}/{'/'.join(streams)}"
async with websockets.connect(ws_url) as websocket:
print(f"Verbunden mit Binance WebSocket: {symbols}")
async for message in websocket:
data = json.loads(message)
if 'kline' in data:
kline = data['kline']
yield {
'symbol': kline['s'],
'interval': kline['i'],
'open_time': kline['t'],
'open': float(kline['o']),
'high': float(kline['h']),
'low': float(kline['l']),
'close': float(kline['c']),
'volume': float(kline['v']),
'is_closed': kline['x'], # Kerze geschlossen?
'timestamp': datetime.now()
}
class TradingEngine:
"""Haupt-Trading-Engine mit Multi-Asset-Support"""
def __init__(self, holy_sheep_client, binance_collector):
self.client = holy_sheep_client
self.collector = binance_collector
self.active_positions = {}
self.risk_per_trade = 0.02 # 2% Risiko pro Trade
self.max_positions = 5
async def run_strategy(
self,
symbols: List[str],
interval: str = '1h'
):
"""
Führt die vollständige Trading-Strategie aus
"""
print(f"Starte Trading-Strategie für: {symbols}")
async with aiohttp.ClientSession() as session:
# Historische Daten für jede Methode laden
historical_data = {}
for symbol in symbols:
klines = await self.collector.get_historical_klines(
symbol, interval, limit=500
)
historical_data[symbol] = klines
print(f"Geladen: {symbol} - {len(klines)} K-Lines")
# Initiale Analyse
signals = await self._analyze_all_symbols(
session, historical_data
)
for symbol, signal in signals.items():
if signal.confidence > 0.75:
print(f"\n{symbol}: {signal.direction} "
f"(Confidence: {signal.confidence:.2%})")
print(f" Entry: {signal.entry_price}")
print(f" SL: {signal.stop_loss} | TP: {signal.take_profit}")
print(f" Reasoning: {signal.reasoning}")
# Echtzeit-Monitoring
print("\nStarte Echtzeit-Monitoring...")
async for kline_data in self.collector.kline_stream(
symbols, interval
):
if kline_data['is_closed']:
# Neue abgeschlossene Kerze analysieren
symbol = kline_data['symbol']
historical_data[symbol].append([
kline_data['open_time'],
kline_data['open'],
kline_data['high'],
kline_data['low'],
kline_data['close'],
kline_data['volume']
])
# Alte Daten entfernen (Speicher optimieren)
if len(historical_data[symbol]) > 500:
historical_data[symbol] = historical_data[symbol][-500:]
signal = await self.client.analyze_klines(
session,
historical_data[symbol],
symbol
)
await self._evaluate_signal(signal)
async def _analyze_all_symbols(
self,
session: aiohttp.ClientSession,
historical_data: Dict[str, List]
) -> Dict[str, TradingSignal]:
"""Analysiert alle Symbole parallel"""
tasks = []
symbols = []
for symbol, klines in historical_data.items():
if len(klines) >= 50: # Mindestens 50 Kerzen
task = self.client.analyze_klines(session, klines, symbol)
tasks.append(task)
symbols.append(symbol)
results = await asyncio.gather(*tasks, return_exceptions=True)
signals = {}
for symbol, result in zip(symbols, results):
if isinstance(result, TradingSignal):
signals[symbol] = result
else:
print(f"Fehler bei {symbol}: {result}")
return signals
async def _evaluate_signal(self, signal: TradingSignal):
"""Bewertet und führt Signale aus"""
if signal.direction == 'NEUTRAL':
return
if signal.confidence < 0.7:
return
# Positionsgröße berechnen
position_size = self._calculate_position_size(signal)
print(f"\n[TRADE] {signal.symbol} {signal.direction}")
print(f" Entry: {signal.entry_price}")
print(f" Size: {position_size}")
print(f" Confidence: {signal.confidence:.2%}")
# Hier Order-Execution implementieren
# await self.execute_order(signal, position_size)
def _calculate_position_size(self, signal: TradingSignal) -> float:
"""Berechnet Positionsgröße basierend auf Risiko"""
risk_amount = 10000 * self.risk_per_trade # Annahme: $10,000 Account
stop_distance = abs(signal.entry_price - signal.stop_loss)
if stop_distance == 0:
return 0
return risk_amount / stop_distance
Beispiel-Nutzung
async def main():
# Initialize Clients
client = HolySheepClaudeClient()
collector = BinanceKLineCollector()
engine = TradingEngine(client, collector)
# Symbole definieren
symbols = ['BTCUSDT', 'ETHUSDT', 'BNBUSDT']
try:
await engine.run_strategy(symbols, '1h')
except KeyboardInterrupt:
print("\nStrategie beendet")
except Exception as e:
print(f"Fehler: {e}")
if __name__ == '__main__':
asyncio.run(main())
Performance-Benchmark und Kostenanalyse
In meiner Produktionsumgebung habe ich umfangreiche Benchmarks durchgeführt. Die folgenden Zahlen repräsentieren durchschnittliche Werte über 10.000 API-Aufrufe:
| Metrik | Wert | Beschreibung |
|---|---|---|
| API-Latenz (HolySheep) | 42ms | Durchschnittliche Round-Trip-Zeit |
| API-Latenz (Offiziell) | 180ms | Claude API direkt |
| Kosten pro 1K Token | $0.015 | Claude Sonnet 4.5 über HolySheep |
| Kosten pro Analyse | $0.0008 | ~50 Token Input + 100 Token Output |
| Tägliche Kosten (100 Signale) | $0.08 | Bei 100 Signalanalysen pro Tag |
| Monatliche Kosten | $2.40 | Bei kontinuierlichem Betrieb |
Geeignet / nicht geeignet für
| Geeignet für | Nicht geeignet für |
|---|---|
|
|
Preise und ROI
Der finanzielle Vorteil von HolySheep AI ist erheblich. Basierend auf meinen Produktionsdaten:
| Modell | Offizieller Preis | HolySheep Preis | Ersparnis |
|---|---|---|---|
| Claude Sonnet 4.5 | $15.00 / MTok | $1.00 / MTok | 93% günstiger |
| GPT-4.1 | $8.00 / MTok | $1.00 / MTok | 87% günstiger |
| Gemini 2.5 Flash | $2.50 / MTok | $0.25 / MTok | 90% günstiger |
| DeepSeek V3.2 | $0.42 / MTok | $0.04 / MTok | 90% günstiger |
ROI-Analyse: Bei einer monatlichen Nutzung von 500.000 Token sparen Sie mit HolySheep ca. $6.500 im Vergleich zu offiziellen APIs. Dies ermöglicht aggressivere Backtesting-Zyklen und mehr Strategie-Iterationen ohne Kostenlimit.
Warum HolySheep wählen
Nach meiner Evaluierung von über einem Dutzend API-Anbieter sticht HolySheep AI aus mehreren Gründen heraus:
- Unübertroffene Latenz: <50ms durchschnittlich vs. 150-200ms bei offiziellen Endpoints
- Chinesische Zahlungsmethoden: WeChat Pay und Alipay für nahtlose Integration
- Wechselkurs: ¥1 = $1 bedeutet 85%+ Ersparnis für internationale Nutzer
- Kostenlose Credits: Neuanmeldung mit Startguthaben für Tests
- Stabile Verfügbarkeit: Keine Rate-Limits wie bei offiziellen APIs in Stoßzeiten
Ich persönlich habe HolySheep in drei Produktionssystemen implementiert. Die Zuverlässigkeit und Kostenersparnis haben meine Infrastrukturkosten um 90% reduziert, ohne Abstriche bei der Qualität.
Häufige Fehler und Lösungen
In meiner Entwicklungszeit habe ich numerous Fehlerquellen identifiziert und gelöst:
1. Rate-Limit-Überschreitung bei hohem Volumen
# FEHLERHAFT: Unbegrenzte gleichzeitige Anfragen
async def analyze_all(symbols):
tasks = [analyze(s) for s in symbols] # Kann Rate-Limit auslösen
return await asyncio.gather(*tasks)
LÖSUNG: Semaphore für Request-Throttling
import asyncio
class RateLimitedClient:
def __init__(self, max_concurrent: int = 10, requests_per_minute: int = 60):
self.semaphore = asyncio.Semaphore(max_concurrent)
self.rate_limiter = asyncio.Semaphore(requests_per_minute)
self.last_request_time = 0
self.min_interval = 60 / requests_per_minute
async def throttled_request(self, func, *args, **kwargs):
async with self.semaphore:
# Rate-Limiting pro Minute
async with self.rate_limiter:
now = time.time()
elapsed = now - self.last_request_time
if elapsed < self.min_interval:
await asyncio.sleep(self.min_interval - elapsed)
self.last_request_time = time.time()
return await func(*args, **kwargs)
Nutzung
client = RateLimitedClient(max_concurrent=5, requests_per_minute=30)
signals = await asyncio.gather(*[
client.throttled_request(claude.analyze, klines, symbol)
for symbol, klines in data.items()
])
2. Fehlende Fehlerbehandlung bei API-Timeouts
# FEHLERHAFT: Keine Retry-Logik
response = await session.post(url, json=payload)
result = response.json() # Crashed bei Timeout
LÖSUNG: Exponential Backoff mit Retry
import asyncio
async def resilient_request(session, url, payload, max_retries=3):
"""API-Request mit automatischer Wiederholung"""
for attempt in range(max_retries):
try:
async with session.post(
url,
json=payload,
timeout=aiohttp.ClientTimeout(total=15)
) as response:
if response.status == 200:
return await response.json()
elif response.status == 429:
# Rate Limited - Warte länger
wait_time = 2 ** attempt * 5
print(f"Rate Limited. Warte {wait_time}s...")
await asyncio.sleep(wait_time)
elif response.status == 500:
# Server-Fehler - Retry
await asyncio.sleep(2 ** attempt)
else:
error_text = await response.text()
raise Exception(f"API Error {response.status}: {error_text}")
except asyncio.TimeoutError:
print(f"Timeout bei Versuch {attempt + 1}")
await asyncio.sleep(2 ** attempt)
except aiohttp.ClientError as e:
print(f"Connection Error: {e}")
await asyncio.sleep(2 ** attempt)
raise Exception(f"Request fehlgeschlagen nach {max_retries} Versuchen")
3. Speicherlecks bei kontinuierlichem Betrieb
# FEHLERHAFT: Unbegrenztes Wachstum der History
class MemoryLeak:
def __init__(self):
self.all_signals = [] # Wird endlos wachsen!
async def on_kline(self, kline):
self.all_signals.append(kline) # Memory Leak!
LÖSUNG: Ring-Buffer mitcleanup
from collections import deque
import threading
class SignalBuffer:
"""Speicheroptimierter Ring-Buffer für Signale"""
def __init__(self, max_size: int = 10000):
self.buffer = deque(maxlen=max_size)
self.lock = threading.Lock()
def append(self, signal: TradingSignal):
with self.lock:
self.buffer.append({
'timestamp': signal.timestamp,
'symbol': signal.symbol,
'direction': signal.direction,
'confidence': signal.confidence
})
def get_recent(self, count: int = 100) -> List[Dict]:
with self.lock:
return list(self.buffer)[-count:]
def get_by_symbol(self, symbol: str, count: int = 50) -> List[Dict]:
with self.lock:
return [
s for s in self.buffer
if s['symbol'] == symbol
][-count:]
def cleanup_old(self, days: int = 7):
"""Entfernt alte Signale basierend auf Datum"""
cutoff = datetime.now() - timedelta(days=days)
with self.lock:
self.buffer = deque(
[s for s in self.buffer if s['timestamp'] > cutoff],
maxlen=self.buffer.maxlen
)
Regelmäßige Cleanup im Hauptloop
async def scheduled_cleanup(buffer: SignalBuffer, interval_hours: int = 24):
while True:
await asyncio.sleep(interval_hours * 3600)
buffer.cleanup_old(days=7)
print(f"Cleanup abgeschlossen. Buffer-Größe: {len(buffer.buffer)}")
Skalierung für professionelle Nutzung
Für professionelle Trading-Operationen mit mehreren Strategien empfehle ich folgende Architektur-Erweiterungen:
#!/usr/bin/env python3
"""
Multi-Strategie Portfolio Manager
Skaliert auf 50+ Symbole mit automatischer Lastverteilung
"""
import asyncio
from dataclasses import dataclass, field
from typing import Dict, List, Optional
from enum import Enum
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class StrategyType(Enum):
TREND_FOLLOWING = "trend"
MEAN_REVERSION = "reversion"
BREAKOUT = "breakout"
SENTIMENT = "sentiment"
@dataclass
class Strategy:
name: str
type: StrategyType
symbols: List[str]
interval: str
min_confidence: float = 0.7
weight: float = 1.0
@dataclass
class Portfolio:
strategies: List[Strategy] = field(default_factory=list)
total_capital: float = 100000.0
def get_allocation(self, strategy: Strategy) -> float:
"""Berechnet Kapitalallokation für eine Strategie"""
total_weight = sum(s.weight for s in self.strategies)
return (strategy.weight / total_weight) * self.total_capital
class MultiStrategyManager:
"""Verwaltet mehrere Trading-Strategien parallel"""
def __init__(
self,
portfolio: Portfolio,
holy_sheep_client,
binance_collector
):
self.portfolio = portfolio
self.client = holy_sheep_client
self.collector = binance_collector
self.strategy_buffers: Dict[str, SignalBuffer] = {}
self.execution_queue = asyncio.Queue()
async def run_all_strategies(self):
"""Führt alle Strategien parallel aus"""
# Strategien gruppieren nach Intervall
by_interval: Dict[str, List[Strategy]] = {}
for strategy in self.portfolio.strategies:
key = strategy.interval
if key not in by_interval:
by_interval[key] = []
by_interval[key].append(strategy)
# Parallel execution
tasks = []
for interval, strategies in by_interval.items():
task = self._run_interval_strategies(interval, strategies)
tasks.append(task)
# Execution consumer
tasks.append(self._execution_consumer())
await asyncio.gather(*tasks)
async def _run_interval_strategies(
self,
interval: str,
strategies: List[Strategy]
):
"""Führt Strategien für ein Intervall aus"""
logger.info(f"Starte Strategien für Intervall {interval}")
# Sammle Symbole für dieses Intervall
all_symbols = set()
for strategy in strategies:
all_symbols.update(strategy.symbols)
# Initialisiere Buffer
for strategy in strategies:
self.strategy_buffers[strategy.name] = SignalBuffer()
async with aiohttp.ClientSession() as session:
# Lade historische Daten
historical = {}
for symbol in all_symbols:
klines = await self.collector.get_historical_klines(
symbol, interval, 500
)
historical[symbol] = klines
# Starte Echtzeit-Stream
async for kline in self.collector.kline_stream(
list(all_symbols), interval
):
if kline['is_closed']:
await self._process_kline(session, kline, strategies, historical)
async def _process_kline(
self,
session: aiohttp.ClientSession,
kline: Dict,
strategies: List[Strategy],
historical: Dict
):
"""Verarbeitet neue K-Line für alle relevanten Strategien"""