289 lines
6.7 KiB
Markdown
289 lines
6.7 KiB
Markdown
|
|
# Database Schema
|
||
|
|
|
||
|
|
This document describes the database schema for Crypto Trader.
|
||
|
|
|
||
|
|
## Database Options
|
||
|
|
|
||
|
|
- **SQLite**: Default, bundled, zero configuration
|
||
|
|
- **PostgreSQL**: Optional, for advanced users with large datasets
|
||
|
|
|
||
|
|
## Core Tables
|
||
|
|
|
||
|
|
### Exchanges
|
||
|
|
|
||
|
|
Stores exchange configuration and credentials.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE exchanges (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
name TEXT UNIQUE NOT NULL,
|
||
|
|
api_key TEXT, -- Encrypted
|
||
|
|
secret_key TEXT, -- Encrypted
|
||
|
|
password TEXT, -- Encrypted (for some exchanges)
|
||
|
|
api_permissions TEXT DEFAULT 'read_only',
|
||
|
|
is_enabled BOOLEAN DEFAULT TRUE,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Strategies
|
||
|
|
|
||
|
|
Stores trading strategy configuration.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE strategies (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
name TEXT UNIQUE NOT NULL,
|
||
|
|
description TEXT,
|
||
|
|
strategy_type TEXT NOT NULL,
|
||
|
|
parameters TEXT, -- JSON
|
||
|
|
is_enabled BOOLEAN DEFAULT FALSE,
|
||
|
|
is_paper_trading BOOLEAN DEFAULT TRUE,
|
||
|
|
exchange_id INTEGER REFERENCES exchanges(id),
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Trades
|
||
|
|
|
||
|
|
Stores executed trades.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE trades (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
order_id TEXT UNIQUE NOT NULL,
|
||
|
|
symbol TEXT NOT NULL,
|
||
|
|
side TEXT NOT NULL, -- 'buy' or 'sell'
|
||
|
|
type TEXT NOT NULL, -- 'market', 'limit', etc.
|
||
|
|
price REAL,
|
||
|
|
amount REAL,
|
||
|
|
cost REAL,
|
||
|
|
fee REAL DEFAULT 0.0,
|
||
|
|
status TEXT DEFAULT 'open',
|
||
|
|
is_paper_trade BOOLEAN DEFAULT TRUE,
|
||
|
|
executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
exchange_id INTEGER REFERENCES exchanges(id),
|
||
|
|
strategy_id INTEGER REFERENCES strategies(id)
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Positions
|
||
|
|
|
||
|
|
Stores open and closed positions.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE positions (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
symbol TEXT NOT NULL,
|
||
|
|
exchange_id INTEGER REFERENCES exchanges(id),
|
||
|
|
quantity REAL NOT NULL,
|
||
|
|
entry_price REAL NOT NULL,
|
||
|
|
current_price REAL,
|
||
|
|
unrealized_pnl REAL,
|
||
|
|
realized_pnl REAL,
|
||
|
|
is_open BOOLEAN DEFAULT TRUE,
|
||
|
|
position_type TEXT DEFAULT 'spot', -- 'spot', 'futures', 'margin'
|
||
|
|
leverage REAL DEFAULT 1.0,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP,
|
||
|
|
UNIQUE(symbol, exchange_id, position_type)
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Orders
|
||
|
|
|
||
|
|
Stores order history and status.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE orders (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
exchange_order_id TEXT UNIQUE NOT NULL,
|
||
|
|
client_order_id TEXT,
|
||
|
|
symbol TEXT NOT NULL,
|
||
|
|
side TEXT NOT NULL,
|
||
|
|
type TEXT NOT NULL,
|
||
|
|
price REAL,
|
||
|
|
amount REAL,
|
||
|
|
filled_amount REAL DEFAULT 0.0,
|
||
|
|
remaining_amount REAL DEFAULT 0.0,
|
||
|
|
cost REAL DEFAULT 0.0,
|
||
|
|
status TEXT DEFAULT 'pending',
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP,
|
||
|
|
exchange_id INTEGER REFERENCES exchanges(id),
|
||
|
|
strategy_id INTEGER REFERENCES strategies(id),
|
||
|
|
is_paper_trade BOOLEAN DEFAULT TRUE
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Market Data
|
||
|
|
|
||
|
|
Stores historical OHLCV data.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE market_data (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
symbol TEXT NOT NULL,
|
||
|
|
timeframe TEXT NOT NULL,
|
||
|
|
timestamp TIMESTAMP NOT NULL,
|
||
|
|
open REAL NOT NULL,
|
||
|
|
high REAL NOT NULL,
|
||
|
|
low REAL NOT NULL,
|
||
|
|
close REAL NOT NULL,
|
||
|
|
volume REAL NOT NULL,
|
||
|
|
exchange_id INTEGER REFERENCES exchanges(id),
|
||
|
|
UNIQUE(symbol, timeframe, timestamp)
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Portfolio Snapshots
|
||
|
|
|
||
|
|
Stores portfolio snapshots over time.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE portfolio_snapshots (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
total_value REAL NOT NULL,
|
||
|
|
cash_balance REAL NOT NULL,
|
||
|
|
asset_holdings TEXT, -- JSON
|
||
|
|
exchange_id INTEGER REFERENCES exchanges(id)
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Backtest Results
|
||
|
|
|
||
|
|
Stores backtesting results.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE backtest_results (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
strategy_id INTEGER REFERENCES strategies(id),
|
||
|
|
start_date TIMESTAMP NOT NULL,
|
||
|
|
end_date TIMESTAMP NOT NULL,
|
||
|
|
initial_capital REAL NOT NULL,
|
||
|
|
final_capital REAL NOT NULL,
|
||
|
|
total_return REAL NOT NULL,
|
||
|
|
sharpe_ratio REAL,
|
||
|
|
sortino_ratio REAL,
|
||
|
|
max_drawdown REAL,
|
||
|
|
win_rate REAL,
|
||
|
|
other_metrics TEXT, -- JSON
|
||
|
|
run_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Risk Limits
|
||
|
|
|
||
|
|
Stores risk management limits.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE risk_limits (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
strategy_id INTEGER REFERENCES strategies(id),
|
||
|
|
exchange_id INTEGER REFERENCES exchanges(id),
|
||
|
|
limit_type TEXT NOT NULL,
|
||
|
|
value REAL NOT NULL,
|
||
|
|
is_active BOOLEAN DEFAULT TRUE,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Alerts
|
||
|
|
|
||
|
|
Stores alert configurations.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE alerts (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
name TEXT NOT NULL,
|
||
|
|
alert_type TEXT NOT NULL,
|
||
|
|
condition TEXT NOT NULL,
|
||
|
|
is_active BOOLEAN DEFAULT TRUE,
|
||
|
|
triggered_at TIMESTAMP,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Rebalancing Events
|
||
|
|
|
||
|
|
Stores portfolio rebalancing history.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE rebalancing_events (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
exchange_id INTEGER REFERENCES exchanges(id),
|
||
|
|
old_allocations TEXT, -- JSON
|
||
|
|
new_allocations TEXT, -- JSON
|
||
|
|
executed_trades TEXT, -- JSON
|
||
|
|
status TEXT DEFAULT 'completed'
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### App State
|
||
|
|
|
||
|
|
Stores application state for recovery.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE app_state (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
key TEXT UNIQUE NOT NULL,
|
||
|
|
value TEXT, -- JSON
|
||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Audit Log
|
||
|
|
|
||
|
|
Stores security audit events.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
CREATE TABLE audit_log (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
event_type TEXT NOT NULL,
|
||
|
|
user_id TEXT,
|
||
|
|
details TEXT -- JSON
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
## Indexes
|
||
|
|
|
||
|
|
Key indexes for performance:
|
||
|
|
|
||
|
|
- `market_data(symbol, timeframe, timestamp)` - Unique index
|
||
|
|
- `trades(symbol, executed_at)` - For trade queries
|
||
|
|
- `positions(symbol, exchange_id, is_open)` - For position lookups
|
||
|
|
- `orders(status, created_at)` - For order management
|
||
|
|
- `strategies(is_enabled)` - For active strategy queries
|
||
|
|
|
||
|
|
## Relationships
|
||
|
|
|
||
|
|
- **Exchanges** → **Strategies** (one-to-many)
|
||
|
|
- **Exchanges** → **Trades** (one-to-many)
|
||
|
|
- **Strategies** → **Trades** (one-to-many)
|
||
|
|
- **Strategies** → **Backtest Results** (one-to-many)
|
||
|
|
- **Exchanges** → **Positions** (one-to-many)
|
||
|
|
- **Exchanges** → **Market Data** (one-to-many)
|
||
|
|
|
||
|
|
## Data Retention
|
||
|
|
|
||
|
|
Configurable retention policies:
|
||
|
|
|
||
|
|
- **Market Data**: Configurable (default: 1 year)
|
||
|
|
- **Trades**: Permanent
|
||
|
|
- **Orders**: Permanent
|
||
|
|
- **Portfolio Snapshots**: Configurable (default: 1 year)
|
||
|
|
- **Logs**: Configurable (default: 30 days)
|
||
|
|
|
||
|
|
## Backup and Recovery
|
||
|
|
|
||
|
|
- **Automatic Backups**: Before critical operations
|
||
|
|
- **Manual Backups**: Via export functionality
|
||
|
|
- **Recovery**: From backup files or database dumps
|
||
|
|
|