- 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>
47 KiB
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
- Gambaran Umum
- Diagram Arsitektur
- 23 Komponen
- Pipeline Data: Dari OHLCV ke Keputusan Trading
- Alur Entry: 14 Filter
- Alur Exit: 12 Kondisi
- Sistem Proteksi Risiko 4 Lapis
- AI/ML Engine
- Smart Money Concepts (SMC)
- Position Lifecycle
- Auto-Retraining & Model Management
- Infrastruktur & Database
- Konfigurasi & Parameter Kritis
- Performa & Timing
- Error Handling & Fault Tolerance
- 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
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)
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
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)
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)
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)
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)
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)
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)
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.
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:
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:
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
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)
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
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
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)
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
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
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)
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
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
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)
-- 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
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
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
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
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)
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
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
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
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:
-
Smart Money Concepts (SMC) sebagai sinyal UTAMA — mendeteksi zona institusi (FVG, Order Block, BOS, CHoCH) untuk menentukan entry, SL, dan TP yang presisi.
-
XGBoost Machine Learning sebagai KONFIRMASI — memprediksi arah harga dengan 24 fitur teknikal, memblokir trade jika tidak setuju dengan SMC.
-
Hidden Markov Model (HMM) sebagai PENYESUAI — mendeteksi kondisi pasar (tenang/volatile/krisis) untuk menyesuaikan agresivitas.
-
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%).
-
Self-Improving — model AI dilatih ulang otomatis setiap hari dengan auto-rollback jika model baru lebih buruk.
-
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.