Files
GifariKemal e8355b3f62 feat: add 5 dashboard features — dark mode, trade history, backtests, model insights, alerts
- Dark mode: class-based theme toggle with localStorage persistence and flash prevention
- Trade History (/trades): paginated table, stats cards, equity curve chart with DB API endpoints
- Backtest Viewer (/backtests): log parser for 35 backtest results, sidebar + detail + comparison tabs
- Model Insights: dashboard card + dialog showing feature importance, regime distribution, training history
- Alert/Signal Log (/alerts): signal stats, filterable table with execution tracking
- API: 8 new endpoints with psycopg2 DB connection pool
- Dark mode sweep across books page, about dialog, and all dashboard components
- Architecture docs rewritten with Mermaid diagrams (23 docs)
- README and FEATURES.md rewritten bilingual (Indonesian + English)
- main_live.py: write model_metrics.json on startup and retrain

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 05:46:54 +07:00

177 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Risk Engine — Mesin Risiko & Circuit Breaker
> **File:** `src/risk_engine.py`
> **Class:** `RiskEngine`
> **Digunakan oleh:** `main_live.py`
---
## Apa Itu Risk Engine?
Risk Engine adalah **lapisan proteksi fundamental** yang menghitung ukuran posisi, memvalidasi order, dan mengaktifkan circuit breaker saat batas risiko terlampaui.
**Analogi:** Risk Engine seperti **sistem rem ABS di mobil** — menghitung kecepatan aman, memvalidasi manuver, dan menghentikan paksa jika ada bahaya.
---
## 4 Fungsi Utama
### 1. Position Sizing (Kelly Criterion)
```
Risk-Constrained Half-Kelly:
1. Hitung Kelly fraction:
f* = (p × b - q) / b
dimana:
p = win rate (misal 0.55)
q = 1 - p (0.45)
b = avg win/loss ratio (misal 2.0)
2. Cap Kelly: max 25%
3. Half-Kelly: f* × 0.5 (safety)
4. Apply regime multiplier (0.5x - 1.0x)
5. Cap di config limit: max risk_per_trade%
6. Hitung lot:
risk_amount = balance × actual_risk%
lot = risk_amount / (SL_pips × pip_value)
7. Round ke lot_step, clamp ke min/max
```
**Contoh:**
```
Balance: $5,000
Win rate: 55%
Win/Loss ratio: 2.0
Kelly: (0.55 × 2.0 - 0.45) / 2.0 = 0.325 (32.5%)
Half-Kelly: 16.25%
Cap: min(16.25%, 1.0%) = 1.0%
Risk amount: $50
SL distance: 50 pips ($5 per pip per 0.01 lot)
Lot: $50 / (50 × $1) = 0.01 lot (menambahkan regime multiplier)
```
### 2. Risk Check (Real-time)
```python
check_risk(balance, equity, open_positions, current_price)
|
v
Hitung daily P/L: equity - starting_balance
|
v
Cek circuit breaker aktif? can_trade = False
|
v
Daily loss >= max_daily_loss%? CIRCUIT BREAKER
|
v
Posisi >= max_positions? can_trade = False
|
v
Return RiskMetrics(daily_pnl, drawdown, can_trade, reason)
```
### 3. Order Validation
```python
validate_order(type, entry, sl, tp, lot, price, balance)
|
├── Circuit breaker aktif? REJECT
├── BUY: SL >= entry? REJECT ("SL harus di bawah entry")
├── BUY: TP <= entry? REJECT ("TP harus di atas entry")
├── Lot < minimum? REJECT
├── Lot > maximum? REJECT
├── Entry terlalu jauh dari current price (>0.1%)? REJECT
├── Risk% > 1.5× config limit? REJECT
└── Semua OK APPROVED
```
### 4. Circuit Breaker
```
TRIGGER:
Daily loss >= max_daily_loss% (3% untuk $5K account)
EFEK:
→ can_trade = False
→ Semua entry baru DITOLAK
→ TIDAK menutup posisi yang ada
RESET:
→ Otomatis pada hari baru
→ Manual via reset_circuit_breaker()
```
---
## Daily Stats Tracking
```python
# Auto-initialize setiap hari baru
_daily_stats[today] = {
"starting_balance": equity, # Basis untuk % hitung
"trades": 0, # Total trade hari ini
"wins": 0, # Trade profit
"losses": 0, # Trade loss
}
```
---
## Return Types
### RiskMetrics
```python
@dataclass
class RiskMetrics:
daily_pnl: float # P/L hari ini ($)
daily_pnl_percent: float # P/L hari ini (%)
open_exposure: float # Total exposure ($)
max_drawdown: float # Drawdown dari peak (%)
position_count: int # Jumlah posisi terbuka
can_trade: bool # Boleh buka posisi baru?
reason: str # Alasan
```
### PositionSizeResult
```python
@dataclass
class PositionSizeResult:
lot_size: float # Ukuran lot yang dihitung
risk_amount: float # Risk dalam USD
risk_percent: float # Risk dalam %
stop_distance: float # Jarak SL (harga)
take_profit_distance: float # Jarak TP (harga)
approved: bool # Disetujui?
rejection_reason: str # Alasan penolakan
```
---
## Hubungan dengan Smart Risk Manager
```
RiskEngine (modul ini)
├── Kelly Criterion position sizing
├── Circuit breaker (daily loss limit)
├── Order validation
└── Foundational risk checks
SmartRiskManager (05-Risk-Management.md)
├── 4 trading modes (NORMAL/RECOVERY/PROTECTED/STOPPED)
├── Smart exit logic (12 kondisi)
├── Position monitoring per-detik
└── Higher-level risk decisions
```
**RiskEngine** adalah mesin kalkulasi dasar, **SmartRiskManager** adalah manajer tingkat tinggi yang menggunakannya.