Files
XauBot/docs/arsitektur-ai/00-ARSITEKTUR-LENGKAP.md
T
GifariKemalandClaude Opus 4.6 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

1041 lines
47 KiB
Markdown
Raw 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.
# Arsitektur Lengkap — Smart AI Trading Bot
> **Dokumen:** Arsitektur keseluruhan sistem dalam 1 file
> **Instrumen:** XAUUSD (Gold) M15
> **Platform:** MetaTrader 5
> **Bahasa:** Python 3.11+ (async, Polars, XGBoost, HMM)
> **Database:** PostgreSQL + CSV fallback
> **Notifikasi:** Telegram Bot API
---
## Daftar Isi
1. [Gambaran Umum](#1-gambaran-umum)
2. [Diagram Arsitektur](#2-diagram-arsitektur)
3. [23 Komponen](#3-23-komponen)
4. [Pipeline Data: Dari OHLCV ke Keputusan Trading](#4-pipeline-data)
5. [Alur Entry: 14 Filter](#5-alur-entry-14-filter)
6. [Alur Exit: 12 Kondisi](#6-alur-exit-12-kondisi)
7. [Sistem Proteksi Risiko 4 Lapis](#7-sistem-proteksi-risiko-4-lapis)
8. [AI/ML Engine](#8-aiml-engine)
9. [Smart Money Concepts (SMC)](#9-smart-money-concepts)
10. [Position Lifecycle](#10-position-lifecycle)
11. [Auto-Retraining & Model Management](#11-auto-retraining)
12. [Infrastruktur & Database](#12-infrastruktur--database)
13. [Konfigurasi & Parameter Kritis](#13-konfigurasi--parameter-kritis)
14. [Performa & Timing](#14-performa--timing)
15. [Error Handling & Fault Tolerance](#15-error-handling--fault-tolerance)
16. [Daftar File Source Code](#16-daftar-file-source-code)
---
## 1. Gambaran Umum
### Apa Ini?
Bot trading otomatis yang menggabungkan **3 otak kecerdasan buatan** untuk trading XAUUSD (Emas) di MetaTrader 5:
```
OTAK 1: Smart Money Concepts (SMC)
→ Membaca pola institusi besar (bank, hedge fund)
→ Menentukan DIMANA entry, SL, dan TP
OTAK 2: XGBoost Machine Learning
→ Memprediksi ARAH harga (naik/turun)
→ Memberikan tingkat keyakinan (confidence)
OTAK 3: Hidden Markov Model (HMM)
→ Membaca KONDISI pasar (tenang/volatile/krisis)
→ Menyesuaikan ukuran posisi dan agresivitas
```
### Filosofi Desain
```
1. KESELAMATAN MODAL NOMOR 1
→ 4 lapis proteksi stop loss
→ Lot ultra-kecil (0.01-0.02)
→ Circuit breaker otomatis
2. TIDAK PERNAH CRASH
→ Setiap error di-catch, bot terus jalan
→ Database gagal? CSV fallback
→ MT5 putus? Auto-reconnect
3. SELF-IMPROVING
→ Model AI dilatih ulang otomatis setiap hari
→ Rollback otomatis jika model baru lebih buruk
→ Threshold confidence menyesuaikan kondisi pasar
4. TRANSPARAN
→ Setiap keputusan dicatat ke database
→ Notifikasi Telegram real-time
→ Laporan harian, jam-an, dan per-trade
```
### Angka-Angka Kunci
| Parameter | Nilai | Penjelasan |
|-----------|-------|------------|
| Modal target | $5,000 | Small account mode |
| Risiko per trade | 1% ($50) | Maksimum kerugian per posisi |
| Lot size | 0.01 - 0.02 | Ultra-konservatif |
| Max daily loss | 3% ($150) | Circuit breaker harian |
| Max total loss | 10% ($500) | Stop total trading |
| Max posisi bersamaan | 2-3 | Menghindari overexposure |
| Cooldown antar trade | 5 menit | Mencegah overtrading |
| Loop speed | ~50ms | Cepat tapi efisien |
| Timeframe | M15 | 15 menit per candle |
---
## 2. Diagram Arsitektur
### Diagram Keseluruhan Sistem
```mermaid
graph TD
subgraph MAIN["MAIN LIVE — Orchestrator<br/>main_live.py — TradingBot<br/>Candle-based M15 + position check ~10 detik"]
direction TB
subgraph P1["PHASE 1: DATA"]
MT5C["MT5 Connector<br/>(broker)"] --> FEng["Feature Engine<br/>(40+ fitur)"]
FEng --> SMCA["SMC Analyzer<br/>(institusi)"]
MT5C ~~~ HMMD["HMM Regime<br/>(3 state)"]
FEng --> XGB["XGBoost ML Model<br/>(prediksi)"]
SMCA --> XGB
HMMD --> DC["Dynamic Confidence<br/>(threshold)"]
end
subgraph P2["PHASE 2: MONITORING"]
PM["Position Manager<br/>(trailing)"]
SRM["Smart Risk Manager"]
RiskE["Risk Engine<br/>(Kelly)"]
end
subgraph P3["PHASE 3: ENTRY"]
SF["Session Filter<br/>(waktu)"]
NA["News Agent<br/>(berita)"]
EF["14-Gate Entry Filter"] --> EXEC["EXECUTE"]
end
subgraph P4["PHASE 4: PERIODIK"]
AT["Auto Trainer<br/>(retrain)"]
TN["Telegram Notifier<br/>(laporan)"]
TL["Trade Logger<br/>(DB+CSV)"]
end
P1 --> P2
P2 --> P3
P3 --> P4
P4 --> DB["PostgreSQL + CSV Backup"]
end
```
### Alur Data (Data Flow)
```mermaid
flowchart TD
MT5B["MT5 Broker<br/>(XAUUSD M15)"] -->|"200 bar OHLCV"| MT5C["MT5 Connector<br/>numpy → Polars (tanpa Pandas)"]
MT5C --> FE["Feature Engineer<br/>OHLCV → 40+ fitur teknikal<br/>RSI, ATR, MACD, BB, EMA, Volume"]
FE --> SMC["SMC Analyzer"]
FE --> HMM["HMM Regime Detect"]
SMC --> XGB["XGBoost ML Predictor<br/>24 fitur → BUY/SELL/HOLD<br/>+ Confidence 0-100%"]
HMM --> XGB
XGB --> DCM["Dynamic Confidence<br/>Threshold berdasarkan sesi,<br/>regime, volatilitas, trend"]
DCM --> SC["Signal Combiner (14 Filter)<br/>SMC + ML harus setuju<br/>+ Session + Risk + Cooldown"]
SC --> PASS{"PASS?"}
PASS -->|"NO"| WAIT["Tunggu loop berikutnya"]
PASS -->|"YES"| RE["Risk Engine + Risk Manager<br/>Kelly Criterion → lot size<br/>Validasi order → approve/reject"]
RE --> EXEC["Execute Order via MT5<br/>Kirim ke MT5 dengan SL dan TP<br/>Register ke Position Manager"]
EXEC --> TN["Telegram Notifier"]
EXEC --> TL["Trade Logger<br/>(DB + CSV)"]
```
---
## 3. 23 Komponen
### Tabel Komponen Lengkap
| # | Komponen | File | Kategori | Fungsi Utama |
|---|----------|------|----------|-------------|
| 1 | HMM Regime Detector | `src/regime_detector.py` | AI/ML | Deteksi kondisi pasar (3 regime) |
| 2 | XGBoost Predictor | `src/ml_model.py` | AI/ML | Prediksi arah harga + confidence |
| 3 | SMC Analyzer | `src/smc_polars.py` | Analisis | Pola institusi: FVG, OB, BOS, CHoCH |
| 4 | Feature Engineering | `src/feature_eng.py` | Data | OHLCV → 40+ fitur numerik |
| 5 | Smart Risk Manager | `src/smart_risk_manager.py` | Risiko | 4 mode *trading*, 12 kondisi *exit* |
| 6 | Session Filter | `src/session_filter.py` | Filter | Waktu trading optimal (WIB) |
| 7 | Stop Loss (4 Lapis) | Multi-file | Proteksi | SMC → Software → Emergency → Circuit |
| 8 | Take Profit (6 Layer) | Multi-file | Proteksi | Hard → Momentum → Peak → Probability → Early → Broker |
| 9 | Entry Trade | `main_live.py` | Eksekusi | 14 *filter* berurutan |
| 10 | Exit Trade | `main_live.py` | Eksekusi | 12 kondisi *exit real-time* |
| 11 | News Agent | `src/news_agent.py` | Monitor | **NONAKTIF** — dikomentari di kode |
| 12 | Telegram Notifier | `src/telegram_notifier.py` | Notifikasi | 11 tipe notifikasi real-time |
| 13 | Auto Trainer | `src/auto_trainer.py` | ML Ops | Retraining harian otomatis |
| 14 | Backtest | `backtests/backtest_live_sync.py` | Validasi | Simulasi 100% sync dengan live |
| 15 | Dynamic Confidence | `src/dynamic_confidence.py` | Adaptif | Threshold ML adaptif (60-85%) |
| 16 | MT5 Connector | `src/mt5_connector.py` | Koneksi | Bridge ke broker, auto-reconnect |
| 17 | Configuration | `src/config.py` | Config | 6 sub-config, auto-adjust modal |
| 18 | Trade Logger | `src/trade_logger.py` | Logging | Dual storage DB + CSV |
| 19 | Position Manager | `src/position_manager.py` | Manajemen | Trailing SL, breakeven, market close |
| 20 | Risk Engine | `src/risk_engine.py` | Risiko | Kelly Criterion, circuit breaker |
| 21 | Database | `src/db/` | Storage | PostgreSQL, 6 repository |
| 22 | Train Models | `train_models.py` | Training | Script training awal |
| 23 | Main Live | `main_live.py` | Orchestrator | Koordinasi semua komponen |
### Hubungan Antar Komponen
```mermaid
flowchart TD
CONFIG["CONFIGURATION (17)<br/>Sumber parameter semua"] -->|"dikonsumsi oleh semua"| MT5_16
CONFIG --> FE4
CONFIG --> SMC3
MT5_16["MT5 (16)<br/>Broker"] --> FE4["FeatEng (4)<br/>40+ fitur"]
FE4 --> SMC3["SMC (3)<br/>Institusi"]
FE4 --> HMM1["HMM (1)<br/>Regime"]
FE4 --> XGB2["XGBoost (2)<br/>Prediksi"]
SMC3 --> XGB2
HMM1 --> DC15["Dynamic Confidence (15)<br/>Threshold adaptif"]
XGB2 --> DC15
SESSION6["Session (6)<br/>Waktu"] --> ENTRY9["ENTRY TRADE (9)<br/>14 Filter Gate"]
DC15 --> ENTRY9
NEWS11["News (11)<br/>Berita"] --> ENTRY9
ENTRY9 --> RISK20["RiskEng (20)<br/>Kelly Lot"]
ENTRY9 --> SRISK5["SmartRisk (5)<br/>4 Mode"]
RISK20 --> EXEC["EXECUTE ORDER<br/>via MT5 (16)"]
SRISK5 --> EXEC
EXEC --> PM19["PosMgr (19)<br/>Trailing"]
EXEC --> LOG18["Logger (18)<br/>DB+CSV"]
EXEC --> TG12["Telegram (12)"]
PM19 --> EXIT10["EXIT (10)<br/>12 Kondisi"]
LOG18 --> DB21["DB (21)<br/>PostgreSQL"]
subgraph PERIODIK["Periodik"]
AT13["AutoTrain (13)<br/>Harian"]
BT14["Backtest (14)<br/>Validasi"]
TM22["Train Models (22)<br/>Setup awal"]
end
```
---
## 4. Pipeline Data
### Dari OHLCV Mentah ke Keputusan Trading
#### Tahap 1: Data Fetching (MT5 Connector)
```mermaid
flowchart TD
MT5B["MT5 Broker"] -->|"mt5.copy_rates_from_pos<br/>(XAUUSD, M15, 0, 200)"| NPA["NumPy Structured Array"]
NPA -->|"Konversi langsung ke Polars<br/>(TANPA Pandas)"| PDF["Polars DataFrame:<br/>time (i64), open (f64), high (f64),<br/>low (f64), close (f64),<br/>tick_volume (f64), spread (f64)"]
```
**Kenapa Polars, bukan Pandas?**
- 3-5x lebih cepat untuk operasi vectorized
- Memory-efficient (zero-copy)
- Native lazy evaluation
- Konsisten di seluruh codebase (tidak ada konversi bolak-balik)
#### Tahap 2: Feature Engineering (40+ Fitur)
```mermaid
flowchart TD
INPUT["Input: Polars DataFrame<br/>(200 bar OHLCV)"] --> MOM["Momentum Indicators"]
INPUT --> VOL["Volatility Indicators"]
INPUT --> TREND["Trend Indicators"]
INPUT --> PA["Price Action"]
INPUT --> VOLF["Volume Features"]
INPUT --> LAG["Lag Features"]
INPUT --> TIME["Time Features"]
MOM --> M1["RSI(14) - 0-100, overbought/oversold"]
MOM --> M2["MACD(12,26,9) - trend strength and direction"]
MOM --> M3["MACD Histogram - momentum acceleration"]
VOL --> V1["ATR(14) - average true range (pips)"]
VOL --> V2["Bollinger Bands(20,2.0) - upper, lower, width"]
VOL --> V3["Volatility(20) - rolling std of returns"]
TREND --> T1["EMA(9) / EMA(21) - fast/slow crossover"]
TREND --> T2["EMA Cross Signal - 1 bullish / -1 bearish"]
TREND --> T3["SMA(20) - simple moving average"]
PA --> P1["Returns(1,5,20) - % perubahan harga"]
PA --> P2["Log Returns - untuk distribusi normal"]
PA --> P3["Price Position - posisi dalam range BB"]
PA --> P4["Higher High/Lower Low count - trend structure"]
VOLF --> VF1["Volume SMA(20) - rata-rata volume"]
VOLF --> VF2["Volume Ratio - current / average"]
LAG --> L1["close_lag_1..5 - harga sebelumnya"]
LAG --> L2["returns_lag_1..3 - return sebelumnya"]
TIME --> TI1["Hour, Weekday - waktu candle"]
TIME --> TI2["Session flags - london, ny, overlap"]
M1 & M2 & M3 & V1 & V2 & V3 & T1 & T2 & T3 & P1 & P2 & P3 & P4 & VF1 & VF2 & L1 & L2 & TI1 & TI2 --> OUTPUT["Output: DataFrame + 40 kolom baru<br/>(semua numerik, siap ML)"]
```
**Minimum data:** 26 bar untuk semua indikator stabil
#### Tahap 3: SMC Analysis (Pola Institusi)
```mermaid
flowchart TD
INPUT["Input: DataFrame dengan OHLCV"] --> SP["Swing Points (Fractal)<br/>Window: 11 bar (swing_length=5, +/-5 dari tengah)<br/>Output: swing_high (1/0), swing_low (-1/0), level harga"]
INPUT --> FVG["Fair Value Gaps (FVG)<br/>Bullish: bar i-2 high < bar i low (gap up)<br/>Bearish: bar i-2 low > bar i high (gap down)<br/>Output: fvg_bull, fvg_bear, fvg_top, fvg_bottom, fvg_mid"]
INPUT --> OB["Order Blocks (OB)<br/>Lookback: 10 bar<br/>Bullish: candle bearish terakhir sebelum move up besar<br/>Bearish: candle bullish terakhir sebelum move down besar<br/>Output: ob (1/-1), ob_top, ob_bottom, ob_mitigated"]
INPUT --> BOS["Break of Structure (BOS)<br/>Harga break swing high/low = trend continuation<br/>Output: bos (1/-1), level yang di-break"]
INPUT --> CHOCH["Change of Character (CHoCH)<br/>Harga break berlawanan arah trend = reversal signal<br/>Output: choch (1/-1), level yang di-break"]
INPUT --> LIQ["Liquidity Zones<br/>BSL: Buy Side Liquidity (above swing highs)<br/>SSL: Sell Side Liquidity (below swing lows)<br/>Output: bsl_level, ssl_level"]
SP & FVG & OB & BOS & CHOCH & LIQ --> SIG["Signal Generation<br/>Syarat: Structure break + (FVG ATAU Order Block)"]
SIG --> ENTRY["Entry: harga saat ini"]
SIG --> SL["SL: ATR-based, minimum 1.5 x ATR dari entry"]
SIG --> TP["TP: 2:1 Risk-Reward minimum, cap 4 x ATR"]
SIG --> CONF["Confidence: 40-85%<br/>(v5: calibrated weighted scoring)"]
SIG --> REASON["Reason: BOS + Bullish FVG at 2645.50"]
```
#### Tahap 4: Regime Detection (HMM)
```mermaid
flowchart TD
INPUT["Input: log_returns + normalized_range (volatilitas)"] -->|"GaussianHMM(n_components=3, lookback=500)"| REGIME["3 Regime Output"]
REGIME --> R0["REGIME 0: Low Volatility<br/>Pasar tenang, range kecil<br/>Lot multiplier: 1.0x (normal)<br/>Rekomendasi: TRADE"]
REGIME --> R1["REGIME 1: Medium Volatility<br/>Pasar aktif, trend jelas<br/>Lot multiplier: 1.0x (normal)<br/>Rekomendasi: TRADE"]
REGIME --> R2["REGIME 2: High Volatility<br/>Pasar sangat volatile, berbahaya<br/>Lot multiplier: 0.5x (setengah)<br/>Rekomendasi: REDUCE"]
REGIME --> RC["CRISIS (FlashCrashDetector)<br/>Move > 2.5% dalam 1 menit<br/>Lot multiplier: 0.0x (STOP)<br/>Rekomendasi: EMERGENCY CLOSE ALL"]
style R0 fill:#4CAF50,color:#fff
style R1 fill:#2196F3,color:#fff
style R2 fill:#FF9800,color:#fff
style RC fill:#F44336,color:#fff
```
#### Tahap 5: ML Prediction (XGBoost)
```mermaid
flowchart TD
INPUT["Input: 24 fitur terpilih dari<br/>Feature Engineering + SMC + Regime"] -->|"XGBoost Binary Classifier<br/>max_depth=3, learning_rate=0.05<br/>min_child_weight=10, subsample=0.7<br/>colsample_bytree=0.6<br/>reg_alpha=1.0 (L1), reg_lambda=5.0 (L2)"| OUTPUT["Output:<br/>prob_up: 0.72 (probabilitas naik)<br/>prob_down: 0.28 (probabilitas turun)"]
OUTPUT --> SIG["Signal: BUY (prob_up > 0.50)<br/>Confidence: 72%"]
SIG --> TH1["prob > 0.50 - ada sinyal (minimum)"]
SIG --> TH2["prob > 0.65 - sinyal kuat"]
SIG --> TH3["prob > 0.75 - sinyal sangat kuat"]
SIG --> TH4["prob > 0.80 - lot bisa naik ke 0.02"]
```
#### Tahap 6: Dynamic Confidence (Threshold Adaptif)
```mermaid
flowchart TD
BASE["Base Score: 50"] --> SESS["Session Modifier<br/>Golden Time (20:00-23:59 WIB): +20<br/>London (15:00-23:59): +15<br/>New York (20:00-05:00): +10<br/>Tokyo/Sydney: +0<br/>Market Closed: -30"]
BASE --> REG["Regime Modifier<br/>Medium Volatility: +15<br/>Low Volatility: +5<br/>High Volatility: -5<br/>Crisis: -25"]
BASE --> VOLM["Volatility Modifier<br/>Medium (ideal): +10<br/>Low: +0<br/>High: -5<br/>Extreme: -10"]
BASE --> TREN["Trend Modifier<br/>Trending (jelas): +10<br/>Ranging (sideways): -5"]
BASE --> SMCC["SMC Confluence<br/>Ada konfluensi: +10<br/>Tidak ada: +0"]
BASE --> MLC["ML Confidence<br/>ge 70%: +5<br/>ge 60%: +2<br/>lt 60%: +0"]
SESS & REG & VOLM & TREN & SMCC & MLC --> TOTAL["Total Score (0-100)"]
TOTAL --> EXC["EXCELLENT (ge 80 poin)<br/>Threshold: 60% (longgar)"]
TOTAL --> GOOD["GOOD (65-79)<br/>Threshold: 65%"]
TOTAL --> MOD["MODERATE (50-64)<br/>Threshold: 70%"]
TOTAL --> POOR["POOR (35-49)<br/>Threshold: 80% (ketat)"]
TOTAL --> AVOID["AVOID (lt 35)<br/>Threshold: 85% (SKIP)"]
style EXC fill:#4CAF50,color:#fff
style GOOD fill:#8BC34A,color:#fff
style MOD fill:#FF9800,color:#fff
style POOR fill:#FF5722,color:#fff
style AVOID fill:#F44336,color:#fff
```
Contoh: Golden Time + Medium Vol + Trending + SMC + ML 72%
= 50 + 20 + 15 + 10 + 10 + 10 + 5 = 120 (cap 100)
= EXCELLENT -> Threshold 60% -> ML 72% PASS
---
## 5. Alur Entry: 14 Filter
Setiap sinyal harus melewati **14 gerbang berurutan**. Satu saja gagal = TIDAK trading.
```mermaid
flowchart TD
S["SINYAL SMC + ML MASUK"] --> F1{"Filter 1: Session<br/>Jam trading dibolehkan?<br/>BLOCK: 00:00-06:00 WIB (dead zone)<br/>BLOCK: Jumat ge 23:00 WIB"}
F1 -->|"BLOCK"| SKIP1["SKIP"]
F1 -->|"PASS: London/NY/Golden Time"| F2{"Filter 2: Risk Mode<br/>Bukan STOPPED?<br/>BLOCK: daily/total limit hit"}
F2 -->|"BLOCK"| SKIP2["SKIP"]
F2 -->|"PASS: NORMAL/RECOVERY/PROTECTED"| F3{"Filter 3: SMC Signal<br/>Ada setup SMC valid?<br/>BLOCK: Tidak ada FVG/OB + BOS/CHoCH"}
F3 -->|"BLOCK"| SKIP3["SKIP"]
F3 -->|"PASS: Ada sinyal BUY/SELL + SL + TP"| F4{"Filter 4: ML Confidence<br/>ML confidence ge dynamic threshold?<br/>Threshold 60-85% tergantung quality"}
F4 -->|"BLOCK"| SKIP4["SKIP"]
F4 -->|"PASS: confidence ge threshold"| F5{"Filter 5: ML Agreement<br/>ML TIDAK strongly disagree?<br/>BLOCK: ML > 65% berlawanan arah SMC"}
F5 -->|"BLOCK"| SKIP5["SKIP"]
F5 -->|"PASS: ML setuju atau netral"| F6{"Filter 6: Market Quality<br/>Dynamic Confidence bukan AVOID?<br/>BLOCK: Quality == AVOID (score lt 35)"}
F6 -->|"BLOCK"| SKIP6["SKIP"]
F6 -->|"PASS: EXCELLENT/GOOD/MODERATE/POOR"| F7{"Filter 7: Signal Confirmation<br/>Sinyal konsisten 2x berturut?<br/>BLOCK: Baru muncul 1x"}
F7 -->|"BLOCK"| SKIP7["SKIP"]
F7 -->|"PASS: 2x berturut"| F8{"Filter 8: Pullback (v5: ATR-based)<br/>Momentum selaras?<br/>BLOCK: RSI overbought/oversold<br/>BLOCK: MACD berlawanan<br/>BLOCK: Bounce > 15% ATR (3 candle)"}
F8 -->|"BLOCK"| SKIP8["SKIP"]
F8 -->|"PASS: Momentum selaras"| F9{"Filter 9: Trade Cooldown<br/>Sudah ge 5 menit sejak trade terakhir?<br/>BLOCK: lt 300 detik"}
F9 -->|"BLOCK"| SKIP9["SKIP"]
F9 -->|"PASS: ge 300 detik"| F10{"Filter 10: Position Limit<br/>Posisi terbuka lt limit?<br/>BLOCK: Sudah 2+ posisi terbuka"}
F10 -->|"BLOCK"| SKIP10["SKIP"]
F10 -->|"PASS: lt 2 posisi"| F11{"Filter 11: Lot Size<br/>Lot size > 0?<br/>BLOCK: Lot = 0 (crisis/risk tinggi)"}
F11 -->|"BLOCK"| SKIP11["SKIP"]
F11 -->|"PASS: Lot ge 0.01"| F12{"Filter 12: Flash Crash Guard<br/>TIDAK ada flash crash?<br/>BLOCK: Move > 2.5% dalam 1 menit"}
F12 -->|"BLOCK + CLOSE ALL"| SKIP12["SKIP"]
F12 -->|"PASS: Normal"| F13{"Filter 13: H1 Bias (#31B)<br/>EMA20 H1 selaras arah sinyal?<br/>BLOCK: BUY tapi harga lt EMA20 H1<br/>BLOCK: SELL tapi harga > EMA20 H1"}
F13 -->|"BLOCK"| SKIP13["SKIP"]
F13 -->|"PASS: Selaras"| F14{"Filter 14: Time Filter (#34A)<br/>Bukan jam transisi?<br/>BLOCK: Jam 9 atau 21 WIB"}
F14 -->|"BLOCK"| SKIP14["SKIP"]
F14 -->|"PASS"| EXEC["EXECUTE TRADE<br/>BUY atau SELL<br/>via MT5 Connector"]
EXEC --> REG["Register ke SmartRiskManager"]
EXEC --> LOG["Log ke TradeLogger (DB + CSV)"]
EXEC --> TG["Kirim notifikasi Telegram"]
style EXEC fill:#4CAF50,color:#fff,stroke:#388E3C,stroke-width:3px
```
---
## 6. Alur Exit: 12 Kondisi
Setiap posisi terbuka dievaluasi **setiap ~10 detik** (di antara candle) atau **setiap candle baru** (full analysis) terhadap 12 kondisi exit:
```mermaid
flowchart TD
POS["POSISI TERBUKA<br/>(dicek setiap ~10 detik)<br/>Update: profit, momentum, peak, durasi"] --> K1{"Kondisi 1: Smart Take Profit<br/>(a) Profit ge $40 = hard TP<br/>(b) Profit ge $25 + momentum lt -30<br/>(c) Peak > $30, sekarang lt 60% peak<br/>(d) Profit ge $20 + TP prob lt 25%"}
K1 -->|"TRIGGER"| CLOSE1["TUTUP: Smart TP"]
K1 -->|"tidak trigger"| K2{"Kondisi 2: Early Exit (Profit Kecil)<br/>Profit $5-$15 + ML reversal ge 65%<br/>+ momentum lt -50"}
K2 -->|"TRIGGER"| CLOSE2["TUTUP: Amankan profit kecil"]
K2 -->|"tidak trigger"| K3{"Kondisi 3: Early Cut<br/>(v4: Smart Hold DIHAPUS)<br/>Loss ge 30% max ($15)<br/>DAN momentum lt -30"}
K3 -->|"TRIGGER"| CLOSE3["TUTUP CEPAT: Early cut"]
K3 -->|"tidak trigger"| K4{"Kondisi 4: ML Trend Reversal<br/>ML confidence ge 65%<br/>BERLAWANAN ARAH posisi<br/>+ 3x warning berturut-turut"}
K4 -->|"TRIGGER"| CLOSE4["TUTUP: AI deteksi pembalikan"]
K4 -->|"tidak trigger"| K5{"Kondisi 5: Maximum Loss<br/>Loss ge 50% dari max_loss_per_trade<br/>($25 dari $50)"}
K5 -->|"TRIGGER"| CLOSE5["TUTUP: Kerugian terlalu besar"]
K5 -->|"tidak trigger"| K6{"Kondisi 6: Stall Detection<br/>Posisi 10+ bar<br/>tanpa profit signifikan"}
K6 -->|"TRIGGER"| CLOSE6["TUTUP: Pasar tidak bergerak"]
K6 -->|"tidak trigger"| K7{"Kondisi 7: Daily Limit<br/>Total daily loss<br/>mendekati limit"}
K7 -->|"TRIGGER"| CLOSE7["TUTUP SEMUA: Proteksi modal"]
K7 -->|"tidak trigger"| K8{"Kondisi 8: Weekend Close<br/>Dekat market close weekend<br/>+ ada posisi profit"}
K8 -->|"TRIGGER"| CLOSE8["TUTUP: Hindari gap risk"]
K8 -->|"tidak trigger"| K9{"Kondisi 9: Smart Time-Based<br/>(v5: Dont Cut Winners)<br/>(a) > 4 jam + no growth = TUTUP<br/>(b) > 4 jam + growing + ML = HOLD<br/>(c) > 6 jam + profit lt $10 = TUTUP<br/>(d) > 6 jam + profit > $10 = extend 8j<br/>(e) > 8 jam = TUTUP final"}
K9 -->|"TRIGGER"| CLOSE9["TUTUP: Time-based"]
K9 -->|"tidak trigger"| K10{"Kondisi 10: Trailing Stop Loss<br/>Profit ge 25 pips?<br/>SL ikuti harga jarak 10 pips"}
K10 -->|"TRIGGER"| CLOSE10["TRAILING: Kunci profit"]
K10 -->|"tidak trigger"| K11{"Kondisi 11: Breakeven Protection<br/>Profit ge 15 pips?<br/>SL ke entry + 2 poin buffer"}
K11 -->|"TRIGGER"| CLOSE11["BREAKEVEN: Posisi aman"]
K11 -->|"tidak trigger"| K12["Kondisi 12: Default HOLD<br/>Tidak ada kondisi terpenuhi<br/>Biarkan posisi berjalan"]
style CLOSE1 fill:#F44336,color:#fff
style CLOSE2 fill:#F44336,color:#fff
style CLOSE3 fill:#F44336,color:#fff
style CLOSE4 fill:#F44336,color:#fff
style CLOSE5 fill:#F44336,color:#fff
style CLOSE6 fill:#F44336,color:#fff
style CLOSE7 fill:#F44336,color:#fff
style CLOSE8 fill:#F44336,color:#fff
style CLOSE9 fill:#F44336,color:#fff
style CLOSE10 fill:#FF9800,color:#fff
style CLOSE11 fill:#FF9800,color:#fff
style K12 fill:#4CAF50,color:#fff
```
### *Position Manager* (Tambahan per Posisi)
Selain 12 kondisi di atas, *Position Manager* juga menjalankan:
```mermaid
flowchart TD
PM["Position Manager (per posisi)"] --> MCH{"Market Close Handler<br/>(Prioritas Tertinggi)<br/>Dekat close harian/weekend?"}
MCH -->|"Profit ge $10 + dekat close"| CLOSE_MC["TUTUP (amankan)"]
MCH -->|"Loss + weekend + SL > 50%"| CLOSE_GAP["TUTUP (gap risk)"]
MCH -->|"Loss kecil + weekend"| HOLD_MC["HOLD (bisa recovery)"]
MCH -->|"Tidak dekat close"| BE{"Breakeven Protection<br/>Profit ge 15 pips?"}
BE -->|"Ya"| BE_ACT["Pindah SL ke entry + 2 buffer<br/>(posisi tidak bisa rugi lagi)"]
BE -->|"Tidak"| TS{"Trailing Stop<br/>Profit ge 25 pips?"}
TS -->|"Ya"| TS_ACT["SL mengikuti harga, jarak 10 pips<br/>(kunci profit sambil biarkan berjalan)"]
TS -->|"Tidak"| CONT["Lanjut monitoring"]
```
---
## 7. Sistem Proteksi Risiko 4 Lapis
```mermaid
flowchart TD
subgraph L1["LAPIS 1: BROKER STOP LOSS (Otomatis oleh MT5)"]
L1D["SL = Entry +/- (1.5 x ATR), minimum 10 pips<br/>Dikirim bersama order ke broker<br/>Aktif 24/7, bahkan jika bot mati<br/>Max loss: ~$50-80 per trade"]
end
subgraph L2["LAPIS 2: SOFTWARE SMART EXIT (Bot evaluasi setiap ~10 detik)"]
L2D["12 kondisi exit (lihat bagian 6)<br/>Biasanya menutup SEBELUM broker SL kena<br/>Target close: loss le $25 (lebih ketat dari broker)<br/>Termasuk: momentum, ML reversal, stall, time limit"]
end
subgraph L3["LAPIS 3: EMERGENCY STOP LOSS (Backup jika software gagal)"]
L3D["Max loss per trade: 2% modal ($100 untuk $5K)<br/>Diset sebagai broker SL terpisah<br/>Aktif jika software error/hang"]
end
subgraph L4["LAPIS 4: CIRCUIT BREAKER (Hentikan semua trading)"]
L4D["Trigger 1: Daily loss ge 3% ($150) = Stop hari ini<br/>Trigger 2: Total loss ge 10% ($500) = Stop total<br/>Trigger 3: Flash crash > 2.5% / 1 menit = CLOSE ALL<br/>Reset: Otomatis hari baru (daily), manual (total)"]
end
L1 --> L2 --> L3 --> L4
style L1 fill:#4CAF50,color:#fff
style L2 fill:#2196F3,color:#fff
style L3 fill:#FF9800,color:#fff
style L4 fill:#F44336,color:#fff
```
### 4 Mode Trading (Smart Risk Manager)
```mermaid
flowchart TD
NORMAL["MODE: NORMAL<br/>Kondisi: Semua aman, tidak ada masalah<br/>Lot: 0.01 - 0.02 (berdasarkan confidence)<br/>Max posisi: 2-3"]
NORMAL -->|"3x loss berturut-turut"| RECOVERY["MODE: RECOVERY<br/>Kondisi: Setelah kerugian beruntun<br/>Lot: 0.01 (minimum saja)<br/>Max posisi: 1"]
RECOVERY -->|"mendekati 80% daily limit"| PROTECTED["MODE: PROTECTED<br/>Kondisi: Hampir kena daily limit<br/>Lot: 0.01 (minimum saja)<br/>Max posisi: 1"]
PROTECTED -->|"daily/total limit tercapai"| STOPPED["MODE: STOPPED<br/>Kondisi: Batas kerugian tercapai<br/>Lot: 0 (TIDAK BOLEH trading)<br/>Max posisi: 0 (tutup semua)<br/>Reset: Otomatis hari baru"]
style NORMAL fill:#4CAF50,color:#fff
style RECOVERY fill:#FF9800,color:#fff
style PROTECTED fill:#FF5722,color:#fff
style STOPPED fill:#F44336,color:#fff
```
### Lot Sizing: Risk-Constrained Half-Kelly
```
Langkah 1: Hitung Kelly Fraction
f* = (win_rate × avg_rr - (1 - win_rate)) / avg_rr
Contoh: win_rate=55%, avg_rr=2.0
f* = (0.55 × 2.0 - 0.45) / 2.0 = 0.325 (32.5%)
Langkah 2: Cap Kelly (max 25%)
f* = min(0.325, 0.25) = 0.25
Langkah 3: Half-Kelly (safety)
f* = 0.25 × 0.5 = 0.125 (12.5%)
Langkah 4: Apply regime multiplier
High volatility: × 0.5 = 0.0625
Normal: × 1.0 = 0.125
Langkah 5: Cap di config limit
config risk_per_trade = 1%
actual_risk = min(0.125, 0.01) = 0.01 (1%)
Langkah 6: Hitung lot
risk_amount = $5000 × 1% = $50
SL distance = 50 pips → pip_value ~$1/pip/0.01lot
lot = $50 / (50 × $1) = 0.01 lot
Langkah 7: ML Confidence boost
ML ≥ 80% → lot × 2 = 0.02 lot (maximum)
ML < 65% → lot = 0.01 (minimum)
Langkah 8: Session multiplier
Golden Time: × 1.2
Sydney: × 0.5
Final lot: 0.01 - 0.02 (ultra-konservatif)
```
---
## 8. AI/ML Engine
### Hidden Markov Model (HMM) — Otak Regime
```mermaid
flowchart TD
subgraph HMM["HIDDEN MARKOV MODEL"]
direction TB
INFO["Library: hmmlearn.GaussianHMM<br/>Input: log_returns + rolling_volatility (2 fitur)<br/>States: 3 (Low, Medium, High Volatility)<br/>Lookback: 500 bar untuk training<br/>Retrain: setiap 20 bar (auto-update)"]
TRANS["Transition Matrix (contoh):<br/>Fr Low: To Low 0.85, To Med 0.12, To High 0.03<br/>Fr Med: To Low 0.10, To Med 0.80, To High 0.10<br/>Fr High: To Low 0.05, To Med 0.15, To High 0.80"]
EMISI["Distribusi Emisi (per state):<br/>Low: mu_return ~ 0, sigma = kecil<br/>Med: mu_return ~ 0, sigma = sedang<br/>High: mu_return ~ 0, sigma = besar"]
OUTPUT["Output:<br/>regime: 0/1/2 (low/medium/high)<br/>confidence: 0.0 - 1.0<br/>lot_multiplier: 1.0 / 0.5 / 0.0<br/>recommendation: TRADE / REDUCE / SLEEP"]
INFO --> TRANS --> EMISI --> OUTPUT
end
```
### XGBoost — Otak Prediksi
```mermaid
flowchart TD
subgraph XGB["XGBOOST BINARY CLASSIFIER"]
direction TB
INFO2["Library: xgboost<br/>Objective: binary:logistic<br/>Target: UP (1) / DOWN (0) pada bar berikutnya"]
CONFIG2["Anti-Overfitting Config:<br/>max_depth: 3 (shallow trees)<br/>learning_rate: 0.05 (slow learning)<br/>min_child_weight: 10 (min samples/leaf)<br/>subsample: 0.7 (70% data/tree)<br/>colsample_bytree: 0.6 (60% features/tree)<br/>reg_alpha: 1.0 (L1), reg_lambda: 5.0 (L2)<br/>gamma: 1.0 (min loss reduction)<br/>num_boost_round: 50 (few rounds)"]
FITUR2["24 Fitur Input (Top 10):<br/>1. RSI(14), 2. MACD_histogram<br/>3. ATR(14), 4. bb_width<br/>5. returns_1, 6. price_position<br/>7. volatility_20, 8. returns_5<br/>9. ema_cross, 10. regime"]
OUT2["Output:<br/>signal: BUY / SELL / HOLD<br/>probability: 0.0-1.0 (prob of UP)<br/>confidence: 0.0-1.0 (prob of winning side)"]
VAL2["Validation:<br/>Train/Test: 70%/30% (50-bar gap, anti leakage)<br/>Walk-forward: 500 train / 50 test / 50 step<br/>Target AUC: > 0.65<br/>Rollback AUC: lt 0.60 (v4: dinaikkan dari 0.52)<br/>Overfitting ratio: train_AUC/test_AUC lt 1.15"]
INFO2 --> CONFIG2 --> FITUR2 --> OUT2 --> VAL2
end
```
### Kombinasi Sinyal (SMC + ML)
```mermaid
flowchart TD
SMC_SIG["SMC Signal: BUY at 2645, SL 2635, TP 2665, conf 75%"]
ML_SIG["ML Signal: BUY, confidence 72%"]
SMC_SIG & ML_SIG --> COMBINE{"KOMBINASI SMC + ML"}
COMBINE --> C1["CASE 1: SMC BUY + ML BUY (ge 50%)<br/>Combined confidence = (75%+72%)/2 = 73.5%<br/>= ENTRY (jika pass 14 filter)"]
COMBINE --> C2["CASE 2: SMC BUY + ML SELL (ge 65%)<br/>ML strongly disagrees = BLOCK (filter #5)<br/>= TIDAK entry"]
COMBINE --> C3["CASE 3: SMC BUY + ML uncertain (lt 50%)<br/>ML tidak yakin = BLOCK (filter #4)<br/>= TIDAK entry"]
COMBINE --> C4["CASE 4: Tidak ada SMC signal<br/>Tidak ada entry point = SKIP<br/>SMC adalah sinyal PRIMER (wajib ada)"]
C1 & C2 & C3 & C4 --> PRINSIP["PRINSIP:<br/>SMC = sinyal UTAMA (entry/SL/TP)<br/>ML = KONFIRMASI (bisa blokir, tidak bisa inisiasi)<br/>HMM = PENYESUAI (mengatur agresivitas)"]
style C1 fill:#4CAF50,color:#fff
style C2 fill:#F44336,color:#fff
style C3 fill:#F44336,color:#fff
style C4 fill:#9E9E9E,color:#fff
```
---
## 9. Smart Money Concepts (SMC)
### 6 Konsep yang Dianalisis
```mermaid
flowchart TD
subgraph SP["1. SWING POINTS (Fractal High/Low)"]
SP_D["Swing High: titik tertinggi dalam window 11 bar<br/>5 bar kiri lebih rendah, 5 bar kanan lebih rendah<br/><br/>Swing Low: titik terendah dalam window 11 bar<br/>5 bar kiri lebih tinggi, 5 bar kanan lebih tinggi"]
end
subgraph FVG2["2. FAIR VALUE GAP (FVG) - Ketidakseimbangan Harga"]
FVG_D["Bullish FVG (gap up): Bar i-2 high lt Bar i low (ada gap)<br/>Bearish FVG (gap down): Bar i-2 low > Bar i high<br/>Harga cenderung kembali mengisi FVG = entry zone"]
end
subgraph OB2["3. ORDER BLOCK (OB) - Zona Institusi"]
OB_D["Bullish OB: candle bearish terakhir sebelum rally<br/>(zona dimana institusi menempatkan buy order besar)<br/>Lookback: 10 bar untuk deteksi<br/>Mitigated: true jika harga sudah revisit"]
end
subgraph BOS2["4. BREAK OF STRUCTURE (BOS) - Kelanjutan Trend"]
BOS_D["Uptrend BOS: harga break di ATAS swing high sebelumnya<br/>= Trend bullish berlanjut<br/>Downtrend BOS: harga break di BAWAH swing low<br/>= Trend bearish berlanjut"]
end
subgraph CHOCH2["5. CHANGE OF CHARACTER (CHoCH) - Perubahan Trend"]
CHOCH_D["Uptrend ke Downtrend:<br/>Harga break di BAWAH swing low terakhir<br/>= Trend berubah dari bullish ke bearish<br/>(sinyal reversal)"]
end
subgraph LIQ2["6. LIQUIDITY ZONES - Target Likuiditas"]
LIQ_D["BSL (Buy Side Liquidity): di atas swing highs<br/>(stop loss para seller berkumpul)<br/>SSL (Sell Side Liquidity): di bawah swing lows<br/>(stop loss para buyer berkumpul)<br/>Institusi sering hunt liquidity zone ini"]
end
```
### Signal Generation
```mermaid
flowchart TD
SB["Structure Break<br/>(BOS atau CHoCH)"] --> VALID["VALID SIGNAL"]
ZN["Zone<br/>(FVG atau Order Block)"] --> VALID
VALID --> BUY_SIG["BUY Signal:<br/>BOS bullish ATAU CHoCH bearish-to-bullish<br/>+ Bullish FVG ATAU Bullish OB di bawah harga<br/>Entry: harga saat ini<br/>SL: di bawah zone, minimum 1.5 x ATR<br/>TP: 2:1 R:R, maximum 4 x ATR<br/>Confidence: 40-85% (v5: calibrated weighted scoring)"]
VALID --> SELL_SIG["SELL Signal:<br/>BOS bearish ATAU CHoCH bullish-to-bearish<br/>+ Bearish FVG ATAU Bearish OB di atas harga<br/>Entry: harga saat ini<br/>SL: di atas zone, minimum 1.5 x ATR<br/>TP: 2:1 R:R, maximum 4 x ATR<br/>Confidence: 40-85% (v5: calibrated weighted scoring)"]
style BUY_SIG fill:#4CAF50,color:#fff
style SELL_SIG fill:#F44336,color:#fff
```
---
## 10. Position Lifecycle
### Dari Lahir Sampai Mati (Siklus Hidup Posisi)
```mermaid
flowchart TD
T1["TAHAP 1: SINYAL TERDETEKSI<br/>SMC menemukan setup + ML konfirmasi + 14 filter PASS<br/>Keputusan: BUKA POSISI"]
T1 --> T2["TAHAP 2: LOT SIZE CALCULATION<br/>Risk Engine (Kelly): Balance $5000 x 1% = $50 max loss<br/>SL distance 50 pips = lot 0.01<br/>ML ge 80% = 0.02 lot, ML lt 65% = 0.01 lot<br/>Session: Golden x1.2, Sydney x0.5<br/>Regime: Normal x1.0, High Vol x0.5, Crisis x0.0"]
T2 --> T3["TAHAP 3: ORDER VALIDATION<br/>SL di sisi benar (BUY: SL lt entry)<br/>TP di sisi benar (BUY: TP > entry)<br/>Lot dalam range (0.01 - 0.05)<br/>Entry dekat harga saat ini (lt 0.1%)<br/>Risk% le 1.5x config limit<br/>Circuit breaker TIDAK aktif"]
T3 --> T4["TAHAP 4: ORDER EXECUTION<br/>MT5 Connector mengirim order:<br/>Symbol: XAUUSD, Type: BUY/SELL<br/>Lot: 0.01-0.02, SL: ATR-based<br/>TP: 2:1 R:R, Deviation: 20 points<br/>Retry: max 3 attempts"]
T4 --> T4B["TAHAP 4b: POST-EXECUTION VALIDATION (v5)<br/>Slippage Validation: max 0.15% (~$4 XAUUSD)<br/>Log WARNING jika melebihi batas<br/>Gunakan harga AKTUAL untuk tracking<br/>Partial Fill: cek volume, update lot aktual"]
T4B --> T5["TAHAP 5: POSITION REGISTERED<br/>Smart Risk Manager: catat entry AKTUAL, peak=0<br/>Trade Logger: insert PostgreSQL (30+ field) + CSV<br/>Telegram: notifikasi trade open<br/>(entry, SL, TP, R:R, confidence, regime)"]
T5 --> T6["TAHAP 6: ACTIVE MONITORING<br/>(setiap ~10 detik + candle baru)<br/>Update profit/loss, peak profit, momentum<br/>Hitung TP probability<br/>Cek 12 kondisi exit<br/>Cek Position Manager (trailing, breakeven)<br/>Cek Market Close Handler"]
T6 -->|"trigger close"| T7["TAHAP 7: POSITION CLOSED<br/>MT5: Close via market order<br/>Risk Manager: record P/L, update counters,<br/>check mode transition<br/>Logger: update exit price, profit, duration, reason<br/>Telegram: notifikasi trade close"]
T6 -->|"HOLD"| T6
style T1 fill:#1565C0,color:#fff
style T7 fill:#C62828,color:#fff
```
---
## 11. Auto-Retraining & Model Management
### Lifecycle Model AI
```mermaid
flowchart TD
INIT["INITIAL TRAINING (train_models.py)<br/>Dijalankan 1x saat setup"]
INIT --> I1["1. Fetch 10,000 bar M15 dari MT5 (~104 hari)"]
I1 --> I2["2. Feature Engineering = 40+ fitur"]
I2 --> I3["3. SMC Analysis = struktur pasar"]
I3 --> I4["4. Create target UP/DOWN (lookahead=1)<br/>4b. Split 70/30, 50-bar gap (anti leakage)"]
I4 --> I5["5. Train HMM (3 regime, lookback=500)"]
I5 --> I6["6. Train XGBoost (50 rounds, early_stop=5)"]
I6 --> I7["7. Walk-forward validation (500/50/50)"]
I7 --> I8["8. Save: hmm_regime.pkl + xgboost_model.pkl"]
I8 --> DAILY["DAILY AUTO-RETRAINING (Auto Trainer)<br/>Otomatis setiap hari 05:00 WIB"]
DAILY --> SCHED["Schedule:<br/>Harian (05:00 WIB): 8,000 bar, 50 rounds<br/>Weekend (Sabtu): 15,000 bar, 80 rounds (deep)<br/>Emergency: jika AUC lt 0.65"]
SCHED --> D1["1. Backup model saat ini"]
D1 --> D2["2. Fetch data baru dari MT5"]
D2 --> D3["3. Feature Engineering + SMC"]
D3 --> D4["4. Train HMM baru + XGBoost baru"]
D4 --> D5{"5. Validasi: test AUC ge 0.60?"}
D5 -->|"Ya"| SAVE["Save model baru, reload di memory"]
D5 -->|"Tidak"| ROLLBACK["ROLLBACK ke model sebelumnya"]
SAVE --> D6["6. Log hasil ke PostgreSQL"]
ROLLBACK --> D6
D6 --> D7["7. Kirim laporan via Telegram"]
D7 --> SAFETY["Safety:<br/>Max 5 backup (rotasi)<br/>Min 20 jam antar retrain (cooldown)<br/>Auto-rollback jika AUC lt 0.60<br/>Model lama selalu tersedia"]
```
### Perbandingan Initial vs Auto Training
| Aspek | train_models.py | Auto Trainer |
|-------|-----------------|-------------|
| Kapan | Manual, 1x setup | Otomatis, harian |
| Data | 10,000 bar | 8K (harian) / 15K (weekend) |
| Boost rounds | 50 | 50 (harian) / 80 (weekend) |
| Walk-forward | Ya | Tidak |
| Backup | Tidak | Ya (5 terakhir) |
| Rollback | Tidak | Ya (AUC < 0.60) |
| Database | Tidak | Ya (PostgreSQL) |
| Tujuan | Setup awal | Maintenance rutin |
---
## 12. Infrastruktur & Database
### PostgreSQL Schema
```mermaid
flowchart TD
DB["trading_db"] --> T["trades<br/>Semua trade: open, close, profit, SMC, ML, features"]
DB --> TR["training_runs<br/>Log setiap training: AUC, akurasi, durasi, rollback"]
DB --> SG["signals<br/>Setiap sinyal yang dihasilkan: executed atau tidak"]
DB --> MS["market_snapshots<br/>Snapshot periodik: harga, regime, volatilitas"]
DB --> BS["bot_status<br/>Status bot: uptime, loop count, balance, risk mode"]
DB --> DS["daily_summaries<br/>Ringkasan harian: win rate, profit factor, per sesi"]
```
### Tabel `trades` (Detail)
```sql
-- Identifikasi
ticket, symbol, direction (BUY/SELL)
-- Harga
entry_price, exit_price, stop_loss, take_profit
-- Hasil
lot_size, profit_usd, profit_pips
opened_at, closed_at, duration_seconds
-- Konteks Entry
entry_regime, entry_volatility, entry_session
smc_signal, smc_confidence, smc_reason
smc_fvg_detected, smc_ob_detected, smc_bos_detected, smc_choch_detected
ml_signal, ml_confidence
market_quality, market_score, dynamic_threshold
-- Konteks Exit
exit_reason, exit_regime, exit_ml_signal
-- Keuangan
balance_before, balance_after, equity_at_entry
-- Data Lengkap
features_entry (JSON), features_exit (JSON)
bot_version, trade_mode
```
### Connection Architecture
```mermaid
flowchart TD
TL["TradeLogger"] -->|"TradeRepository, SignalRepository,<br/>MarketSnapshotRepository"| DBC["DatabaseConnection (Singleton)"]
AT2["AutoTrainer"] -->|"TrainingRepository"| DBC
ML["main_live.py"] -->|"BotStatusRepository,<br/>DailySummaryRepository"| DBC
DASH["Dashboard"] -->|"Semua repository (READ)"| DBC
DBC --> POOL["ThreadedConnectionPool (1-10 koneksi)"]
POOL --> PG["PostgreSQL Server"]
```
### Graceful Degradation
```mermaid
flowchart TD
CHECK{"PostgreSQL tersedia?"}
CHECK -->|"Ya"| DUAL["Gunakan DB + CSV backup (dual write)"]
CHECK -->|"Tidak"| CSV["CSV saja (bot tetap berjalan 100%)"]
DUAL --> NOTE["Bot TIDAK PERNAH crash karena database.<br/>Semua operasi DB dibungkus try-except."]
CSV --> NOTE
```
---
## 13. Konfigurasi & Parameter Kritis
### Configuration System
```mermaid
flowchart TD
ENV[".env file"] --> TC["TradingConfig.from_env()"]
TC --> RC["RiskConfig<br/>risk_per_trade: 1.0% (SMALL) / 0.5% (MEDIUM)<br/>max_daily_loss: 3.0% (SMALL) / 2.0% (MEDIUM)<br/>max_total_loss: 10.0%<br/>max_positions: 3 (SMALL) / 5 (MEDIUM)<br/>min_lot: 0.01<br/>max_lot: 0.05 (SMALL) / 2.0 (MEDIUM)<br/>max_leverage: 1:100 (SMALL) / 1:30 (MEDIUM)"]
TC --> SC["SMCConfig<br/>swing_length: 5<br/>fvg_min_gap_pips: 2.0<br/>ob_lookback: 10<br/>bos_close_break: true"]
TC --> MLC2["MLConfig<br/>confidence_threshold: 0.65<br/>entry_confidence: 0.70<br/>high_confidence: 0.75<br/>very_high_confidence: 0.80<br/>retrain_frequency_days: 7"]
TC --> THC["ThresholdsConfig<br/>ml_min_confidence: 0.65<br/>ml_high_confidence: 0.75<br/>trade_cooldown_seconds: 300<br/>min_profit_to_secure: $15<br/>good_profit: $25, great_profit: $40<br/>flash_crash_threshold: 2.5%<br/>sydney_lot_multiplier: 0.5"]
TC --> RGC["RegimeConfig<br/>n_regimes: 3<br/>lookback: 500<br/>retrain_frequency: 20"]
```
### Capital Mode Auto-Detection
```mermaid
flowchart TD
BAL{"Balance?"}
BAL -->|"le $10,000"| SMALL["SMALL MODE<br/>Risk: 1% per trade ($50 pada $5K)<br/>Daily limit: 3% ($150)<br/>Lot: 0.01-0.05<br/>Leverage: 1:100<br/>Timeframe: M15<br/>Max posisi: 3"]
BAL -->|"> $10,000"| MEDIUM["MEDIUM MODE<br/>Risk: 0.5% per trade<br/>Daily limit: 2%<br/>Lot: 0.01-2.0<br/>Leverage: 1:30<br/>Timeframe: H1<br/>Max posisi: 5"]
```
### Session Schedule (WIB = GMT+7)
```mermaid
flowchart LR
subgraph SESSION["Session Schedule (WIB = GMT+7)"]
direction TB
DZ["00:00-04:00 DEAD ZONE<br/>BLOCKED - Likuiditas rendah"]
RO["04:00-06:00 ROLLOVER<br/>BLOCKED - Spread melebar"]
SY["06:00-07:00 Sydney<br/>0.5x - Pasar baru buka"]
TK["07:00-13:00 Tokyo+Sydney<br/>0.7x - Asia aktif"]
TA["13:00-15:00 Tokyo akhir<br/>0.7x - Transisi"]
LD["15:00-20:00 London<br/>1.0x - Volatilitas naik"]
GT["20:00-23:59 GOLDEN TIME<br/>1.2x - London+NY overlap"]
WR["Jumat ge 23:00 WEEKEND RISK<br/>BLOCKED - Gap risk"]
end
style DZ fill:#F44336,color:#fff
style RO fill:#F44336,color:#fff
style SY fill:#FF9800,color:#fff
style TK fill:#FFC107,color:#000
style TA fill:#FFC107,color:#000
style LD fill:#2196F3,color:#fff
style GT fill:#4CAF50,color:#fff
style WR fill:#F44336,color:#fff
```
Golden Time (20:00-23:59 WIB) = waktu paling optimal
- Spread ketat, likuiditas maksimal, volatilitas ideal
- Lot multiplier 1.2x (bonus)
- v4: Smart Hold dihapus -- tidak ada lagi hold losers menunggu sesi tertentu
---
## 14. Performa & Timing
### Main Loop Breakdown
Target: < 50ms per iterasi analisis
**FULL ANALYSIS (saat candle baru M15):**
| Komponen | Waktu | Keterangan |
|----------|-------|------------|
| MT5 data fetch | ~10ms | 200 bar M15 via API |
| Feature engineering | ~5ms | 40+ fitur, Polars |
| SMC analysis | ~5ms | 6 konsep, Polars native |
| HMM predict | ~2ms | 2 fitur -> 1 regime |
| XGBoost predict | ~3ms | 24 fitur -> 1 signal |
| Position monitoring | ~5ms | Per posisi terbuka |
| Entry logic | ~5ms | 14 filter check |
| Overhead | ~15ms | Logging, state update |
| **TOTAL** | **~50ms** | |
**POSITION CHECK ONLY (di antara candle, setiap ~10 detik):**
| Komponen | Waktu | Keterangan |
|----------|-------|------------|
| MT5 data fetch | ~5ms | 50 bar saja |
| Feature engineering | ~3ms | Minimal fitur |
| ML prediction | ~3ms | Untuk exit evaluation |
| Position evaluation | ~5ms | 12 kondisi exit |
| Overhead | ~5ms | Logging |
| **TOTAL** | **~21ms** | |
### Timer Periodik
| Event | Interval | Cara Trigger |
|-------|----------|--------------|
| Full analysis + entry | Candle baru M15 | Deteksi candle |
| Position monitoring | ~10 detik | Di antara candle |
| Performance logging | 4 candle (~1j) | candle_count % 4 |
| Auto-retrain check | 20 candle (~5j) | candle_count % 20 |
| Market update Telegram | 30 menit | Timer |
| Hourly analysis | 1 jam | Timer |
| Daily summary + reset | Ganti hari | Date check |
---
## 15. Error Handling & Fault Tolerance
### Prinsip: Bot TIDAK PERNAH Crash
```mermaid
flowchart TD
subgraph LV1["LEVEL 1: Per-Loop Error Handling"]
LV1D["try: Fetch data, analyze, trade<br/>except ConnectionError: reconnect()<br/>except Exception: Log error, lanjut loop berikutnya<br/>Bot TIDAK crash dari error tunggal"]
end
subgraph LV2["LEVEL 2: MT5 Auto-Reconnect"]
LV2D["MT5 putus?<br/>Attempt 1: reconnect (tunggu 2 detik)<br/>Attempt 2: reconnect (tunggu 4 detik)<br/>Attempt 3: reconnect (tunggu 8 detik)<br/>Cooldown 60 detik, Retry cycle (max 5/cooldown)<br/>Selama disconnected: monitoring PAUSE,<br/>entry DITUNDA, posisi dilindungi broker SL"]
end
subgraph LV3["LEVEL 3: Database Graceful Degradation"]
LV3D["PostgreSQL down?<br/>Switch ke CSV-only mode<br/>Semua data tetap dicatat<br/>Trading tetap berjalan normal<br/>Retry DB connection periodik"]
end
subgraph LV4["LEVEL 4: Telegram Failure"]
LV4D["Telegram API error?<br/>Log error secara silent<br/>Trading tetap jalan 100%<br/>Retry di notifikasi berikutnya"]
end
subgraph LV5["LEVEL 5: Model File Missing"]
LV5D[".pkl file tidak ditemukan?<br/>Log warning<br/>Skip prediksi (ML/HMM)<br/>Trading bisa jalan tanpa ML (SMC only)<br/>Trigger: jalankan train_models.py"]
end
subgraph LV6["LEVEL 6: Flash Crash Protection"]
LV6D["Harga bergerak > 2.5% dalam 1 menit?<br/>EMERGENCY: Close ALL positions<br/>Circuit breaker AKTIF<br/>Kirim alert KRITIS via Telegram<br/>Bot masuk mode STOPPED"]
end
LV1 --> LV2 --> LV3 --> LV4 --> LV5 --> LV6
```
### Startup & Shutdown
```mermaid
flowchart TD
subgraph STARTUP["STARTUP SEQUENCE"]
direction TB
S1["1. Load konfigurasi dari .env"] --> S2["2. Connect ke MT5 (max 3 retry)"]
S2 --> S3["3. Load model HMM dari models/hmm_regime.pkl"]
S3 --> S4["4. Load model XGBoost dari models/xgboost_model.pkl"]
S4 --> S5["5. Initialize SmartRiskManager (set balance, limits)"]
S5 --> S6["6. Initialize SessionFilter (WIB timezone)"]
S6 --> S7["7. Initialize TelegramNotifier"]
S7 --> S8["8. Initialize TradeLogger (connect DB)"]
S8 --> S9["9. Initialize AutoTrainer"]
S9 --> S10["10. Send Telegram: BOT STARTED"]
S10 --> S11["11. Mulai main loop"]
end
subgraph SHUTDOWN["SHUTDOWN SEQUENCE (SIGINT/SIGTERM)"]
direction TB
D1["1. Signal diterima"] --> D2["2. Hentikan loop utama"]
D2 --> D3["3. Kirim Telegram: BOT STOPPED"]
D3 --> D4["4. Disconnect MT5"]
D4 --> D5["5. Close database connections"]
D5 --> D6["6. Exit"]
end
```
---
## 16. Daftar File Source Code
```mermaid
flowchart TD
ROOT["Smart Automatic Trading BOT + AI/"]
ROOT --> MAIN["main_live.py - Orchestrator utama"]
ROOT --> TRAIN["train_models.py - Script training awal"]
ROOT --> ENVF[".env - Environment variables"]
ROOT --> SRC["src/"]
SRC --> CFG["config.py - Konfigurasi terpusat (6 sub-config)"]
SRC --> MT5F["mt5_connector.py - Bridge ke MetaTrader 5"]
SRC --> FEF["feature_eng.py - Feature Engineering (40+ fitur)"]
SRC --> RDF["regime_detector.py - HMM Regime Detection"]
SRC --> MLF["ml_model.py - XGBoost Signal Predictor"]
SRC --> SMCF["smc_polars.py - Smart Money Concepts (6 konsep)"]
SRC --> SRMF["smart_risk_manager.py - 4-Mode Risk Manager"]
SRC --> REF["risk_engine.py - Kelly Criterion + Circuit Breaker"]
SRC --> SFF["session_filter.py - Session Time Filter (WIB)"]
SRC --> DCF["dynamic_confidence.py - Dynamic Threshold Manager"]
SRC --> NAF["news_agent.py - News Event Monitor"]
SRC --> TNF["telegram_notifier.py - Telegram Push Notifications"]
SRC --> ATF["auto_trainer.py - Daily Auto-Retraining"]
SRC --> TLF["trade_logger.py - Dual Storage Logger (DB+CSV)"]
SRC --> PMF["position_manager.py - Position Manager + Market Close"]
SRC --> DBD["db/"]
DBD --> DBINIT["__init__.py - DB exports"]
DBD --> DBCONN["connection.py - PostgreSQL Singleton + Pool"]
DBD --> DBREPO["repository.py - 6 Repository classes"]
ROOT --> MODELS["models/"]
MODELS --> XGBM["xgboost_model.pkl - Trained XGBoost model"]
MODELS --> HMMM["hmm_regime.pkl - Trained HMM model"]
MODELS --> BKUP["backup/ - Auto-backup (5 terakhir)"]
ROOT --> DATA["data/"]
DATA --> TDATA["training_data.parquet"]
DATA --> TLOGS["trade_logs/ - CSV backup (per bulan)"]
ROOT --> BTESTS["backtests/"]
BTESTS --> BTSYNC["backtest_live_sync.py - 100% sync live"]
ROOT --> LOGS["logs/"]
LOGS --> LOGF["training_YYYY-MM-DD.log"]
ROOT --> DOCS["docs/arsitektur-ai/"]
DOCS --> DOC0["00-ARSITEKTUR-LENGKAP.md - Dokumen ini"]
DOCS --> DOCR["README.md - Index komponen"]
DOCS --> DOC1["01-23 (per komponen) - Detail per modul"]
```
---
## Ringkasan Eksekutif
**Smart AI Trading Bot** adalah sistem trading otomatis yang menggabungkan:
1. **Smart Money Concepts (SMC)** sebagai sinyal UTAMA — mendeteksi zona institusi (FVG, Order Block, BOS, CHoCH) untuk menentukan entry, SL, dan TP yang presisi.
2. **XGBoost Machine Learning** sebagai KONFIRMASI — memprediksi arah harga dengan 24 fitur teknikal, memblokir trade jika tidak setuju dengan SMC.
3. **Hidden Markov Model (HMM)** sebagai PENYESUAI — mendeteksi kondisi pasar (tenang/volatile/krisis) untuk menyesuaikan agresivitas.
4. **4-Lapis Proteksi Risiko** — dari broker SL, software smart exit, emergency stop, hingga circuit breaker. Lot ultra-kecil (0.01-0.02) memastikan kerugian per trade maximum $50 (1%).
5. **Self-Improving** — model AI dilatih ulang otomatis setiap hari dengan auto-rollback jika model baru lebih buruk.
6. **Fault-Tolerant** — bot tidak pernah crash. MT5 putus? Auto-reconnect. Database mati? CSV fallback. Error? Log dan lanjut.
Semua ini dikoordinasikan oleh **Main Live Orchestrator** yang menjalankan loop **candle-based** — analisis penuh hanya saat candle M15 baru terbentuk (~50ms per iterasi), dengan pengecekan posisi setiap ~10 detik di antara candle (~21ms). Mengevaluasi 14 *filter entry* dan 12 kondisi *exit* secara *real-time*, dengan notifikasi Telegram untuk setiap kejadian penting.
```
TARGET: Trading XAUUSD M15 yang KONSISTEN dan AMAN
dengan kerugian terkontrol dan profit teroptimasi.
```