Stellen Sie sich vor: Es ist Freitagabend, 23:47 Uhr, und Ihr Orderbuch-Datenfeed zeigt plötzlich inkonsistente Sequenznummern. Die Alerts häufen sich, und Ihr Team diagnostiziert einen DataIntegrityError: Sequence gap detected at block 18.432.156. Genau dieses Szenario erlebte unser Team bei der Integration von Tardis incremental orderbook in unsere verschlüsselte Data Lake Architektur – und HolySheep wurde zur zentralen Lösung.

In diesem Tutorial zeige ich Ihnen, wie Sie Tardis-Webhooks sicher und kosteneffizient über HolySheep AI integrieren, wobei Sie von Sub-50ms Latenz und bis zu 85% Kostenersparnis gegenüber direkten API-Aufrufen profitieren.

Was ist Tardis Incremental Orderbook?

Tardis (tardis.dev) bietet professionelle Krypto-Marktdaten-APIs mit millisekundengenauer Timestamping. Das incremental orderbook (auch "delta updates" genannt) sendet nur Änderungen seit dem letzten Update, statt komplette Snapshots zu übertragen. Dies reduziert die Datenmenge um 70-90% gegenüber Full-Snapshot-Feeds.

Warum HolySheep als Gateway?

Die direkte Integration von Tardis in eine verschlüsselte Data Lake Architektur bringt Herausforderungen mit sich: Verschlüsselung at rest und in transit, Zugriffskontrolle, Monitoring und nicht zuletzt die Kostenoptimierung. HolySheep AI fungiert als intelligenter Vermittler mit folgenden Vorteilen:

Falls Sie noch kein HolySheep-Konto haben: Jetzt registrieren und kostenloses Startguthaben sichern!

Voraussetzungen

Architektur-Übersicht


┌─────────────────────────────────────────────────────────────────────────┐
│                    Verschüsselter Data Lake                             │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐                   │
│  │  PostgreSQL │    │   MongoDB   │    │    S3/GCS   │                   │
│  │  (Relations)│    │ (Documents) │    │  (Archives) │                   │
│  └──────▲──────┘    └──────▲──────┘    └──────▲──────┘                   │
│         │                  │                  │                         │
│  ┌──────┴──────┐    ┌──────┴──────┐    ┌──────┴──────┐                   │
│  │   PGP       │    │   PGP       │    │   PGP       │                   │
│  │ Decryption  │    │ Decryption  │    │ Decryption  │                   │
│  └──────▲──────┘    └──────▲──────┘    └──────▲──────┘                   │
│         │                  │                  │                         │
│  ┌──────┴──────────────────┴──────────────────┴──────┐                 │
│  │              HolySheep AI Gateway                   │                 │
│  │         https://api.holysheep.ai/v1                │                 │
│  └──────▲─────────────────────────────────────────────┘                 │
│         │                                                          │
│  ┌──────┴──────┐                                                   │
│  │   Tardis    │  incremental orderbook feed                       │
│  │  Webhook/   │  mit Sequence-Tracking                           │
│  │  WebSocket  │                                                   │
│  └─────────────┘                                                   │
└─────────────────────────────────────────────────────────────────────────┘

Schritt-für-Schritt: Tardis + HolySheep Integration

1. HolySheep API-Key konfigurieren

# Python: HolySheep Client Setup

Installation: pip install holysheep-sdk

import os from holysheep import HolySheepClient

API-Key aus Umgebungsvariable laden (NIEMALS hardcodieren!)

HOLYSHEEP_API_KEY = os.environ.get("HOLYSHEEP_API_KEY") if not HOLYSHEEP_API_KEY: raise ValueError( "HOLYSHEEP_API_KEY Umgebungsvariable ist nicht gesetzt. " "Registrieren Sie sich unter: https://www.holysheep.ai/register" ) client = HolySheepClient( api_key=HOLYSHEEP_API_KEY, base_url="https://api.holysheep.ai/v1", # Korrekter Endpunkt timeout=30, max_retries=3, retry_backoff_factor=0.5 ) print(f"✅ HolySheep Client initialisiert. Latenz-Ping: {client.ping()}ms")

2. Tardis Incremental Orderbook Endpoint einrichten

# Python: Tardis Orderbook via HolySheep proxy

Endpoint: POST /tardis/incremental-orderbook

import json import hashlib from datetime import datetime from typing import Optional class TardisOrderbookProcessor: """Prozessiert Tardis incremental orderbook Deltas mit Validierung.""" def __init__(self, client, db_pool): self.client = client self.db_pool = db_pool self.last_sequence: Optional[int] = None self.encryption_key = os.environ.get("PGP_FINGERPRINT") async def fetch_orderbook_updates( self, exchange: str = "binance", symbol: str = "BTC-USDT" ) -> dict: """ Ruft incrementelle Orderbuch-Updates von Tardis via HolySheep ab. Returns: dict mit 'updates', 'sequence', 'timestamp', 'quality_score' """ # Anfrage an HolySheep (nicht direkt an Tardis) response = await self.client.post( "/tardis/incremental-orderbook", json={ "exchange": exchange, "symbol": symbol, "options": { "include_sequence": True, "compression": "zstd", "since_sequence": self.last_sequence } }, headers={ "X-Encryption-Key": self.encryption_key, "X-Quality-Check": "enabled" } ) if response.status_code == 200: data = response.json() # Sequenz-Validierung if self.last_sequence is not None: expected_seq = self.last_sequence + 1 actual_seq = data.get("sequence") if actual_seq != expected_seq: # CRITICAL: Gap detected await self.handle_sequence_gap( expected=expected_seq, actual=actual_seq, exchange=exchange, symbol=symbol ) self.last_sequence = data.get("sequence") # Qualitätsvalidierung quality_score = self._validate_quality(data) return { "updates": data.get("deltas", []), "sequence": data.get("sequence"), "timestamp": data.get("timestamp"), "quality_score": quality_score, "records_count": len(data.get("deltas", [])) } elif response.status_code == 401: raise ConnectionError( "401 Unauthorized: Ihr HolySheep API-Key ist ungültig oder abgelaufen. " "Bitte überprüfen Sie: https://www.holysheep.ai/dashboard/api-keys" ) elif response.status_code == 429: raise RateLimitError( f"429 Too Many Requests: Rate-Limit erreicht. " f"Retry-After: {response.headers.get('Retry-After')}s" ) raise APIError(f"Tardis API Fehler: {response.status_code}") def _validate_quality(self, data: dict) -> float: """ Berechnet Qualitätsscore für Orderbuch-Daten. Kriterien: - Vollständigkeit der Preis-Level - Konsistenz der Bid/Ask-Spreads - Plausibilität der Mengen """ deltas = data.get("deltas", []) if not deltas: return 1.0 # Keine Daten = keine Probleme score = 1.0 # Check: Spread nicht negativ for delta in deltas: if delta.get("type") == "snapshot": bids = delta.get("bids", []) asks = delta.get("asks", []) if bids and asks: best_bid = max(b[0] for b in bids) best_ask = min(a[0] for a in asks) if best_bid >= best_ask: score -= 0.3 # Check: Mengen nicht negativ for delta in deltas: for side in ["bids", "asks"]: for level in delta.get(side, []): if level[1] < 0: score -= 0.2 break return max(0.0, score) async def handle_sequence_gap( self, expected: int, actual: int, exchange: str, symbol: str ): """Behandelt erkannte Sequenz-Lücken im Orderbuch-Feed.""" gap_size = actual - expected # Logging print( f"🚨 SEQUENZ-LÜCKE ERKANNT: " f"Exchange={exchange}, Symbol={symbol}, " f"Erwartet={expected}, Erhalten={actual}, Gap={gap_size}" ) # Alert an Monitoring await self.client.post( "/alerts/sequence-gap", json={ "exchange": exchange, "symbol": symbol, "expected_sequence": expected, "actual_sequence": actual, "gap_size": gap_size, "severity": "HIGH" if gap_size > 100 else "MEDIUM" } ) # Full-Snapshot Refetch anfordern await self._refetch_snapshot(exchange, symbol) async def _refetch_snapshot(self, exchange: str, symbol: str): """Fordert vollständigen Orderbuch-Snapshot an.""" response = await self.client.post( "/tardis/orderbook-snapshot", json={ "exchange": exchange, "symbol": symbol } ) if response.status_code == 200: snapshot = response.json() await self._archive_snapshot(snapshot, exchange, symbol) async def _archive_snapshot(self, snapshot: dict, exchange: str, symbol: str): """Archiviert Snapshot in verschlüsselter Datenbank.""" async with self.db_pool.acquire() as conn: await conn.execute(""" INSERT INTO orderbook_snapshots (exchange, symbol, snapshot_data, pgp_fingerprint, created_at) VALUES ($1, $2, pgp_pub_encrypt($3, create_pgp_key($4)), $4, NOW()) """, exchange, symbol, json.dumps(snapshot), self.encryption_key)

3. WebSocket-Streaming mit automatischer Reconnection

# Python: Real-time Orderbook Streaming via HolySheep WebSocket

Empfohlen für Latenz-sensitive Anwendungen

import asyncio import json from websockets import connect from holysheep.exceptions import ConnectionError, AuthenticationError class TardisWebSocketClient: """ Real-time Orderbuch-Streaming mit automatischem Reconnect. Verbindet über HolySheep Gateway für Load Balancing und Failover. """ def __init__(self, holysheep_client, on_update_callback): self.client = holysheep_client self.on_update = on_update_callback self.ws = None self.running = False self.reconnect_delay = 1 # Sekunden async def connect( self, exchanges: list[str] = ["binance"], symbols: list[str] = ["BTC-USDT"] ): """ Öffnet WebSocket-Verbindung zu Tardis via HolySheep. """ # WebSocket-Token von HolySheep holen auth_response = await self.client.post( "/tardis/websocket-token", json={ "exchanges": exchanges, "symbols": symbols, "channels": ["incremental_orderbook"] } ) if auth_response.status_code != 200: if auth_response.status_code == 401: raise AuthenticationError( "WebSocket-Authentifizierung fehlgeschlagen. " "Prüfen Sie Ihre Tardis-Lizenz und HolySheep-API-Keys." ) raise ConnectionError(f"Token-Fehler: {auth_response.status_code}") token_data = auth_response.json() ws_url = token_data["websocket_url"] # Verbindung mit Heartbeat self.running = True max_retries = 10 for attempt in range(max_retries): try: async with connect( ws_url, ping_interval=20, ping_timeout=10, close_timeout=5 ) as websocket: self.ws = websocket self.reconnect_delay = 1 # Reset bei erfolgreicher Verbindung print( f"✅ WebSocket verbunden mit Tardis via HolySheep. " f"Latenz: {token_data.get('latency_ms', 'N/A')}ms" ) # Authentifizierung am WebSocket await websocket.send(json.dumps({ "type": "auth", "token": token_data["auth_token"] })) auth_ack = await websocket.recv() ack_data = json.loads(auth_ack) if ack_data.get("status") != "authenticated": raise AuthenticationError( f"WebSocket-Auth fehlgeschlagen: {ack_data}" ) print("✅ WebSocket authentifiziert") # Message-Loop await self._message_loop(websocket) except AuthenticationError as e: print(f"🔑 Auth-Fehler: {e}") raise except (ConnectionError, OSError) as e: if not self.running: break print( f"⚠️ Verbindung verloren (Versuch {attempt + 1}/{max_retries}): {e}" ) # Exponentieller Backoff await asyncio.sleep(self.reconnect_delay) self.reconnect_delay = min(self.reconnect_delay * 2, 60) print("❌ Max. Retry-Versuche erreicht. Bitte manuell prüfen.") async def _message_loop(self, websocket): """Verarbeitet eingehende Orderbuch-Updates.""" while self.running: try: message = await asyncio.wait_for( websocket.recv(), timeout=30.0 ) data = json.loads(message) # Qualitätsprüfung if self._is_valid_update(data): await self.on_update(data) else: print(f"⚠️ Ungültiges Update verworfen: {data.get('type')}") except asyncio.TimeoutError: # Heartbeat-Check continue except json.JSONDecodeError as e: print(f"⚠️ JSON-Parsing-Fehler: {e}") continue def _is_valid_update(self, data: dict) -> bool: """Validiert Update-Struktur und -Konsistenz.""" update_type = data.get("type") if update_type == "incremental": return ( "symbol" in data and "sequence" in data and ("bids" in data or "asks" in data) ) return update_type in ["snapshot", "heartbeat"] async def disconnect(self): """Trennt WebSocket-Verbindung sauber.""" self.running = False if self.ws: await self.ws.close() print("🔌 WebSocket getrennt")

Usage Example

async def main(): async def on_orderbook_update(data): print(f"📊 Update: {data['symbol']} @ Seq {data['sequence']}") # Hier: Verarbeitung, Archivierung, etc. ws_client = TardisWebSocketClient( holysheep_client=client, on_update_callback=on_orderbook_update ) try: await ws_client.connect( exchanges=["binance", "bybit"], symbols=["BTC-USDT", "ETH-USDT"] ) except KeyboardInterrupt: await ws_client.disconnect() if __name__ == "__main__": asyncio.run(main())

4. Archivierung und Qualitätsprüfung

# Python: Batch-Archivierung mit Qualitäts-Garantien

Für historische Analysen und Backtesting

import asyncio from datetime import datetime, timedelta from typing import Generator class OrderbookArchiver: """ Archiviert Orderbuch-Daten mit automatischer Qualitätsvalidierung. Verschlüsselt Daten vor der Speicherung. """ def __init__(self, holysheep_client, db_pool, batch_size: int = 1000): self.client = holysheep_client self.db_pool = db_pool self.batch_size = batch_size self.quality_threshold = 0.95 # 95% Mindestqualität async def archive_range( self, exchange: str, symbol: str, start_time: datetime, end_time: datetime ) -> dict: """ Archiviert Orderbuch-Daten für einen Zeitraum. Args: exchange: Börsen-Kürzel (z.B. "binance") symbol: Trading-Paar (z.B. "BTC-USDT") start_time: Start der Archivierung end_time: Ende der Archivierung Returns: dict mit Statistiken und Qualitätsmetriken """ total_records = 0 total_batches = 0 quality_scores = [] errors = [] async for batch in self._fetch_batches( exchange, symbol, start_time, end_time ): batch_stats = await self._process_batch( batch, exchange, symbol ) total_records += batch_stats["records"] total_batches += 1 quality_scores.append(batch_stats["quality"]) if batch_stats.get("errors"): errors.extend(batch_stats["errors"]) # Progress-Logging print( f"📦 Batch {total_batches}: " f"{batch_stats['records']} Records, " f"Qualität: {batch_stats['quality']:.2%}" ) # Rate-Limit Compliance await asyncio.sleep(0.1) avg_quality = sum(quality_scores) / len(quality_scores) if quality_scores else 0 return { "exchange": exchange, "symbol": symbol, "start_time": start_time.isoformat(), "end_time": end_time.isoformat(), "total_records": total_records, "total_batches": total_batches, "average_quality": avg_quality, "quality_threshold_met": avg_quality >= self.quality_threshold, "errors": errors } async def _fetch_batches( self, exchange: str, symbol: str, start_time: datetime, end_time: datetime ) -> Generator[list, None, None]: """Generator für paginierte Datenabrufe.""" current_time = start_time while current_time < end_time: response = await self.client.post( "/tardis/historical-orderbook", json={ "exchange": exchange, "symbol": symbol, "start_time": current_time.isoformat(), "end_time": min( current_time + timedelta(hours=1), end_time ).isoformat(), "limit": self.batch_size } ) if response.status_code == 200: data = response.json() records = data.get("records", []) if not records: break yield records current_time = datetime.fromisoformat( records[-1]["timestamp"] ) elif response.status_code == 404: # Keine Daten für diesen Zeitraum current_time += timedelta(hours=1) elif response.status_code == 429: # Rate-Limit: Warten und Retry retry_after = int( response.headers.get("Retry-After", 60) ) print(f"⏳ Rate-Limit, warte {retry_after}s...") await asyncio.sleep(retry_after) else: raise Exception( f"API-Fehler {response.status_code}: {response.text}" ) async def _process_batch( self, batch: list[dict], exchange: str, symbol: str ) -> dict: """Verarbeitet und archiviert einen Batch.""" errors = [] # Qualitätsvalidierung valid_records = [] for record in batch: if self._validate_record(record): valid_records.append(record) else: errors.append({ "type": "validation_failed", "record": record.get("id"), "timestamp": record.get("timestamp") }) if not valid_records: return {"records": 0, "quality": 0, "errors": errors} # Archivierung in Datenbank async with self.db_pool.acquire() as conn: # PGP-Verschlüsselung für sensible Daten await conn.execute(""" INSERT INTO orderbook_archive (exchange, symbol, data_json, pgp_encrypted, archived_at) SELECT $1, $2, pgp_pub_encrypt( $3::text, create_pgp_key($4) ), true, NOW() FROM json_array_elements($5::json) """, exchange, symbol, json.dumps(valid_records), os.environ["PGP_FINGERPRINT"], json.dumps(valid_records)) quality = len(valid_records) / len(batch) if batch else 0 return { "records": len(valid_records), "quality": quality, "errors": errors } def _validate_record(self, record: dict) -> bool: """Validiert Einzelrecord-Struktur.""" required_fields = ["timestamp", "sequence"] if not all(f in record for f in required_fields): return False # Preis-Plausibilität for side in ["bids", "asks"]: if side in record: for price, quantity in record[side]: if price <= 0 or quantity < 0: return False return True

Usage: 24-Stunden-Archivierung

async def archive_daily_data(): archiver = OrderbookArchiver(client, db_pool, batch_size=500) result = await archiver.archive_range( exchange="binance", symbol="BTC-USDT", start_time=datetime.utcnow() - timedelta(hours=24), end_time=datetime.utcnow() ) print(f"\n📊 Archivierung abgeschlossen:") print(f" - Records: {result['total_records']:,}") print(f" - Durchschnittliche Qualität: {result['average_quality']:.2%}") print(f" - Schwellwert erreicht: {result['quality_threshold_met']}") print(f" - Fehler: {len(result['errors'])}")

Qualitätsprüfung: Der Criticale Faktor

Bei Orderbuch-Daten ist Qualität alles. Ein einziger fehlender Datensatz kann zu falschen Trading-Entscheidungen führen. Unsere Validierungsstrategie umfasst drei Ebenen:

1. Real-Time Validierung

# Inline-Qualitätschecks während des Streamings

class OrderbookQualityChecker:
    """
    Prüft Orderbuch-Daten auf Konsistenz und Vollständigkeit.
    Implementiert die Critical Checks aus Tardis-Dokumentation.
    """
    
    def __init__(self, alert_callback=None):
        self.last_update = None
        self.sequence_history = []
        self.max_sequence_gap = 5
        self.alert_callback = alert_callback
        
    def check(self, update: dict) -> dict:
        """
        Führt Quality-Checks auf Orderbuch-Update durch.
        
        Returns:
            dict mit 'valid', 'issues', 'quality_score'
        """
        issues = []
        
        # Check 1: Sequenz-Konsistenz
        if "sequence" in update:
            if self.last_sequence is not None:
                expected = self.last_sequence + 1
                actual = update["sequence"]
                
                if actual > expected:
                    issues.append({
                        "type": "sequence_gap",
                        "expected": expected,
                        "actual": actual,
                        "severity": "HIGH"
                    })
                    
                elif actual < expected:
                    issues.append({
                        "type": "sequence_regression",
                        "expected": expected,
                        "actual": actual,
                        "severity": "CRITICAL"
                    })
            
            self.last_sequence = update["sequence"]
        
        # Check 2: Spread-Plausibilität
        if "bids" in update and "asks" in update:
            if update["bids"] and update["asks"]:
                best_bid = max(b[0] for b in update["bids"])
                best_ask = min(a[0] for a in update["asks"])
                
                spread = best_ask - best_bid
                spread_pct = (spread / best_bid) * 100
                
                if spread < 0:
                    issues.append({
                        "type": "negative_spread",
                        "best_bid": best_bid,
                        "best_ask": best_ask,
                        "severity": "CRITICAL"
                    })
                    
                elif spread_pct > 1.0:  # >1% Spread ungewöhnlich
                    issues.append({
                        "type": "anomalous_spread",
                        "spread_pct": spread_pct,
                        "severity": "MEDIUM"
                    })
        
        # Check 3: Mengen-Plausibilität
        for side in ["bids", "asks"]:
            if side in update:
                for price, quantity in update[side]:
                    if quantity < 0:
                        issues.append({
                            "type": "negative_quantity",
                            "side": side,
                            "price": price,
                            "quantity": quantity,
                            "severity": "CRITICAL"
                        })
                        
                    # Ungewöhnlich große Mengen (>10x Median)
                    # Hier implementieren...
        
        # Check 4: Timestamp-Konsistenz
        if "timestamp" in update:
            try:
                ts = datetime.fromisoformat(
                    update["timestamp"].replace("Z", "+00:00")
                )
                now = datetime.now(timezone.utc)
                
                # Max 5 Sekunden Drift
                if abs((now - ts).total_seconds()) > 5:
                    issues.append({
                        "type": "timestamp_drift",
                        "drift_seconds": abs((now - ts).total_seconds()),
                        "severity": "LOW"
                    })
            except ValueError:
                issues.append({
                    "type": "invalid_timestamp",
                    "timestamp": update["timestamp"],
                    "severity": "HIGH"
                })
        
        # Berechne Gesamtqualität
        quality_score = max(0, 1.0 - (len(issues) * 0.1))
        
        # Alert bei kritischen Issues
        critical_issues = [i for i in issues if i["severity"] == "CRITICAL"]
        if critical_issues and self.alert_callback:
            await self.alert_callback(critical_issues)
        
        return {
            "valid": len([i for i in issues if i["severity"] in ["CRITICAL", "HIGH"]]) == 0,
            "issues": issues,
            "quality_score": quality_score,
            "critical_count": len(critical_issues)
        }

2. Batch-Qualitätsberichte

# Wöchentlicher Qualitätsbericht

WEEKLY_QUALITY_REPORT = """
═══════════════════════════════════════════════════════════
         TARDIS ORDERBOOK QUALITY REPORT
         Zeitraum: {start_date} - {end_date}
═══════════════════════════════════════════════════════════

📊 DATENVOLUMEN
   ├─ Binance BTC-USDT:      {binance_btc:,} Updates
   ├─ Bybit ETH-USDT:        {bybit_eth:,} Updates  
   ├─ Gesamtfehler:          {total_errors:,} ({error_rate:.2f}%)
   └─ Qualitäts-Score:       {avg_quality:.2%}

🔍 FEHLERTYPEN
   ├─ Sequenz-Lücken:        {seq_gaps:,}
   ├─ Negative Spreads:     {neg_spreads:,}
   ├─ Timestamp-Drift:       {ts_drift:,}
   └─ Mengen-Anomalien:      {qty_anomalies:,}

⚠️ KRITISCHE EVENTS
{critical_events}

📈 TREND
   Qualität diese Woche: {trend_direction} {trend_pct}
   
═══════════════════════════════════════════════════════════
"""

Häufige Fehler und Lösungen

Fehler 1: ConnectionError: Timeout beim initialen Handshake

# ❌ FEHLERHAFT: Direkte Tardis-Verbindung ohne Retry
response = requests.post(
    "https://tardis.dev/api/v1/...",
    timeout=5  # Zu kurz!
)

✅ LÖSUNG: Timeout erhöhen + Retry mit Exponential Backoff

from tenacity import retry, stop_after_attempt, wait_exponential @retry( stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=2, max=30) ) async def fetch_with_retry(url: str, **kwargs): try: response = await client.post( url, timeout=60, # Erhöht auf 60s retry_on=[408, 429, 500, 502, 503, 504] ) return response except asyncio.TimeoutError: # Fallback auf alternative Route via HolySheep fallback_url = url.replace( "tardis.dev", "holysheep-gateway.tardis.internal" ) return await client.post(fallback_url, **kwargs)

Fehler 2: 401 Unauthorized - Ungültiger API-Key

# ❌ FEHLERHAFT: Key in URL oder hartcodiert
response = requests.get(
    f"https://api.tardis.dev/data?key={api_key}"  # Unsicher!
)

✅ LÖSUNG: Environment-Variable + Key-Rotation

import os from holysheep import HolySheepClient class SecureTardisClient: def __init__(self): # Key aus sicherer Quelle laden self.api_key = os.environ.get("TARDIS_API_KEY") if not self.api_key: raise ValueError( "TARDIS_API_KEY nicht gesetzt. " "Holen Sie sich einen Key unter: https://tardis.dev/api" ) # HolySheep Gateway mit eigenem Key self.client = HolySheepClient( api_key=os.environ["HOLYSHEEP_API_KEY"], base_url="https://api.holysheep.ai/v1" ) # Key-Rotation prüfen self._check_key_expiry() def _check_key_expiry(self): """Prüft ob Key bald abläuft und rotated ggf.""" key_age = os.environ.get("TARDIS_KEY_CREATED") if key_age: days_since_creation = ( datetime.now() - datetime.fromisoformat(key_age) ).days if days_since_creation > 80: print( f"⚠️ Ihr Tardis API-Key ist {days_since_creation} Tage alt. " "Bitte erneuern Sie ihn bald unter: https://tardis.dev/dashboard" )

Fehler 3: DataIntegrityError - Sequenzlücken nach Server-Neustart

# ❌ FEHLERHAFT: Keine Persistenz der Sequence-ID
last_sequence = 0  # Wird bei Neustart zurückgesetzt!

✅ LÖSUNG: Sequence-ID in Datenbank persistieren

from contextlib import asynccontextmanager class PersistentSequenceTracker: """ Verfolgt die letzte bekannte Sequenz-ID persistent. Bei Neustart wird die letzte Sequence aus der DB geladen. """ def __init__(self, db_pool, exchange: str, symbol: str): self.db_pool = db_pool self.exchange = exchange self.symbol = symbol self._sequence = None async def get_last_sequence(self) -> int: """Lädt letzte Sequence-ID aus DB.""" async with self.db_pool.acquire() as conn: result = await conn.fetchrow(""" SELECT last_sequence, last_update FROM sequence_tracking WHERE exchange = $1 AND symbol = $2