Files
XauBot/docs/arsitektur-ai/20-Risk-Engine.md
T
GifariKemal a240d974f6 docs: add architecture documentation for remaining 8 components (16-23)
New documentation files:
- 16-MT5-Connector: Broker bridge with auto-reconnect & Polars native
- 17-Configuration: 6 sub-configs with capital mode auto-adjustment
- 18-Trade-Logger: Dual storage (PostgreSQL + CSV), thread-safe
- 19-Position-Manager: 7 action conditions, trailing SL, market close handler
- 20-Risk-Engine: Kelly Criterion sizing, circuit breaker, order validation
- 21-Database: PostgreSQL integration with 6 repositories
- 22-Train-Models: Initial training script (HMM + XGBoost)
- 23-Main-Live-Orchestrator: Main loop coordinating 15+ components

Updated README.md with complete index of all 23 components.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 09:17:20 +07:00

4.2 KiB
Raw Blame History

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)

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 (10 kondisi)
├── Position monitoring per-detik
└── Higher-level risk decisions

RiskEngine adalah mesin kalkulasi dasar, SmartRiskManager adalah manajer tingkat tinggi yang menggunakannya.