DSTA Architecture Documentation¶
Table of Contents¶
- System Overview
- System Architecture
- Component Descriptions
- Data Flow Diagrams
- Deployment Architecture
- Technology Stack
- Design Patterns
- 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¶
- Event-Driven Architecture: Asynchronous processing of market events
- Separation of Concerns: Clean boundaries between data, strategy, and execution layers
- Testability: Comprehensive test coverage with isolated unit tests
- Scalability: Horizontal scaling via Celery workers and Redis caching
- 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 operationsserializers.py: Data validation and serializationmodels.py: Database models (Candlestick, OrderBook, Trade data)health.py: System health monitoring endpointsurls.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 datadata_quality.py: Monitors data completeness and accuracydata_gaps.py: Detects and fills missing datadata_loader.py: Bulk data loading utilitiesdata_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¶
- Market Data Caching
- Recent candlestick data
- Order book snapshots
-
Ticker information
-
Session Management
- User sessions
-
API tokens
-
Rate Limiting
- API request throttling
-
Exchange API rate limits
-
Task Queue
- Celery broker
-
Task result backend
-
Real-Time Data
- WebSocket connection state
- 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)¶
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¶
- Database corruption: Restore from latest backup + replay WAL
- Redis failure: Restart with AOF/RDB recovery
- Application failure: Redeploy from Docker registry
- 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¶
Related Documentation¶
- README.md - Project overview and getting started
- CONTRIBUTING.md - Contribution guidelines
- API Documentation - OpenAPI specification
- Deployment Guide - Production deployment instructions
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