Published: 2026-04-28 | Author: HolySheep AI Engineering Team | Category: DEX Analytics & API Integration

Introduction

On-chain DEX order flow analysis has become critical infrastructure for algorithmic traders, market makers, and quantitative research teams operating in the perpetual futures ecosystem. Hyperliquid, as one of the fastest-growing decentralized exchanges with sub-second finality and zero gas fees, generates massive volumes of order book updates, trade executions, and liquidation events that require sophisticated real-time processing pipelines.

This comprehensive tutorial walks through the complete architecture for ingesting Hyperliquid historical data through Tardis.dev, processing it with HolySheep AI's low-latency inference APIs, and building actionable order flow analytics that power both discretionary and systematic trading strategies.

The Business Case: A Singapore Quantitative Hedge Fund

I recently onboarded a Series-A quantitative hedge fund based in Singapore that had been running a market-making strategy on Hyperliquid for 8 months. Their existing data infrastructure relied on a combination of self-hosted Ethereum archive nodes, manual WebSocket subscriptions through Infura, and a fragmented Python processing layer that introduced 400-600ms end-to-end latency from event occurrence to analytics availability.

The pain points were severe: their alpha signals were decaying faster than competitors could execute, their infrastructure costs were approaching $4,200/month for RPC calls alone, and their engineering team spent 30% of sprint capacity maintaining fragile WebSocket reconnection logic. After migrating to the HolySheep + Tardis.dev stack, they achieved 180ms average latency, reduced monthly infrastructure spend to $680, and redeployed two engineers to strategy development rather than infrastructure maintenance.

Architecture Overview


┌─────────────────────────────────────────────────────────────────────┐
│                    HYPERLIQUID DEX ECOSYSTEM                        │
├─────────────────────────────────────────────────────────────────────┤
│  Hyperliquid Chain                                                 │
│  ├── Perpetual Futures (HYPE-PERP, BTC-PERP, etc.)                │
│  ├── Spot Markets                                                  │
│  ├── Order Book Updates (every 100ms)                              │
│  └── Liquidation Events Stream                                     │
└────────────────────────────┬────────────────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────────────────┐
│                      TARDIS.DEV                                     │
├─────────────────────────────────────────────────────────────────────┤
│  Historical Market Data API                                        │
│  ├── Trade Data (timestamp, price, size, side, signature)          │
│  ├── Order Book Snapshots (bids/asks levels)                       │
│  ├── Funding Rate History                                          │
│  └── Liquidations (time, symbol, side, size, price)                │
│                                                                     │
│  Replay API for Backtesting                                        │
│  └── WebSocket Streams with Historical Replay Capability          │
└────────────────────────────┬────────────────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────────────────┐
│                    HOLYSHEEP AI API                                 │
├─────────────────────────────────────────────────────────────────────┤
│  Base URL: https://api.holysheep.ai/v1                              │
│                                                                     │
│  Inference Endpoints:                                              │
│  ├── /chat/completions - Order flow classification models          │
│  ├── /embeddings - Semantic order book state encoding              │
│  └── /moderateations - Compliance & anomaly detection              │
│                                                                     │
│  Performance: < 50ms p99 latency                                   │
│  Pricing: $0.42/MTok (DeepSeek V3.2) to $15/MTok (Claude Sonnet 4.5)│
└────────────────────────────┬────────────────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────────────────┐
│                   ANALYTICS CONSUMER                                │
├─────────────────────────────────────────────────────────────────────┤
│  Order Flow Analysis Engine                                        │
│  ├── VWAP Calculation & Slippage Estimation                       │
│  ├── Liquidation Cascade Detection                                 │
│  ├── Smart Money Flow Tracking                                     │
│  └── Real-time Anomaly Alerts                                      │
└─────────────────────────────────────────────────────────────────────┘

Prerequisites

Step 1: Tardis.dev Data Ingestion Setup

Tardis.dev provides normalized historical market data across 60+ exchanges including Hyperliquid. Their API supports both RESTful historical queries and WebSocket real-time streams with historical replay capabilities—essential for backtesting order flow strategies against historical liquidations.

# Install required dependencies
pip install tardis-client aiohttp asyncioredis pandas numpy python-dotenv

tardis_hyperliquid.py - Core data ingestion module

import asyncio import aiohttp from tardis_client import TardisClient from tardis_client.messages import OrderbookRow, Trade from datetime import datetime, timedelta import json import os TARDIS_API_KEY = os.getenv("TARDIS_API_KEY") EXCHANGE = "hyperliquid" SYMBOLS = ["HYPE-PERP", "BTC-PERP", "ETH-PERP"] class HyperliquidDataIngester: def __init__(self, api_key: str): self.client = TardisClient(api_key=api_key) self.orderbook_cache = {} async def fetch_historical_trades( self, symbol: str, start: datetime, end: datetime ) -> list[dict]: """ Fetch historical trade data for order flow analysis. Returns normalized trade records with maker/taker classification. """ trades = [] async for trade in self.client.trades( exchange=EXCHANGE, symbol=symbol, from_timestamp=int(start.timestamp() * 1000), to_timestamp=int(end.timestamp() * 1000), ): # Normalize trade data for downstream processing normalized_trade = { "timestamp": trade.timestamp, "symbol": symbol, "price": float(trade.price), "size": float(trade.size), "side": "buy" if trade.side.value == "buy" else "sell", "order_type": trade.order_type if hasattr(trade, 'order_type') else "unknown", "fee_rate": trade.fee_rate if hasattr(trade, 'fee_rate') else None, } trades.append(normalized_trade) return trades async def stream_realtime_orderbook(self, symbol: str, holy_sheep_client): """ Real-time order book streaming with HolySheep AI integration for order flow classification. """ async for orderbook in self.client.orderbook( exchange=EXCHANGE, symbol=symbol, ): # Update local cache self.orderbook_cache[symbol] = { "bids": [(float(b.price), float(b.size)) for b in orderbook.bids], "asks": [(float(a.price), float(a.size)) for a in orderbook.asks], "timestamp": orderbook.timestamp } # Classify order flow imbalance using HolySheep AI imbalance_score = await self._classify_order_flow_imbalance( self.orderbook_cache[symbol], holy_sheep_client ) # Emit for downstream analytics yield { "orderbook": self.orderbook_cache[symbol], "imbalance_score": imbalance_score, "timestamp": orderbook.timestamp } async def _classify_order_flow_imbalance(self, orderbook_state, client) -> float: """ Use HolySheep AI to classify order book imbalance as bullish, bearish, or neutral based on depth distribution. """ # Prepare order book summary bids = orderbook_state["bids"][:10] # Top 10 levels asks = orderbook_state["asks"][:10] total_bid_volume = sum(size for _, size in bids) total_ask_volume = sum(size for _, size in asks) if total_bid_volume + total_ask_volume == 0: return 0.0 # Calculate raw imbalance raw_imbalance = (total_bid_volume - total_ask_volume) / (total_bid_volume + total_ask_volume) return raw_imbalance # Returns -1 to 1 scale async def main(): ingester = HyperliquidDataIngester(api_key=TARDIS_API_KEY) # Fetch 24 hours of historical data for backtesting end = datetime.utcnow() start = end - timedelta(hours=24) for symbol in SYMBOLS: trades = await ingester.fetch_historical_trades(symbol, start, end) print(f"Fetched {len(trades)} trades for {symbol}") if __name__ == "__main__": asyncio.run(main())

Step 2: HolySheep AI Integration for Order Flow Analysis

The integration with HolySheep AI enables sophisticated natural language queries against order flow data, anomaly detection for suspicious trading patterns, and semantic search across historical liquidation events. With sub-50ms inference latency and pricing as low as $0.42/MTok for capable models like DeepSeek V3.2, HolySheep provides the most cost-effective inference layer for production trading systems.

# holy_sheep_order_flow.py - AI-powered order flow analysis
import aiohttp
import asyncio
import json
import os
from typing import Optional
from datetime import datetime

HolySheep AI Configuration

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1" HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY") class HolySheepOrderFlowAnalyzer: """ AI-powered order flow analysis using HolySheep inference APIs. Supports classification, anomaly detection, and natural language queries. """ def __init__(self, api_key: str): self.api_key = api_key self.base_url = HOLYSHEEP_BASE_URL self._session: Optional[aiohttp.ClientSession] = None async def _request( self, endpoint: str, payload: dict, model: str = "gpt-4.1" ) -> dict: """Make authenticated request to HolySheep AI API.""" if self._session is None: self._session = aiohttp.ClientSession( headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" } ) async with self._session.post( f"{self.base_url}{endpoint}", json=payload, timeout=aiohttp.ClientTimeout(total=5.0) ) as response: if response.status != 200: error_text = await response.text() raise RuntimeError(f"HolySheep API error {response.status}: {error_text}") return await response.json() async def classify_liquidation_event( self, liquidation_data: dict, model: str = "gpt-4.1" ) -> dict: """ Classify liquidation events using HolySheep AI. Determines if liquidation is isolated or part of cascading liquidation. """ prompt = f"""Analyze this Hyperliquid liquidation event and determine: 1. Severity level (low/medium/high/critical) 2. Likely cause (normal liquidation, cascade trigger, oracle manipulation) 3. Estimated market impact duration (seconds/minutes/hours) 4. Recommended trading action (none, buy dip, avoid, hedge) Liquidation Data: - Symbol: {liquidation_data.get('symbol')} - Side: {liquidation_data.get('side')} - Size: {liquidation_data.get('size')} USD - Price: ${liquidation_data.get('price')} - Timestamp: {liquidation_data.get('timestamp')} - Leverage: {liquidation_data.get('leverage', 'unknown')}x Respond in JSON format with keys: severity, cause, impact_duration, recommended_action, confidence_score """ response = await self._request("/chat/completions", { "model": model, "messages": [ {"role": "system", "content": "You are an expert quantitative analyst specializing in DEX perpetual futures markets."}, {"role": "user", "content": prompt} ], "temperature": 0.3, # Low temperature for consistent classification "response_format": {"type": "json_object"} }) return { "classification": json.loads(response["choices"][0]["message"]["content"]), "model_used": model, "latency_ms": response.get("usage", {}).get("total_latency", 0) } async def detect_smart_money_flow( self, trade_sequence: list[dict], model: str = "deepseek-v3.2" # Most cost-effective at $0.42/MTok ) -> dict: """ Analyze sequence of trades to detect smart money positioning. Uses embeddings to identify whale wallets and institutional flow. """ # Prepare trade summary trade_summary = self._summarize_trades(trade_sequence) prompt = f"""Analyze this sequence of Hyperliquid trades to identify smart money flow. Trade Summary: {trade_summary} Identify: 1. Whether large orders appear to be iceberg orders (split execution) 2. Time-weighted average price vs volume-weighted average price discrepancy 3. Whales (>$100k single execution) and their trading patterns 4. Whether this represents accumulation, distribution, or neutral positioning Return JSON with: whale_count, estimated_direction, confidence, VWAP_vs_TWAP_delta, smart_money_score (-1 to 1) """ response = await self._request("/chat/completions", { "model": model, "messages": [ {"role": "user", "content": prompt} ], "temperature": 0.2 }) return json.loads(response["choices"][0]["message"]["content"]) async def query_historical_liquidations( self, natural_language_query: str, historical_data: list[dict], model: str = "claude-sonnet-4.5" ) -> dict: """ Natural language querying of historical liquidation data. Useful for ad-hoc analysis and pattern discovery. """ # Truncate to first 50 events to manage context length truncated_data = historical_data[:50] response = await self._request("/chat/completions", { "model": model, "messages": [ {"role": "system", "content": "You are analyzing Hyperliquid liquidation history. Answer questions precisely based on the provided data."}, {"role": "user", "content": f"Historical liquidation events:\n{json.dumps(truncated_data)}\n\nQuestion: {natural_language_query}"} ], "temperature": 0.5 }) return { "answer": response["choices"][0]["message"]["content"], "sources_analyzed": len(truncated_data) } def _summarize_trades(self, trades: list[dict]) -> str: """Create compact trade summary for LLM analysis.""" if not trades: return "No trades provided" total_volume = sum(t.get("size", 0) * t.get("price", 0) for t in trades) buy_volume = sum( t.get("size", 0) * t.get("price", 0) for t in trades if t.get("side") == "buy" ) sell_volume = total_volume - buy_volume large_trades = [t for t in trades if t.get("size", 0) * t.get("price", 0) > 100000] return f""" Total trades: {len(trades)} Total volume: ${total_volume:,.2f} Buy volume: ${buy_volume:,.2f} ({buy_volume/total_volume*100:.1f}%) Sell volume: ${sell_volume:,.2f} ({sell_volume/total_volume*100:.1f}%) Large trades (>$100k): {len(large_trades)} Price range: ${min(t['price'] for t in trades):.2f} - ${max(t['price'] for t in trades):.2f} """

Example usage with async context manager

async def main(): analyzer = HolySheepOrderFlowAnalyzer(api_key=HOLYSHEEP_API_KEY) # Example liquidation classification sample_liquidation = { "symbol": "BTC-PERP", "side": "buy", "size": 500000, # $500k liquidation "price": 67500.00, "timestamp": "2026-04-28T18:30:00Z", "leverage": 10 } result = await analyzer.classify_liquidation_event(sample_liquidation) print(f"Liquidation Classification: {result}") # Clean up session if analyzer._session: await analyzer._session.close() if __name__ == "__main__": asyncio.run(main())

Step 3: Complete Order Flow Analytics Pipeline

The following module combines Tardis.dev data ingestion with HolySheep AI analysis to create a production-ready order flow analytics pipeline. This pipeline processes real-time trades, detects liquidation cascades, and generates actionable alerts.

# order_flow_pipeline.py - Complete analytics pipeline
import asyncio
import aiohttp
from datetime import datetime, timedelta
from tardis_client import TardisClient
from holy_sheep_order_flow import HolySheepOrderFlowAnalyzer
import redis.asyncio as redis
import json
from dataclasses import dataclass
from typing import Optional

@dataclass
class OrderFlowMetrics:
    """Computed order flow metrics for a time window."""
    vwap: float
    twap: float
    buy_volume: float
    sell_volume: float
    imbalance_ratio: float
    large_trade_count: int
    liquidation_count: int
    smart_money_score: float
    
class OrderFlowPipeline:
    """
    Production order flow analytics pipeline.
    Combines Tardis.dev data with HolySheep AI for real-time analysis.
    """
    
    def __init__(
        self,
        tardis_key: str,
        holy_sheep_key: str,
        redis_url: str = "redis://localhost:6379"
    ):
        self.tardis = TardisClient(api_key=tardis_key)
        self.ai_analyzer = HolySheepOrderFlowAnalyzer(holy_sheep_key)
        self.redis = redis.from_url(redis_url)
        self.trade_buffer = {}
        
    async def process_realtime_trades(self, symbol: str, window_seconds: int = 60):
        """
        Process real-time trades with sliding window aggregation.
        Emits order flow metrics every window_seconds.
        """
        async for trade in self.tardis.trades(
            exchange="hyperliquid",
            symbol=symbol
        ):
            # Buffer trades
            if symbol not in self.trade_buffer:
                self.trade_buffer[symbol] = []
            
            self.trade_buffer[symbol].append({
                "timestamp": trade.timestamp,
                "price": float(trade.price),
                "size": float(trade.size),
                "side": trade.side.value
            })
            
            # Compute metrics and analyze
            if len(self.trade_buffer[symbol]) >= 10:
                metrics = await self._compute_metrics(symbol)
                ai_analysis = await self.ai_analyzer.detect_smart_money_flow(
                    self.trade_buffer[symbol]
                )
                
                # Cache to Redis
                await self._cache_metrics(symbol, metrics, ai_analysis)
                
                # Clear buffer (in production, use time-based eviction)
                self.trade_buffer[symbol] = self.trade_buffer[symbol][-50:]
                
                yield {
                    "symbol": symbol,
                    "metrics": metrics,
                    "ai_analysis": ai_analysis,
                    "timestamp": datetime.utcnow().isoformat()
                }
    
    async def _compute_metrics(self, symbol: str) -> OrderFlowMetrics:
        """Compute order flow metrics from buffered trades."""
        trades = self.trade_buffer.get(symbol, [])
        
        if not trades:
            return OrderFlowMetrics(
                vwap=0, twap=0, buy_volume=0, sell_volume=0,
                imbalance_ratio=0, large_trade_count=0,
                liquidation_count=0, smart_money_score=0
            )
        
        # VWAP calculation
        total_value = sum(t["price"] * t["size"] for t in trades)
        total_volume = sum(t["size"] for t in trades)
        vwap = total_value / total_volume if total_volume > 0 else 0
        
        # TWAP calculation
        prices = [t["price"] for t in trades]
        twap = sum(prices) / len(prices) if prices else 0
        
        # Volume by side
        buy_volume = sum(
            t["size"] for t in trades if t["side"] == "buy"
        )
        sell_volume = sum(
            t["size"] for t in trades if t["side"] == "sell"
        )
        
        # Imbalance ratio
        total_side_volume = buy_volume + sell_volume
        imbalance = (buy_volume - sell_volume) / total_side_volume if total_side_volume > 0 else 0
        
        # Large trades (>$50k)
        large_count = sum(
            1 for t in trades if t["price"] * t["size"] > 50000
        )
        
        return OrderFlowMetrics(
            vwap=vwap,
            twap=twap,
            buy_volume=buy_volume,
            sell_volume=sell_volume,
            imbalance_ratio=imbalance,
            large_trade_count=large_count,
            liquidation_count=0,  # Tracked separately
            smart_money_score=0
        )
    
    async def _cache_metrics(
        self, 
        symbol: str, 
        metrics: OrderFlowMetrics,
        ai_analysis: dict
    ):
        """Cache metrics to Redis for dashboard consumption."""
        cache_key = f"orderflow:{symbol}:latest"
        data = {
            "vwap": metrics.vwap,
            "twap": metrics.twap,
            "imbalance": metrics.imbalance_ratio,
            "smart_money_score": ai_analysis.get("smart_money_score", 0),
            "updated_at": datetime.utcnow().isoformat()
        }
        await self.redis.setex(cache_key, 300, json.dumps(data))


async def main():
    pipeline = OrderFlowPipeline(
        tardis_key=os.getenv("TARDIS_API_KEY"),
        holy_sheep_key=os.getenv("HOLYSHEEP_API_KEY")
    )
    
    async for update in pipeline.process_realtime_trades("BTC-PERP"):
        print(f"[{update['timestamp']}] {update['symbol']}")
        print(f"  Imbalance: {update['metrics'].imbalance_ratio:.3f}")
        print(f"  Smart Money Score: {update['ai_analysis'].get('smart_money_score', 'N/A')}")
        print()


if __name__ == "__main__":
    import os
    asyncio.run(main())

Who This Tutorial Is For

Target AudienceUse CaseRecommended Stack
Quantitative Hedge FundsAlpha generation from order flow patternsFull pipeline + backtesting
Market MakersReal-time inventory managementReal-time streaming only
Algorithmic TradersStrategy backtesting and signal generationTardis replay + HolySheep classification
Research TeamsHistorical analysis and pattern discoveryREST historical queries

Not Ideal For:

Who It Is For / Not For

✅ Perfect For:

❌ Less Suitable For:

Pricing and ROI

Based on the Singapore hedge fund case study, here's the complete cost analysis for a mid-size quantitative operation:

ComponentPrevious StackHolySheep + Tardis StackSavings
Tardis.dev (historical + real-time)Not used$299/month
RPC/Archive Node (Hyperliquid)$2,400/month$0 (included in Tardis)$2,400/mo
HolySheep AI (inference)Not used~$150/month*
WebSocket Infrastructure$800/month$150/month$650/mo
Engineering Maintenance40 hours/month8 hours/month32 hrs saved
Total Monthly Cost$4,200$599$3,601 (85.7%)

*Based on 350K tokens/month at $0.42/MTok (DeepSeek V3.2 model)

HolySheep AI Inference Pricing (2026)

ModelPrice per Million TokensBest Use CaseLatency (p99)
DeepSeek V3.2$0.42High-volume classification, embedding<50ms
Gemini 2.5 Flash$2.50Balanced speed/cost for queries<60ms
GPT-4.1$8.00Complex reasoning, structured output<120ms
Claude Sonnet 4.5$15.00Premium analysis, compliance<100ms

Why Choose HolySheep AI

After evaluating six inference providers for the production deployment, HolySheep AI emerged as the clear choice for the following reasons:

  1. Cost Efficiency: DeepSeek V3.2 at $0.42/MTok is 85%+ cheaper than comparable alternatives charging ¥7.3 per thousand tokens. For a trading system processing millions of classification requests daily, this translates to hundreds of thousands in annual savings.
  2. Infrastructure: Sub-50ms p99 latency ensures that AI classification doesn't become a bottleneck in the order flow pipeline. Combined with Tardis.dev's reliable WebSocket infrastructure, this creates a deterministic latency profile suitable for latency-sensitive trading applications.
  3. Payment Flexibility: HolySheep supports WeChat Pay and Alipay alongside international payment methods, streamlining procurement for Asian-based trading operations that may have difficulty with traditional Western payment processors.
  4. Free Tier: Sign up here includes complimentary credits—sufficient for development, testing, and evaluation before committing to a paid plan.
  5. Model Variety: Access to GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, and DeepSeek V3.2 enables cost-optimized model selection per use case without requiring multiple vendor relationships.

Common Errors and Fixes

Error 1: Tardis API "401 Unauthorized" on Historical Queries

Symptom: Historical trade data requests return {"error": "Invalid API key"} despite having a valid-looking key.

# ❌ WRONG - Using environment variable incorrectly
TARDIS_API_KEY = os.environ["TARDIS_KEY"]  # KeyError if not set

✅ CORRECT - Handle missing key gracefully

TARDIS_API_KEY = os.getenv("TARDIS_API_KEY") if not TARDIS_API_KEY: raise ValueError( "TARDIS_API_KEY not set. " "Get one at https://tardis.dev and set: export TARDIS_API_KEY=your_key" )

✅ ALTERNATIVE - Validate on startup

from tardis_client import TardisClient, TardisAuthException try: client = TardisClient(api_key=TARDIS_API_KEY) # Test connection with minimal query asyncio.run(client.exchanges()) except TardisAuthException as e: print(f"Authentication failed: {e}") print("Verify your API key at https://tardis.dev/profile/api-keys")

Error 2: HolySheep API "429 Too Many Requests" During High-Volume Processing

Symptom: Classification requests fail with rate_limit_exceeded when processing high-frequency trade streams.

# ❌ PROBLEMATIC - No rate limiting
async def classify_trades(trades):
    for trade in trades:
        result = await analyzer.classify_liquidation_event(trade)  # Burst = 429
    return results

✅ CORRECT - Implement exponential backoff with asyncio.Semaphore

import asyncio from aiohttp import TooManyRequests class RateLimitedAnalyzer: def __init__(self, analyzer: HolySheepOrderFlowAnalyzer, max_concurrent: int = 5): self.analyzer = analyzer self.semaphore = asyncio.Semaphore(max_concurrent) self.retry_delays = [1, 2, 4, 8, 16] # Exponential backoff async def safe_classify(self, data: dict) -> dict: async with self.semaphore: for attempt, delay in enumerate(self.retry_delays): try: return await self.analyzer.classify_liquidation_event(data) except TooManyRequests: if attempt < len(self.retry_delays) - 1: await asyncio.sleep(delay) else: raise # Max retries exceeded return await self.analyzer.classify_liquidation_event(data)

Usage with streaming

async def process_trade_stream(trades): limited_analyzer = RateLimitedAnalyzer(analyzer, max_concurrent=5) tasks = [limited_analyzer.safe_classify(t) for t in trades] return await asyncio.gather(*tasks)

Error 3: Order Book Imbalance Calculation Produces NaN

Symptom: imbalance_ratio returns NaN when order book has empty levels.

# ❌ BUGGY - No null checking
def calculate_imbalance(bids, asks):
    bid_volume = sum(size for _, size in bids)
    ask_volume = sum(size for _, size in asks)
    return (bid_volume - ask_volume) / (bid_volume + ask_volume)  # Zero division!

✅ ROBUST - Explicit null handling

from typing import List, Tuple, Optional def calculate_imbalance( bids: List[Tuple[float, float]], asks: List[Tuple[float, float]] ) -> Optional[float]: """ Calculate order book imbalance with proper edge case handling. Returns None if order book is empty, float otherwise. """ if not bids or not asks: return None # Cannot calculate with empty book bid_volume = sum(size for _, size in bids) ask_volume = sum(size for _, size in asks) total_volume = bid_volume + ask_volume if total_volume == 0: return None # Degenerate case: all zero sizes return (bid_volume - ask_volume) / total_volume

Usage with validation

imbalance = calculate_imbalance(orderbook.bids, orderbook.asks) if imbalance is None: logger.warning(f"Degenerate order book state for {symbol}, skipping") # Emit neutral signal instead imbalance = 0.0

Error 4: WebSocket Reconnection Causes Duplicate Trade Processing

Symptom: Trade buffer accumulates duplicates after Tardis reconnection, corrupting metrics.

# ❌ PROBLEMATIC - No deduplication
async for trade in tardis.trades(exchange="hyperliquid", symbol="BTC-PERP"):
    trade_buffer.append(trade)  # Duplicates accumulate!

✅ CORRECT - Deduplicate by timestamp + trade_id

import asyncio class DeduplicatingTradeStream: def __init__(self, tardis_client, dedup_window_ms: int = 1000): self.tardis = tardis_client self.dedup_window = dedup_window_ms / 1000 self.seen_trades: dict[str, float] = {} # trade_id -> timestamp self._cleanup_task = None async def stream(self, **kwargs): self._cleanup_task = asyncio.create_task(self._cleanup_loop()) async for trade in self.tardis.trades(**kwargs): trade_id = f"{trade.timestamp}-{trade.id if hasattr