e8355b3f62
- 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>
4.2 KiB
4.2 KiB
Risk Engine — Mesin Risiko & Circuit Breaker
File:
src/risk_engine.pyClass:RiskEngineDigunakan 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)
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
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
# 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
@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
@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.