# 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
main_live.py — TradingBot
Candle-based M15 + position check ~10 detik"] direction TB subgraph P1["PHASE 1: DATA"] MT5C["MT5 Connector
(broker)"] --> FEng["Feature Engine
(40+ fitur)"] FEng --> SMCA["SMC Analyzer
(institusi)"] MT5C ~~~ HMMD["HMM Regime
(3 state)"] FEng --> XGB["XGBoost ML Model
(prediksi)"] SMCA --> XGB HMMD --> DC["Dynamic Confidence
(threshold)"] end subgraph P2["PHASE 2: MONITORING"] PM["Position Manager
(trailing)"] SRM["Smart Risk Manager"] RiskE["Risk Engine
(Kelly)"] end subgraph P3["PHASE 3: ENTRY"] SF["Session Filter
(waktu)"] NA["News Agent
(berita)"] EF["14-Gate Entry Filter"] --> EXEC["EXECUTE"] end subgraph P4["PHASE 4: PERIODIK"] AT["Auto Trainer
(retrain)"] TN["Telegram Notifier
(laporan)"] TL["Trade Logger
(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
(XAUUSD M15)"] -->|"200 bar OHLCV"| MT5C["MT5 Connector
numpy → Polars (tanpa Pandas)"] MT5C --> FE["Feature Engineer
OHLCV → 40+ fitur teknikal
RSI, ATR, MACD, BB, EMA, Volume"] FE --> SMC["SMC Analyzer"] FE --> HMM["HMM Regime Detect"] SMC --> XGB["XGBoost ML Predictor
24 fitur → BUY/SELL/HOLD
+ Confidence 0-100%"] HMM --> XGB XGB --> DCM["Dynamic Confidence
Threshold berdasarkan sesi,
regime, volatilitas, trend"] DCM --> SC["Signal Combiner (14 Filter)
SMC + ML harus setuju
+ Session + Risk + Cooldown"] SC --> PASS{"PASS?"} PASS -->|"NO"| WAIT["Tunggu loop berikutnya"] PASS -->|"YES"| RE["Risk Engine + Risk Manager
Kelly Criterion → lot size
Validasi order → approve/reject"] RE --> EXEC["Execute Order via MT5
Kirim ke MT5 dengan SL dan TP
Register ke Position Manager"] EXEC --> TN["Telegram Notifier"] EXEC --> TL["Trade Logger
(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)
Sumber parameter semua"] -->|"dikonsumsi oleh semua"| MT5_16 CONFIG --> FE4 CONFIG --> SMC3 MT5_16["MT5 (16)
Broker"] --> FE4["FeatEng (4)
40+ fitur"] FE4 --> SMC3["SMC (3)
Institusi"] FE4 --> HMM1["HMM (1)
Regime"] FE4 --> XGB2["XGBoost (2)
Prediksi"] SMC3 --> XGB2 HMM1 --> DC15["Dynamic Confidence (15)
Threshold adaptif"] XGB2 --> DC15 SESSION6["Session (6)
Waktu"] --> ENTRY9["ENTRY TRADE (9)
14 Filter Gate"] DC15 --> ENTRY9 NEWS11["News (11)
Berita"] --> ENTRY9 ENTRY9 --> RISK20["RiskEng (20)
Kelly Lot"] ENTRY9 --> SRISK5["SmartRisk (5)
4 Mode"] RISK20 --> EXEC["EXECUTE ORDER
via MT5 (16)"] SRISK5 --> EXEC EXEC --> PM19["PosMgr (19)
Trailing"] EXEC --> LOG18["Logger (18)
DB+CSV"] EXEC --> TG12["Telegram (12)"] PM19 --> EXIT10["EXIT (10)
12 Kondisi"] LOG18 --> DB21["DB (21)
PostgreSQL"] subgraph PERIODIK["Periodik"] AT13["AutoTrain (13)
Harian"] BT14["Backtest (14)
Validasi"] TM22["Train Models (22)
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
(XAUUSD, M15, 0, 200)"| NPA["NumPy Structured Array"] NPA -->|"Konversi langsung ke Polars
(TANPA Pandas)"| PDF["Polars DataFrame:
time (i64), open (f64), high (f64),
low (f64), close (f64),
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
(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
(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)
Window: 11 bar (swing_length=5, +/-5 dari tengah)
Output: swing_high (1/0), swing_low (-1/0), level harga"] INPUT --> FVG["Fair Value Gaps (FVG)
Bullish: bar i-2 high < bar i low (gap up)
Bearish: bar i-2 low > bar i high (gap down)
Output: fvg_bull, fvg_bear, fvg_top, fvg_bottom, fvg_mid"] INPUT --> OB["Order Blocks (OB)
Lookback: 10 bar
Bullish: candle bearish terakhir sebelum move up besar
Bearish: candle bullish terakhir sebelum move down besar
Output: ob (1/-1), ob_top, ob_bottom, ob_mitigated"] INPUT --> BOS["Break of Structure (BOS)
Harga break swing high/low = trend continuation
Output: bos (1/-1), level yang di-break"] INPUT --> CHOCH["Change of Character (CHoCH)
Harga break berlawanan arah trend = reversal signal
Output: choch (1/-1), level yang di-break"] INPUT --> LIQ["Liquidity Zones
BSL: Buy Side Liquidity (above swing highs)
SSL: Sell Side Liquidity (below swing lows)
Output: bsl_level, ssl_level"] SP & FVG & OB & BOS & CHOCH & LIQ --> SIG["Signal Generation
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%
(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
Pasar tenang, range kecil
Lot multiplier: 1.0x (normal)
Rekomendasi: TRADE"] REGIME --> R1["REGIME 1: Medium Volatility
Pasar aktif, trend jelas
Lot multiplier: 1.0x (normal)
Rekomendasi: TRADE"] REGIME --> R2["REGIME 2: High Volatility
Pasar sangat volatile, berbahaya
Lot multiplier: 0.5x (setengah)
Rekomendasi: REDUCE"] REGIME --> RC["CRISIS (FlashCrashDetector)
Move > 2.5% dalam 1 menit
Lot multiplier: 0.0x (STOP)
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
Feature Engineering + SMC + Regime"] -->|"XGBoost Binary Classifier
max_depth=3, learning_rate=0.05
min_child_weight=10, subsample=0.7
colsample_bytree=0.6
reg_alpha=1.0 (L1), reg_lambda=5.0 (L2)"| OUTPUT["Output:
prob_up: 0.72 (probabilitas naik)
prob_down: 0.28 (probabilitas turun)"] OUTPUT --> SIG["Signal: BUY (prob_up > 0.50)
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
Golden Time (20:00-23:59 WIB): +20
London (15:00-23:59): +15
New York (20:00-05:00): +10
Tokyo/Sydney: +0
Market Closed: -30"] BASE --> REG["Regime Modifier
Medium Volatility: +15
Low Volatility: +5
High Volatility: -5
Crisis: -25"] BASE --> VOLM["Volatility Modifier
Medium (ideal): +10
Low: +0
High: -5
Extreme: -10"] BASE --> TREN["Trend Modifier
Trending (jelas): +10
Ranging (sideways): -5"] BASE --> SMCC["SMC Confluence
Ada konfluensi: +10
Tidak ada: +0"] BASE --> MLC["ML Confidence
ge 70%: +5
ge 60%: +2
lt 60%: +0"] SESS & REG & VOLM & TREN & SMCC & MLC --> TOTAL["Total Score (0-100)"] TOTAL --> EXC["EXCELLENT (ge 80 poin)
Threshold: 60% (longgar)"] TOTAL --> GOOD["GOOD (65-79)
Threshold: 65%"] TOTAL --> MOD["MODERATE (50-64)
Threshold: 70%"] TOTAL --> POOR["POOR (35-49)
Threshold: 80% (ketat)"] TOTAL --> AVOID["AVOID (lt 35)
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
Jam trading dibolehkan?
BLOCK: 00:00-06:00 WIB (dead zone)
BLOCK: Jumat ge 23:00 WIB"} F1 -->|"BLOCK"| SKIP1["SKIP"] F1 -->|"PASS: London/NY/Golden Time"| F2{"Filter 2: Risk Mode
Bukan STOPPED?
BLOCK: daily/total limit hit"} F2 -->|"BLOCK"| SKIP2["SKIP"] F2 -->|"PASS: NORMAL/RECOVERY/PROTECTED"| F3{"Filter 3: SMC Signal
Ada setup SMC valid?
BLOCK: Tidak ada FVG/OB + BOS/CHoCH"} F3 -->|"BLOCK"| SKIP3["SKIP"] F3 -->|"PASS: Ada sinyal BUY/SELL + SL + TP"| F4{"Filter 4: ML Confidence
ML confidence ge dynamic threshold?
Threshold 60-85% tergantung quality"} F4 -->|"BLOCK"| SKIP4["SKIP"] F4 -->|"PASS: confidence ge threshold"| F5{"Filter 5: ML Agreement
ML TIDAK strongly disagree?
BLOCK: ML > 65% berlawanan arah SMC"} F5 -->|"BLOCK"| SKIP5["SKIP"] F5 -->|"PASS: ML setuju atau netral"| F6{"Filter 6: Market Quality
Dynamic Confidence bukan AVOID?
BLOCK: Quality == AVOID (score lt 35)"} F6 -->|"BLOCK"| SKIP6["SKIP"] F6 -->|"PASS: EXCELLENT/GOOD/MODERATE/POOR"| F7{"Filter 7: Signal Confirmation
Sinyal konsisten 2x berturut?
BLOCK: Baru muncul 1x"} F7 -->|"BLOCK"| SKIP7["SKIP"] F7 -->|"PASS: 2x berturut"| F8{"Filter 8: Pullback (v5: ATR-based)
Momentum selaras?
BLOCK: RSI overbought/oversold
BLOCK: MACD berlawanan
BLOCK: Bounce > 15% ATR (3 candle)"} F8 -->|"BLOCK"| SKIP8["SKIP"] F8 -->|"PASS: Momentum selaras"| F9{"Filter 9: Trade Cooldown
Sudah ge 5 menit sejak trade terakhir?
BLOCK: lt 300 detik"} F9 -->|"BLOCK"| SKIP9["SKIP"] F9 -->|"PASS: ge 300 detik"| F10{"Filter 10: Position Limit
Posisi terbuka lt limit?
BLOCK: Sudah 2+ posisi terbuka"} F10 -->|"BLOCK"| SKIP10["SKIP"] F10 -->|"PASS: lt 2 posisi"| F11{"Filter 11: Lot Size
Lot size > 0?
BLOCK: Lot = 0 (crisis/risk tinggi)"} F11 -->|"BLOCK"| SKIP11["SKIP"] F11 -->|"PASS: Lot ge 0.01"| F12{"Filter 12: Flash Crash Guard
TIDAK ada flash crash?
BLOCK: Move > 2.5% dalam 1 menit"} F12 -->|"BLOCK + CLOSE ALL"| SKIP12["SKIP"] F12 -->|"PASS: Normal"| F13{"Filter 13: H1 Bias (#31B)
EMA20 H1 selaras arah sinyal?
BLOCK: BUY tapi harga lt EMA20 H1
BLOCK: SELL tapi harga > EMA20 H1"} F13 -->|"BLOCK"| SKIP13["SKIP"] F13 -->|"PASS: Selaras"| F14{"Filter 14: Time Filter (#34A)
Bukan jam transisi?
BLOCK: Jam 9 atau 21 WIB"} F14 -->|"BLOCK"| SKIP14["SKIP"] F14 -->|"PASS"| EXEC["EXECUTE TRADE
BUY atau SELL
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
(dicek setiap ~10 detik)
Update: profit, momentum, peak, durasi"] --> K1{"Kondisi 1: Smart Take Profit
(a) Profit ge $40 = hard TP
(b) Profit ge $25 + momentum lt -30
(c) Peak > $30, sekarang lt 60% peak
(d) Profit ge $20 + TP prob lt 25%"} K1 -->|"TRIGGER"| CLOSE1["TUTUP: Smart TP"] K1 -->|"tidak trigger"| K2{"Kondisi 2: Early Exit (Profit Kecil)
Profit $5-$15 + ML reversal ge 65%
+ momentum lt -50"} K2 -->|"TRIGGER"| CLOSE2["TUTUP: Amankan profit kecil"] K2 -->|"tidak trigger"| K3{"Kondisi 3: Early Cut
(v4: Smart Hold DIHAPUS)
Loss ge 30% max ($15)
DAN momentum lt -30"} K3 -->|"TRIGGER"| CLOSE3["TUTUP CEPAT: Early cut"] K3 -->|"tidak trigger"| K4{"Kondisi 4: ML Trend Reversal
ML confidence ge 65%
BERLAWANAN ARAH posisi
+ 3x warning berturut-turut"} K4 -->|"TRIGGER"| CLOSE4["TUTUP: AI deteksi pembalikan"] K4 -->|"tidak trigger"| K5{"Kondisi 5: Maximum Loss
Loss ge 50% dari max_loss_per_trade
($25 dari $50)"} K5 -->|"TRIGGER"| CLOSE5["TUTUP: Kerugian terlalu besar"] K5 -->|"tidak trigger"| K6{"Kondisi 6: Stall Detection
Posisi 10+ bar
tanpa profit signifikan"} K6 -->|"TRIGGER"| CLOSE6["TUTUP: Pasar tidak bergerak"] K6 -->|"tidak trigger"| K7{"Kondisi 7: Daily Limit
Total daily loss
mendekati limit"} K7 -->|"TRIGGER"| CLOSE7["TUTUP SEMUA: Proteksi modal"] K7 -->|"tidak trigger"| K8{"Kondisi 8: Weekend Close
Dekat market close weekend
+ ada posisi profit"} K8 -->|"TRIGGER"| CLOSE8["TUTUP: Hindari gap risk"] K8 -->|"tidak trigger"| K9{"Kondisi 9: Smart Time-Based
(v5: Dont Cut Winners)
(a) > 4 jam + no growth = TUTUP
(b) > 4 jam + growing + ML = HOLD
(c) > 6 jam + profit lt $10 = TUTUP
(d) > 6 jam + profit > $10 = extend 8j
(e) > 8 jam = TUTUP final"} K9 -->|"TRIGGER"| CLOSE9["TUTUP: Time-based"] K9 -->|"tidak trigger"| K10{"Kondisi 10: Trailing Stop Loss
Profit ge 25 pips?
SL ikuti harga jarak 10 pips"} K10 -->|"TRIGGER"| CLOSE10["TRAILING: Kunci profit"] K10 -->|"tidak trigger"| K11{"Kondisi 11: Breakeven Protection
Profit ge 15 pips?
SL ke entry + 2 poin buffer"} K11 -->|"TRIGGER"| CLOSE11["BREAKEVEN: Posisi aman"] K11 -->|"tidak trigger"| K12["Kondisi 12: Default HOLD
Tidak ada kondisi terpenuhi
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
(Prioritas Tertinggi)
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
Profit ge 15 pips?"} BE -->|"Ya"| BE_ACT["Pindah SL ke entry + 2 buffer
(posisi tidak bisa rugi lagi)"] BE -->|"Tidak"| TS{"Trailing Stop
Profit ge 25 pips?"} TS -->|"Ya"| TS_ACT["SL mengikuti harga, jarak 10 pips
(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
Dikirim bersama order ke broker
Aktif 24/7, bahkan jika bot mati
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)
Biasanya menutup SEBELUM broker SL kena
Target close: loss le $25 (lebih ketat dari broker)
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)
Diset sebagai broker SL terpisah
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
Trigger 2: Total loss ge 10% ($500) = Stop total
Trigger 3: Flash crash > 2.5% / 1 menit = CLOSE ALL
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
Kondisi: Semua aman, tidak ada masalah
Lot: 0.01 - 0.02 (berdasarkan confidence)
Max posisi: 2-3"] NORMAL -->|"3x loss berturut-turut"| RECOVERY["MODE: RECOVERY
Kondisi: Setelah kerugian beruntun
Lot: 0.01 (minimum saja)
Max posisi: 1"] RECOVERY -->|"mendekati 80% daily limit"| PROTECTED["MODE: PROTECTED
Kondisi: Hampir kena daily limit
Lot: 0.01 (minimum saja)
Max posisi: 1"] PROTECTED -->|"daily/total limit tercapai"| STOPPED["MODE: STOPPED
Kondisi: Batas kerugian tercapai
Lot: 0 (TIDAK BOLEH trading)
Max posisi: 0 (tutup semua)
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
Input: log_returns + rolling_volatility (2 fitur)
States: 3 (Low, Medium, High Volatility)
Lookback: 500 bar untuk training
Retrain: setiap 20 bar (auto-update)"] TRANS["Transition Matrix (contoh):
Fr Low: To Low 0.85, To Med 0.12, To High 0.03
Fr Med: To Low 0.10, To Med 0.80, To High 0.10
Fr High: To Low 0.05, To Med 0.15, To High 0.80"] EMISI["Distribusi Emisi (per state):
Low: mu_return ~ 0, sigma = kecil
Med: mu_return ~ 0, sigma = sedang
High: mu_return ~ 0, sigma = besar"] OUTPUT["Output:
regime: 0/1/2 (low/medium/high)
confidence: 0.0 - 1.0
lot_multiplier: 1.0 / 0.5 / 0.0
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
Objective: binary:logistic
Target: UP (1) / DOWN (0) pada bar berikutnya"] CONFIG2["Anti-Overfitting Config:
max_depth: 3 (shallow trees)
learning_rate: 0.05 (slow learning)
min_child_weight: 10 (min samples/leaf)
subsample: 0.7 (70% data/tree)
colsample_bytree: 0.6 (60% features/tree)
reg_alpha: 1.0 (L1), reg_lambda: 5.0 (L2)
gamma: 1.0 (min loss reduction)
num_boost_round: 50 (few rounds)"] FITUR2["24 Fitur Input (Top 10):
1. RSI(14), 2. MACD_histogram
3. ATR(14), 4. bb_width
5. returns_1, 6. price_position
7. volatility_20, 8. returns_5
9. ema_cross, 10. regime"] OUT2["Output:
signal: BUY / SELL / HOLD
probability: 0.0-1.0 (prob of UP)
confidence: 0.0-1.0 (prob of winning side)"] VAL2["Validation:
Train/Test: 70%/30% (50-bar gap, anti leakage)
Walk-forward: 500 train / 50 test / 50 step
Target AUC: > 0.65
Rollback AUC: lt 0.60 (v4: dinaikkan dari 0.52)
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%)
Combined confidence = (75%+72%)/2 = 73.5%
= ENTRY (jika pass 14 filter)"] COMBINE --> C2["CASE 2: SMC BUY + ML SELL (ge 65%)
ML strongly disagrees = BLOCK (filter #5)
= TIDAK entry"] COMBINE --> C3["CASE 3: SMC BUY + ML uncertain (lt 50%)
ML tidak yakin = BLOCK (filter #4)
= TIDAK entry"] COMBINE --> C4["CASE 4: Tidak ada SMC signal
Tidak ada entry point = SKIP
SMC adalah sinyal PRIMER (wajib ada)"] C1 & C2 & C3 & C4 --> PRINSIP["PRINSIP:
SMC = sinyal UTAMA (entry/SL/TP)
ML = KONFIRMASI (bisa blokir, tidak bisa inisiasi)
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
5 bar kiri lebih rendah, 5 bar kanan lebih rendah

Swing Low: titik terendah dalam window 11 bar
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)
Bearish FVG (gap down): Bar i-2 low > Bar i high
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
(zona dimana institusi menempatkan buy order besar)
Lookback: 10 bar untuk deteksi
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
= Trend bullish berlanjut
Downtrend BOS: harga break di BAWAH swing low
= Trend bearish berlanjut"] end subgraph CHOCH2["5. CHANGE OF CHARACTER (CHoCH) - Perubahan Trend"] CHOCH_D["Uptrend ke Downtrend:
Harga break di BAWAH swing low terakhir
= Trend berubah dari bullish ke bearish
(sinyal reversal)"] end subgraph LIQ2["6. LIQUIDITY ZONES - Target Likuiditas"] LIQ_D["BSL (Buy Side Liquidity): di atas swing highs
(stop loss para seller berkumpul)
SSL (Sell Side Liquidity): di bawah swing lows
(stop loss para buyer berkumpul)
Institusi sering hunt liquidity zone ini"] end ``` ### Signal Generation ```mermaid flowchart TD SB["Structure Break
(BOS atau CHoCH)"] --> VALID["VALID SIGNAL"] ZN["Zone
(FVG atau Order Block)"] --> VALID VALID --> BUY_SIG["BUY Signal:
BOS bullish ATAU CHoCH bearish-to-bullish
+ Bullish FVG ATAU Bullish OB di bawah harga
Entry: harga saat ini
SL: di bawah zone, minimum 1.5 x ATR
TP: 2:1 R:R, maximum 4 x ATR
Confidence: 40-85% (v5: calibrated weighted scoring)"] VALID --> SELL_SIG["SELL Signal:
BOS bearish ATAU CHoCH bullish-to-bearish
+ Bearish FVG ATAU Bearish OB di atas harga
Entry: harga saat ini
SL: di atas zone, minimum 1.5 x ATR
TP: 2:1 R:R, maximum 4 x ATR
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
SMC menemukan setup + ML konfirmasi + 14 filter PASS
Keputusan: BUKA POSISI"] T1 --> T2["TAHAP 2: LOT SIZE CALCULATION
Risk Engine (Kelly): Balance $5000 x 1% = $50 max loss
SL distance 50 pips = lot 0.01
ML ge 80% = 0.02 lot, ML lt 65% = 0.01 lot
Session: Golden x1.2, Sydney x0.5
Regime: Normal x1.0, High Vol x0.5, Crisis x0.0"] T2 --> T3["TAHAP 3: ORDER VALIDATION
SL di sisi benar (BUY: SL lt entry)
TP di sisi benar (BUY: TP > entry)
Lot dalam range (0.01 - 0.05)
Entry dekat harga saat ini (lt 0.1%)
Risk% le 1.5x config limit
Circuit breaker TIDAK aktif"] T3 --> T4["TAHAP 4: ORDER EXECUTION
MT5 Connector mengirim order:
Symbol: XAUUSD, Type: BUY/SELL
Lot: 0.01-0.02, SL: ATR-based
TP: 2:1 R:R, Deviation: 20 points
Retry: max 3 attempts"] T4 --> T4B["TAHAP 4b: POST-EXECUTION VALIDATION (v5)
Slippage Validation: max 0.15% (~$4 XAUUSD)
Log WARNING jika melebihi batas
Gunakan harga AKTUAL untuk tracking
Partial Fill: cek volume, update lot aktual"] T4B --> T5["TAHAP 5: POSITION REGISTERED
Smart Risk Manager: catat entry AKTUAL, peak=0
Trade Logger: insert PostgreSQL (30+ field) + CSV
Telegram: notifikasi trade open
(entry, SL, TP, R:R, confidence, regime)"] T5 --> T6["TAHAP 6: ACTIVE MONITORING
(setiap ~10 detik + candle baru)
Update profit/loss, peak profit, momentum
Hitung TP probability
Cek 12 kondisi exit
Cek Position Manager (trailing, breakeven)
Cek Market Close Handler"] T6 -->|"trigger close"| T7["TAHAP 7: POSITION CLOSED
MT5: Close via market order
Risk Manager: record P/L, update counters,
check mode transition
Logger: update exit price, profit, duration, reason
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)
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)
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)
Otomatis setiap hari 05:00 WIB"] DAILY --> SCHED["Schedule:
Harian (05:00 WIB): 8,000 bar, 50 rounds
Weekend (Sabtu): 15,000 bar, 80 rounds (deep)
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:
Max 5 backup (rotasi)
Min 20 jam antar retrain (cooldown)
Auto-rollback jika AUC lt 0.60
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
Semua trade: open, close, profit, SMC, ML, features"] DB --> TR["training_runs
Log setiap training: AUC, akurasi, durasi, rollback"] DB --> SG["signals
Setiap sinyal yang dihasilkan: executed atau tidak"] DB --> MS["market_snapshots
Snapshot periodik: harga, regime, volatilitas"] DB --> BS["bot_status
Status bot: uptime, loop count, balance, risk mode"] DB --> DS["daily_summaries
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,
MarketSnapshotRepository"| DBC["DatabaseConnection (Singleton)"] AT2["AutoTrainer"] -->|"TrainingRepository"| DBC ML["main_live.py"] -->|"BotStatusRepository,
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.
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
risk_per_trade: 1.0% (SMALL) / 0.5% (MEDIUM)
max_daily_loss: 3.0% (SMALL) / 2.0% (MEDIUM)
max_total_loss: 10.0%
max_positions: 3 (SMALL) / 5 (MEDIUM)
min_lot: 0.01
max_lot: 0.05 (SMALL) / 2.0 (MEDIUM)
max_leverage: 1:100 (SMALL) / 1:30 (MEDIUM)"] TC --> SC["SMCConfig
swing_length: 5
fvg_min_gap_pips: 2.0
ob_lookback: 10
bos_close_break: true"] TC --> MLC2["MLConfig
confidence_threshold: 0.65
entry_confidence: 0.70
high_confidence: 0.75
very_high_confidence: 0.80
retrain_frequency_days: 7"] TC --> THC["ThresholdsConfig
ml_min_confidence: 0.65
ml_high_confidence: 0.75
trade_cooldown_seconds: 300
min_profit_to_secure: $15
good_profit: $25, great_profit: $40
flash_crash_threshold: 2.5%
sydney_lot_multiplier: 0.5"] TC --> RGC["RegimeConfig
n_regimes: 3
lookback: 500
retrain_frequency: 20"] ``` ### Capital Mode Auto-Detection ```mermaid flowchart TD BAL{"Balance?"} BAL -->|"le $10,000"| SMALL["SMALL MODE
Risk: 1% per trade ($50 pada $5K)
Daily limit: 3% ($150)
Lot: 0.01-0.05
Leverage: 1:100
Timeframe: M15
Max posisi: 3"] BAL -->|"> $10,000"| MEDIUM["MEDIUM MODE
Risk: 0.5% per trade
Daily limit: 2%
Lot: 0.01-2.0
Leverage: 1:30
Timeframe: H1
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
BLOCKED - Likuiditas rendah"] RO["04:00-06:00 ROLLOVER
BLOCKED - Spread melebar"] SY["06:00-07:00 Sydney
0.5x - Pasar baru buka"] TK["07:00-13:00 Tokyo+Sydney
0.7x - Asia aktif"] TA["13:00-15:00 Tokyo akhir
0.7x - Transisi"] LD["15:00-20:00 London
1.0x - Volatilitas naik"] GT["20:00-23:59 GOLDEN TIME
1.2x - London+NY overlap"] WR["Jumat ge 23:00 WEEKEND RISK
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
except ConnectionError: reconnect()
except Exception: Log error, lanjut loop berikutnya
Bot TIDAK crash dari error tunggal"] end subgraph LV2["LEVEL 2: MT5 Auto-Reconnect"] LV2D["MT5 putus?
Attempt 1: reconnect (tunggu 2 detik)
Attempt 2: reconnect (tunggu 4 detik)
Attempt 3: reconnect (tunggu 8 detik)
Cooldown 60 detik, Retry cycle (max 5/cooldown)
Selama disconnected: monitoring PAUSE,
entry DITUNDA, posisi dilindungi broker SL"] end subgraph LV3["LEVEL 3: Database Graceful Degradation"] LV3D["PostgreSQL down?
Switch ke CSV-only mode
Semua data tetap dicatat
Trading tetap berjalan normal
Retry DB connection periodik"] end subgraph LV4["LEVEL 4: Telegram Failure"] LV4D["Telegram API error?
Log error secara silent
Trading tetap jalan 100%
Retry di notifikasi berikutnya"] end subgraph LV5["LEVEL 5: Model File Missing"] LV5D[".pkl file tidak ditemukan?
Log warning
Skip prediksi (ML/HMM)
Trading bisa jalan tanpa ML (SMC only)
Trigger: jalankan train_models.py"] end subgraph LV6["LEVEL 6: Flash Crash Protection"] LV6D["Harga bergerak > 2.5% dalam 1 menit?
EMERGENCY: Close ALL positions
Circuit breaker AKTIF
Kirim alert KRITIS via Telegram
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. ```