Skip to content

DSTA Architecture Documentation

Table of Contents

  1. System Overview
  2. System Architecture
  3. Component Descriptions
  4. Data Flow Diagrams
  5. Deployment Architecture
  6. Technology Stack
  7. Design Patterns
  8. Scaling Considerations

System Overview

DSTA (Dr. Strange Trading Analysis) is an advanced, automated trading system designed for cryptocurrency markets. The system combines sophisticated technical analysis, backtesting capabilities, and live trading functionality to provide a comprehensive trading solution.

Key Capabilities

  • Multi-Exchange Support: Integration with Binance, Gate.io, and Huobi exchanges
  • Real-Time & Historical Data: WebSocket streaming and REST API data collection
  • Advanced Backtesting: Event-driven backtesting engine with Monte Carlo simulation
  • Strategy Development: Extensible strategy framework with built-in indicators (TA-Lib)
  • Risk Management: Position sizing, stop-loss, circuit breakers, and risk limits
  • Analytics & Reporting: Performance metrics, equity curves, trade analysis
  • Live Trading: Automated order execution with dry-run mode and reconciliation
  • API-First Design: Django REST Framework API for external integrations

Design Philosophy

  1. Event-Driven Architecture: Asynchronous processing of market events
  2. Separation of Concerns: Clean boundaries between data, strategy, and execution layers
  3. Testability: Comprehensive test coverage with isolated unit tests
  4. Scalability: Horizontal scaling via Celery workers and Redis caching
  5. Observability: Comprehensive logging, monitoring, and health checks

System Architecture

High-Level Architecture Diagram

graph TB
    subgraph "External Services"
        BINANCE[Binance API]
        GATEIO[Gate.io API]
        HUOBI[Huobi API]
    end

    subgraph "Data Ingestion Layer"
        REST[REST Client]
        WS[WebSocket Client]
    end

    subgraph "API Layer"
        API[Django REST API]
        HEALTH[Health Checks]
    end

    subgraph "Business Logic Layer"
        BT[Backtesting Engine]
        TRADE[Trading Bot]
        ANALYTICS[Analytics Module]
        STRAT[Strategy Framework]
    end

    subgraph "Task Queue"
        CELERY[Celery Workers]
        BEAT[Celery Beat Scheduler]
    end

    subgraph "Data Layer"
        PG[(PostgreSQL)]
        REDIS[(Redis Cache)]
    end

    subgraph "Monitoring"
        LOGS[Logging System]
        METRICS[Metrics/Alerts]
    end

    BINANCE --> REST
    BINANCE --> WS
    GATEIO --> REST
    HUOBI --> REST

    REST --> API
    WS --> API

    API --> CELERY
    API --> PG
    API --> REDIS

    CELERY --> BT
    CELERY --> TRADE
    CELERY --> ANALYTICS

    BT --> STRAT
    TRADE --> STRAT

    BT --> PG
    TRADE --> PG
    ANALYTICS --> PG

    TRADE --> REDIS
    BT --> REDIS

    BEAT --> CELERY

    API --> LOGS
    CELERY --> LOGS
    TRADE --> METRICS

Layer Responsibilities

Layer Responsibility Components
Presentation API endpoints, health checks Django REST Framework, Views, Serializers
Business Logic Trading strategies, backtesting, analytics Backtesting Engine, Trading Bot, Strategy Framework
Data Access Database operations, caching Django ORM, Redis Client
Integration Exchange APIs, WebSocket streams Binance Client, Gate.io Client, WebSocket Handlers
Infrastructure Task scheduling, message queuing Celery, Redis, PostgreSQL

Component Descriptions

1. API Layer (Django REST Framework)

Location: src/api/

The API layer provides RESTful endpoints for external access to DSTA functionality.

Key Modules

  • views.py: API endpoints for candlestick data, trading operations
  • serializers.py: Data validation and serialization
  • models.py: Database models (Candlestick, OrderBook, Trade data)
  • health.py: System health monitoring endpoints
  • urls.py: URL routing configuration

Responsibilities

  • Expose trading data and operations via REST API
  • Validate incoming requests
  • Handle authentication and authorization
  • Coordinate with business logic layer
  • Return formatted responses (JSON)

API Endpoints

/api/candlesticks/          # OHLCV data retrieval
/api/orderbook/             # Order book data
/api/backtest/              # Backtesting endpoints
/api/trading/               # Live trading operations
/health/                    # System health check

2. Data Collection Module

Location: src/api/exchanges/, src/api/websockets/

Handles real-time and historical data collection from multiple cryptocurrency exchanges.

Exchange Clients

binance_client.py - REST API integration for historical data - WebSocket streaming for real-time updates - Rate limiting and error handling - Order placement and management

base.py - Abstract base class for exchange clients - Common interface for all exchanges - Standardized data formats

WebSocket Handlers

src/api/websockets/ - Real-time market data streaming - Connection management and reconnection logic - Event broadcasting to subscribers

Data Quality Components

  • data_validation.py: Validates incoming market data
  • data_quality.py: Monitors data completeness and accuracy
  • data_gaps.py: Detects and fills missing data
  • data_loader.py: Bulk data loading utilities
  • data_export.py: Export data for analysis

3. Backtesting Engine

Location: src/backtesting/

Event-driven backtesting framework for strategy validation.

Core Components

backtest.py - Main backtesting engine - Event loop coordinator - Performance tracking

events.py - Event system (MarketEvent, SignalEvent, OrderEvent, FillEvent) - Event queue management

data_handler.py - Historical data provider - Bar generation for strategies

portfolio.py - Portfolio management - Position tracking - P&L calculation

execution.py - Simulated order execution - Fill modeling - Slippage and commission simulation

performance.py - Performance metrics calculation - Sharpe ratio, Sortino ratio, max drawdown - Win rate, profit factor

equity_curve.py - Equity curve generation - Visual representation of strategy performance

monte_carlo.py - Monte Carlo simulation for strategy robustness - Path randomization - Statistical analysis

Strategy Framework

strategy.py - Base strategy class - Signal generation interface

strategies/ - sma_crossover.py: Simple Moving Average crossover strategy - rsi_mean_reversion.py: RSI-based mean reversion strategy

indicators.py - Custom indicator implementations

talib_wrapper.py - TA-Lib integration wrapper

4. Trading Bot

Location: src/trading/

Live trading automation with risk management and monitoring.

Core Modules

executor.py - Order execution engine - Exchange API integration - Order lifecycle management

position.py - Position tracking - Entry/exit management

orders.py - Order creation and validation - Order type support (Market, Limit, Stop)

strategy_adapter.py - Adapts backtesting strategies for live trading - Real-time signal processing

Risk Management

risk_limits.py - Maximum position size limits - Daily loss limits - Exposure monitoring

position_sizing.py - Kelly Criterion - Fixed fractional sizing - Volatility-based sizing

stops.py - Stop-loss management - Trailing stops - Time-based exits

circuit_breaker.py - Trading halt conditions - Automatic shutdown on anomalies

Operational Features

dry_run.py - Paper trading mode - Testing without real funds

reconciliation.py - Trade reconciliation with exchange - Position verification

monitoring.py - Real-time performance monitoring - Alert generation

hot_reload.py - Live strategy updates without restart

multi_strategy.py - Multiple strategy coordination - Portfolio allocation

scheduler.py - Trading schedule management - Market hours awareness

alerts.py - Alert generation and distribution - Telegram/email notifications

5. Analytics Module

Location: src/analytics/

Advanced analytics and reporting capabilities.

Components

sharpe_calculator.py - Risk-adjusted return metrics - Sharpe and Sortino ratios

drawdown.py - Drawdown analysis - Maximum drawdown calculation - Recovery time analysis

correlation.py - Asset correlation analysis - Portfolio diversification metrics

sensitivity_analyzer.py - Parameter sensitivity analysis - Strategy optimization insights

transaction_cost_model.py - Realistic cost modeling - Slippage estimation - Fee calculations

capacity_screener.py - Strategy capacity analysis - Market impact estimation

reports/ - Automated report generation - Performance summaries

report_scheduler.py - Scheduled report generation - Email distribution

6. Database Layer (PostgreSQL)

Database: PostgreSQL 17

Schema Design

Candlesticks Table

CREATE TABLE candlesticks (
    id SERIAL PRIMARY KEY,
    exchange VARCHAR(20),
    symbol VARCHAR(20),
    interval VARCHAR(5),
    timestamp TIMESTAMP,
    open_price DECIMAL(20, 8),
    high_price DECIMAL(20, 8),
    low_price DECIMAL(20, 8),
    close_price DECIMAL(20, 8),
    volume DECIMAL(30, 8),
    quote_volume DECIMAL(30, 8),
    trades_count INTEGER,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

-- Composite index for time-series queries
CREATE INDEX idx_candlestick_query 
ON candlesticks(exchange, symbol, interval, timestamp DESC);

Data Models

  • Candlestick: OHLCV market data
  • OrderBook: Bid/ask depth data
  • Trade: Executed trade records
  • Strategy: Strategy configurations
  • Backtest: Backtesting results

Query Optimization

src/api/query_optimization.py - Optimized queries for time-series data - Aggregation queries - Index utilization

7. Cache Layer (Redis)

Cache: Redis 8

Use Cases

  1. Market Data Caching
  2. Recent candlestick data
  3. Order book snapshots
  4. Ticker information

  5. Session Management

  6. User sessions
  7. API tokens

  8. Rate Limiting

  9. API request throttling
  10. Exchange API rate limits

  11. Task Queue

  12. Celery broker
  13. Task result backend

  14. Real-Time Data

  15. WebSocket connection state
  16. Live trading signals

8. Message Queue (Celery)

Location: src/dsta/celery.py, src/api/tasks/

Asynchronous task processing with Celery.

Celery Configuration

CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

Task Categories

Data Collection Tasks - Historical data fetching - Real-time data processing - Data validation and cleanup

Analysis Tasks - Backtesting execution - Performance calculation - Report generation

Trading Tasks - Order placement - Position monitoring - Risk checks

Celery Beat Schedule

  • Data synchronization jobs
  • Report generation
  • Health checks
  • Database maintenance

Data Flow Diagrams

1. Historical Data Collection Flow

sequenceDiagram
    participant API as API Server
    participant Celery as Celery Worker
    participant Exchange as Exchange API
    participant DB as PostgreSQL
    participant Cache as Redis

    API->>Celery: Schedule data collection task
    Celery->>Exchange: Request historical candlesticks
    Exchange-->>Celery: Return OHLCV data
    Celery->>Celery: Validate data quality
    Celery->>DB: Bulk insert candlesticks
    Celery->>Cache: Update latest data cache
    Celery-->>API: Task complete

    Note over Celery,DB: Gap detection runs periodically
    Celery->>DB: Query for data gaps
    DB-->>Celery: Return gap ranges
    Celery->>Exchange: Fetch missing data
    Exchange-->>Celery: Return data
    Celery->>DB: Fill gaps

2. Real-Time WebSocket Data Flow

sequenceDiagram
    participant WS as WebSocket Client
    participant Exchange as Binance Stream
    participant Handler as Message Handler
    participant Cache as Redis
    participant DB as PostgreSQL
    participant Sub as Subscribers

    WS->>Exchange: Connect to candlestick stream
    Exchange-->>WS: Stream connection established

    loop Real-time updates
        Exchange->>WS: New candlestick event
        WS->>Handler: Process message
        Handler->>Handler: Validate & transform
        Handler->>Cache: Update real-time cache
        Handler->>DB: Persist candlestick
        Handler->>Sub: Broadcast to subscribers
    end

    alt Connection lost
        WS->>WS: Reconnection logic
        WS->>Exchange: Re-establish connection
    end

3. Backtesting Execution Flow

flowchart TD
    Start([Start Backtest]) --> LoadData[Load Historical Data]
    LoadData --> InitPortfolio[Initialize Portfolio]
    InitPortfolio --> EventLoop{Event Queue Empty?}

    EventLoop -->|No| GetEvent[Get Next Event]
    GetEvent --> EventType{Event Type?}

    EventType -->|Market| UpdateBars[Update Price Bars]
    EventType -->|Signal| GenOrder[Generate Order]
    EventType -->|Order| ExecOrder[Execute Order]
    EventType -->|Fill| UpdatePortfolio[Update Portfolio]

    UpdateBars --> StratCalc[Strategy Calculate Signals]
    StratCalc --> EventLoop

    GenOrder --> EventLoop
    ExecOrder --> FillSim[Simulate Fill]
    FillSim --> EventLoop

    UpdatePortfolio --> UpdatePos[Update Positions]
    UpdatePos --> CalcPnL[Calculate P&L]
    CalcPnL --> EventLoop

    EventLoop -->|Yes| CalcMetrics[Calculate Performance Metrics]
    CalcMetrics --> GenReport[Generate Report]
    GenReport --> SaveResults[Save Results to DB]
    SaveResults --> End([End Backtest])

    style Start fill:#90EE90
    style End fill:#FFB6C1
    style EventLoop fill:#87CEEB

4. Live Trading Flow

sequenceDiagram
    participant Scheduler as Trading Scheduler
    participant Strategy as Strategy Engine
    participant Risk as Risk Manager
    participant Executor as Order Executor
    participant Exchange as Exchange API
    participant Monitor as Monitoring System
    participant DB as PostgreSQL

    Scheduler->>Strategy: Trigger strategy evaluation
    Strategy->>Strategy: Fetch latest market data
    Strategy->>Strategy: Calculate indicators
    Strategy->>Strategy: Generate signals

    alt Signal Generated
        Strategy->>Risk: Validate signal
        Risk->>Risk: Check position limits
        Risk->>Risk: Calculate position size
        Risk->>Risk: Verify risk thresholds

        alt Risk Check Passed
            Risk->>Executor: Send order request

            alt Dry Run Mode
                Executor->>DB: Log simulated order
                Executor-->>Monitor: Alert (dry run)
            else Live Mode
                Executor->>Exchange: Place order
                Exchange-->>Executor: Order confirmation
                Executor->>DB: Record trade
                Executor->>Monitor: Alert (live trade)
            end
        else Risk Check Failed
            Risk->>Monitor: Alert (risk limit exceeded)
            Risk->>DB: Log rejected signal
        end
    end

    Monitor->>Monitor: Update performance metrics
    Monitor->>DB: Save monitoring data

    loop Position Monitoring
        Executor->>Exchange: Query open positions
        Exchange-->>Executor: Position data
        Executor->>Risk: Verify positions
        Risk->>Executor: Check stop-loss conditions

        alt Stop-Loss Triggered
            Executor->>Exchange: Close position
            Exchange-->>Executor: Fill confirmation
            Executor->>DB: Record exit trade
        end
    end

5. Data Pipeline Architecture

graph LR
    subgraph "Data Sources"
        E1[Binance]
        E2[Gate.io]
        E3[Huobi]
    end

    subgraph "Ingestion"
        REST[REST Collectors]
        WS[WebSocket Streams]
    end

    subgraph "Processing"
        Valid[Validation]
        Trans[Transformation]
        Gap[Gap Detection]
    end

    subgraph "Storage"
        PG[(PostgreSQL)]
        Redis[(Redis Cache)]
    end

    subgraph "Consumption"
        BT[Backtesting]
        Trade[Live Trading]
        Analytics[Analytics]
        API[REST API]
    end

    E1 --> REST
    E1 --> WS
    E2 --> REST
    E3 --> REST

    REST --> Valid
    WS --> Valid

    Valid --> Trans
    Trans --> Gap

    Gap --> PG
    Gap --> Redis

    PG --> BT
    PG --> Trade
    PG --> Analytics
    Redis --> Trade
    Redis --> API

    style Valid fill:#FFE4B5
    style Trans fill:#FFE4B5
    style Gap fill:#FFE4B5

Deployment Architecture

Docker Compose Services

graph TB
    subgraph "Docker Compose Stack"
        subgraph "Application Services"
            API[api-server:8000]
            BotL[bot-listener]
            BotN[bot-notifier]
            Sync[dsta-sync-login]
            Sched[dsta-sync-schedule]
        end

        subgraph "Infrastructure Services"
            PG[postgres:5432]
            Redis[redis:6379]
        end

        API --> PG
        API --> Redis
        BotL --> API
        BotN --> API
        Sync --> PG
        Sync --> Redis
        Sched --> PG
        Sched --> Redis
    end

    subgraph "External Access"
        Client[Client Applications]
    end

    Client -->|HTTP/REST| API

    style API fill:#4CAF50
    style PG fill:#336791
    style Redis fill:#DC382D

Service Specifications

API Server (api-server)

Image: dsta-django
Ports: 8000:8000
Command: uvicorn dsta.asgi:application
Dependencies: postgres, redis
Health Check: curl http://localhost:8000/health

PostgreSQL (postgres)

Image: postgres:17
Ports: 6789:5432
Volumes:
  - ./data/postgresql/data:/var/lib/postgresql/data
  - ./data/postgresql/logs:/var/log/postgresql

Redis (redis)

Image: redis:8
Ports: 6379:6379
Volumes:
  - ./data/redis:/data

Deployment Profiles

Profile Services Use Case
minimal api-server, postgres, redis Development/testing
dev minimal + bot-listener, bot-notifier, sync-schedule Full development
full All services including management tasks Production
testing minimal profile Automated testing

Container Orchestration

# Base Django image
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY src/ .
CMD ["uvicorn", "dsta.asgi:application", "--host", "0.0.0.0"]

Volume Management

  • PostgreSQL Data: Persistent storage for database
  • Redis Data: AOF/RDB persistence
  • Application Logs: Centralized logging directory
  • Historical Data: Raw data archives

Network Architecture

graph LR
    subgraph "External Network"
        Internet[Internet]
    end

    subgraph "Docker Bridge Network"
        API[API Server]
        PG[PostgreSQL]
        Redis[Redis]
        Workers[Celery Workers]
    end

    Internet -->|Port 8000| API
    API <--> PG
    API <--> Redis
    Workers <--> PG
    Workers <--> Redis

    style API fill:#4CAF50
    style Internet fill:#FFA500

Technology Stack

Backend Framework

Technology Version Purpose
Python 3.12 Core programming language
Django 4.0 Web framework
Django REST Framework 3.13.1 REST API framework
Uvicorn Latest ASGI server

Data Processing

Technology Version Purpose
NumPy 1.21.4 Numerical computing
Pandas 1.3.5 Data manipulation
TA-Lib 0.4.32 Technical analysis indicators
SciPy Latest Scientific computing

Databases & Caching

Technology Version Purpose
PostgreSQL 17 Primary database
Redis 8 Caching and message broker
psycopg2 2.9.2 PostgreSQL adapter

Task Queue

Technology Version Purpose
Celery 5.2.1 Distributed task queue
Celery Beat (included) Periodic task scheduler
Kombu 5.2.2 Messaging library

Exchange Integration

Technology Version Purpose
python-binance 1.0.15 Binance API client
gate-api 4.23.0 Gate.io API client
aiohttp 3.8.1 Async HTTP client
websockets 9.1 WebSocket client

Data Visualization

Technology Version Purpose
Matplotlib 3.5.1 Plotting library
Jupyter 1.0.0 Interactive notebooks

Development Tools

Technology Version Purpose
Black Latest Code formatter
isort Latest Import sorting
mypy Latest Static type checking
pytest Latest Testing framework
flake8 Latest Linting
bandit Latest Security analysis

Containerization

Technology Version Purpose
Docker Latest Container runtime
Docker Compose Latest Multi-container orchestration

API & Documentation

Technology Version Purpose
OpenAPI 3.0 API specification
django-cors-headers 3.10.1 CORS handling

Design Patterns

1. Event-Driven Architecture

The backtesting engine uses an event-driven pattern to simulate market conditions:

# Event types
class Event:
    """Base event class"""
    pass

class MarketEvent(Event):
    """Triggered when new market data arrives"""
    pass

class SignalEvent(Event):
    """Triggered when strategy generates a signal"""
    pass

class OrderEvent(Event):
    """Triggered when an order is placed"""
    pass

class FillEvent(Event):
    """Triggered when an order is filled"""
    pass

Benefits: - Decoupled components - Easy to extend with new event types - Realistic simulation of live trading - Better testability

2. Strategy Pattern

Strategies are implemented using the Strategy pattern for flexibility:

class Strategy(ABC):
    """Abstract base class for trading strategies"""

    @abstractmethod
    def calculate_signals(self, event):
        """Generate trading signals"""
        pass

class SMACrossover(Strategy):
    """Moving average crossover strategy"""

    def calculate_signals(self, event):
        # Implementation
        pass

Benefits: - Easy to add new strategies - Strategies are interchangeable - Consistent interface - Simplified testing

3. Repository Pattern

Data access is abstracted through Django ORM models:

class CandlestickRepository:
    """Repository for candlestick data"""

    @staticmethod
    def get_historical_data(symbol, start, end):
        return Candlestick.objects.filter(
            symbol=symbol,
            timestamp__gte=start,
            timestamp__lte=end
        ).order_by('timestamp')

Benefits: - Database abstraction - Easier to switch databases - Centralized query logic - Better testability with mocks

4. Factory Pattern

Exchange clients use factory pattern for creation:

class ExchangeFactory:
    """Factory for creating exchange clients"""

    @staticmethod
    def create_exchange(exchange_name):
        if exchange_name == 'binance':
            return BinanceClient()
        elif exchange_name == 'gateio':
            return GateioClient()
        else:
            raise ValueError(f"Unknown exchange: {exchange_name}")

Benefits: - Centralized object creation - Easy to add new exchanges - Configuration management - Dependency injection

5. Observer Pattern

WebSocket handlers use observer pattern for event broadcasting:

class WebSocketHandler:
    """Manages WebSocket connections and broadcasts events"""

    def __init__(self):
        self.subscribers = []

    def subscribe(self, callback):
        self.subscribers.append(callback)

    def notify(self, data):
        for callback in self.subscribers:
            callback(data)

Benefits: - One-to-many dependency - Loose coupling - Dynamic subscription - Event broadcasting

6. Singleton Pattern

Configuration and connection managers use singleton:

class RedisConnection:
    """Singleton Redis connection manager"""

    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.client = redis.Redis(...)
        return cls._instance

Benefits: - Single connection pool - Resource management - Global access point - Thread-safe operations

7. Decorator Pattern

Risk checks and logging use decorators:

def risk_check(func):
    """Decorator to enforce risk limits before execution"""
    def wrapper(*args, **kwargs):
        if not check_risk_limits():
            raise RiskLimitExceeded()
        return func(*args, **kwargs)
    return wrapper

@risk_check
def place_order(order):
    # Place order logic
    pass

Benefits: - Cross-cutting concerns - Code reusability - Separation of concerns - Easy to add/remove

8. Command Pattern

Order execution uses command pattern:

class OrderCommand:
    """Encapsulates order execution"""

    def __init__(self, order, executor):
        self.order = order
        self.executor = executor

    def execute(self):
        return self.executor.execute(self.order)

    def undo(self):
        return self.executor.cancel(self.order)

Benefits: - Undo/redo operations - Order queuing - Logging and auditing - Command history


Scaling Considerations

Horizontal Scaling

1. API Server Scaling

graph TB
    LB[Load Balancer]
    API1[API Server 1]
    API2[API Server 2]
    API3[API Server 3]
    PG[(PostgreSQL)]
    Redis[(Redis)]

    LB --> API1
    LB --> API2
    LB --> API3

    API1 --> PG
    API2 --> PG
    API3 --> PG

    API1 --> Redis
    API2 --> Redis
    API3 --> Redis

Strategy: - Deploy multiple API server instances - Use nginx or HAProxy for load balancing - Share PostgreSQL and Redis instances - Stateless API design enables easy scaling

2. Celery Worker Scaling

# Scale workers based on task load
celery -A dsta worker -Q data_collection --concurrency=4
celery -A dsta worker -Q backtesting --concurrency=2
celery -A dsta worker -Q trading --concurrency=1

Strategy: - Dedicated worker pools for different task types - Scale workers independently - Queue-based task distribution - Auto-scaling based on queue length

Vertical Scaling

Database Optimization

PostgreSQL Tuning:

-- Increase shared buffers for caching
shared_buffers = 4GB

-- Optimize for time-series queries
effective_cache_size = 12GB
work_mem = 64MB

-- Enable parallel query execution
max_parallel_workers_per_gather = 4

Indexing Strategy:

-- Composite index for frequent queries
CREATE INDEX idx_candlestick_lookup 
ON candlesticks(exchange, symbol, interval, timestamp DESC);

-- Partial index for recent data
CREATE INDEX idx_recent_data 
ON candlesticks(timestamp DESC) 
WHERE timestamp > NOW() - INTERVAL '7 days';

Redis Optimization

# Increase max memory
maxmemory 8gb

# Eviction policy for cache
maxmemory-policy allkeys-lru

# Enable persistence
appendonly yes
appendfsync everysec

Data Partitioning

Time-Series Partitioning

-- Partition candlesticks by month
CREATE TABLE candlesticks_2024_01 PARTITION OF candlesticks
FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');

CREATE TABLE candlesticks_2024_02 PARTITION OF candlesticks
FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');

Benefits: - Faster queries on recent data - Easy archival of old data - Improved maintenance operations - Better performance at scale

Caching Strategy

Multi-Level Caching

# Level 1: Application memory cache
recent_prices = {}

# Level 2: Redis cache
def get_latest_price(symbol):
    # Try memory cache
    if symbol in recent_prices:
        return recent_prices[symbol]

    # Try Redis cache
    price = redis_client.get(f"price:{symbol}")
    if price:
        recent_prices[symbol] = price
        return price

    # Query database
    price = db.query(symbol)
    redis_client.setex(f"price:{symbol}", 60, price)
    recent_prices[symbol] = price
    return price

Performance Monitoring

Metrics to Track

# Application metrics
- Request throughput (req/sec)
- Response latency (p50, p95, p99)
- Error rate (%)
- Active connections

# Database metrics
- Query execution time
- Connection pool utilization
- Disk I/O
- Cache hit ratio

# Trading metrics
- Order execution latency
- Strategy calculation time
- Data processing rate
- Backtest throughput

Load Distribution

Task Queue Prioritization

# High priority: Trading operations
CELERY_ROUTES = {
    'trading.tasks.*': {'queue': 'trading', 'priority': 10},
    'backtesting.tasks.*': {'queue': 'backtesting', 'priority': 5},
    'data.tasks.*': {'queue': 'data_collection', 'priority': 7},
}

Database Connection Pooling

# Django database pool settings
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'CONN_MAX_AGE': 600,  # Connection persistence
        'OPTIONS': {
            'connect_timeout': 10,
            'options': '-c statement_timeout=30000',
        },
    }
}

# Celery database pool
DATABASE_POOL_SIZE = 20

Rate Limiting

Exchange API Rate Limiting

from functools import wraps
import time

class RateLimiter:
    """Token bucket rate limiter"""

    def __init__(self, max_calls, time_window):
        self.max_calls = max_calls
        self.time_window = time_window
        self.calls = []

    def __call__(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            now = time.time()
            self.calls = [c for c in self.calls if c > now - self.time_window]

            if len(self.calls) >= self.max_calls:
                sleep_time = self.calls[0] + self.time_window - now
                time.sleep(sleep_time)

            self.calls.append(now)
            return func(*args, **kwargs)
        return wrapper

# Apply to Binance API calls (1200 req/min)
@RateLimiter(max_calls=1200, time_window=60)
def fetch_binance_data():
    pass

Fault Tolerance

Circuit Breaker Pattern

class CircuitBreaker:
    """Circuit breaker for external services"""

    CLOSED = 'closed'  # Normal operation
    OPEN = 'open'      # Failure mode
    HALF_OPEN = 'half_open'  # Testing recovery

    def __init__(self, failure_threshold=5, timeout=60):
        self.state = self.CLOSED
        self.failure_count = 0
        self.failure_threshold = failure_threshold
        self.timeout = timeout
        self.last_failure_time = None

Disaster Recovery

Backup Strategy

  • Database: Daily full backup + continuous WAL archiving
  • Redis: AOF persistence + RDB snapshots
  • Application: Git version control + Docker images
  • Data: S3/object storage for historical data

Recovery Procedures

  1. Database corruption: Restore from latest backup + replay WAL
  2. Redis failure: Restart with AOF/RDB recovery
  3. Application failure: Redeploy from Docker registry
  4. Data gaps: Automated gap detection and filling

Conclusion

The DSTA architecture is designed for reliability, scalability, and maintainability. Key architectural decisions include:

Event-driven design for realistic backtesting and live trading
Microservices approach with Docker containers
Separation of concerns across layers
Comprehensive monitoring and observability
Horizontal and vertical scaling capabilities
Robust error handling and fault tolerance
Extensible strategy framework for rapid development

This architecture supports the core mission of DSTA: building an advanced automated trading system that can compete in cryptocurrency markets using cutting-edge technologies and techniques.


Appendix

Version History

Version Date Changes
1.0 2024 Initial architecture documentation

Contact & Support

For questions about the architecture or system design, please refer to the project documentation or open an issue on GitHub.


Last Updated: 2024