- 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>
12 KiB
Main Live — Orchestrator Utama
File:
main_live.pyClass:TradingBotRuntime: Async event loop (asyncio) Mode: Candle-based (analisis penuh hanya saat candle baru M15) Target: < 0.05 detik per iterasi analisis
Apa Itu Main Live?
Main Live adalah otak pusat yang mengorkestrasi semua komponen bot. Menjalankan loop candle-based — analisis penuh hanya dijalankan saat candle M15 baru terbentuk, dengan pengecekan posisi setiap 10 detik di antara candle. Mengkoordinasikan 15+ komponen dari data fetching hingga order execution.
Analogi: Main Live seperti konduktor orkestra — tidak memainkan alat musik sendiri, tapi mengarahkan semua pemain (komponen) agar bermain harmonis pada waktu yang tepat.
Diagram Alur Main Loop
flowchart TD
A[STARTUP] --> B{Candle Baru?}
B -- Ya --> C["Phase 1: DATA\nFetch 200 bar, Feature Eng,\nSMC, HMM, XGBoost"]
B -- Tidak --> G["Position Check Only\n(setiap ~10 detik)"]
G --> H[Sleep ~5 detik]
C --> D["Phase 2: MONITORING\nCek posisi terbuka,\n12 kondisi exit"]
D --> E["Phase 3: ENTRY\n14 Filter harus PASS,\nExecute trade"]
E --> F["Phase 4: PERIODIK\nAuto-retrain, Market update,\nHourly analysis, Daily summary"]
F --> H
H --> B
style A fill:#2d6a4f,color:#fff
style C fill:#1b4332,color:#fff
style D fill:#40916c,color:#fff
style E fill:#52b788,color:#000
style F fill:#74c69d,color:#000
style G fill:#b7e4c7,color:#000
style H fill:#d8f3dc,color:#000
Diagram Startup / Shutdown
flowchart LR
subgraph STARTUP
direction TB
S1[Load .env Config] --> S2[Connect MT5\nmax 3 retry]
S2 --> S3[Load HMM Model]
S3 --> S4[Load XGBoost Model]
S4 --> S5[Init SmartRiskManager]
S5 --> S6[Init SessionFilter\nWIB timezone]
S6 --> S7[Init Telegram + Logger]
S7 --> S8[Init AutoTrainer]
S8 --> S9["Telegram: BOT STARTED"]
S9 --> S10[Mulai Main Loop]
end
subgraph SHUTDOWN
direction TB
X1[Signal SIGINT/SIGTERM] --> X2[Hentikan Loop]
X2 --> X3["Telegram: BOT STOPPED\n(balance, trades, uptime)"]
X3 --> X4[Disconnect MT5]
X4 --> X5[Close DB Connections]
X5 --> X6[Exit]
end
STARTUP -.->|"Runtime\n(loop berjalan)"| SHUTDOWN
style S1 fill:#2d6a4f,color:#fff
style S10 fill:#52b788,color:#000
style X1 fill:#9d0208,color:#fff
style X6 fill:#d00000,color:#fff
Komponen yang Dimuat
class TradingBot:
def __init__(self):
# Koneksi
self.mt5 = MT5Connector(...) # Jembatan ke broker
self.telegram = TelegramNotifier(...) # Notifikasi
# AI Models
self.ml_model = TradingModel(...) # XGBoost predictor
self.regime_detector = MarketRegimeDetector(...) # HMM regime
self.smc = SMCAnalyzer(...) # Smart Money Concepts
# Analisis
self.features = FeatureEngineer() # 40+ fitur
self.dynamic_confidence = DynamicConfidenceManager(...) # Threshold
self.session_filter = SessionFilter(...) # Waktu trading
# self.news_agent = NewsAgent(...) # NONAKTIF (line 64)
# -> Dikomentari karena backtest membuktikan
# News Agent merugikan $178 profit.
# ML model sudah menangani volatilitas.
# Risiko
self.smart_risk = SmartRiskManager(...) # Risk management
self.risk_engine = RiskEngine(...) # Kelly criterion
self.position_manager = SmartPositionManager(...) # Position mgmt
# Logging & Training
self.trade_logger = TradeLogger(...) # Pencatat trade
self.auto_trainer = AutoTrainer(...) # Retraining otomatis
# State
self.flash_crash_detector = FlashCrashDetector(...) # Proteksi
Catatan:
NewsAgentNONAKTIF — import dikomentari dimain_live.pyline 64 (# DISABLED). Backtest membuktikan News Agent justru mengurangi profit sebesar $178 karena ML model sudah cukup menangani volatilitas pasar. Variabelself.news_agentdi-setNone(line 165).
Main Loop (Candle-Based)
STARTUP:
Load models -> Connect MT5 -> Send Telegram startup
|
v
LOOP UTAMA (cek setiap ~5 detik, analisis pada candle baru):
|
+-- Fetch 2 bar terakhir -> cek apakah candle baru terbentuk
|
|===[CANDLE BARU? YA -> FULL ANALYSIS]=================
|
| |===[PHASE 1: DATA]================================
| |
| +-- Fetch 200 bar M15 XAUUSD dari MT5
| +-- Feature Engineering (40+ fitur)
| +-- SMC Analysis (Swing, FVG, OB, BOS, CHoCH)
| +-- HMM Regime Detection
| +-- XGBoost Prediction
| |
| |===[PHASE 2: MONITORING]===========================
| |
| +-- Cek posisi terbuka
| | +-- Untuk setiap posisi:
| | +-- Update profit & momentum
| | +-- 12 kondisi exit (smart_risk.evaluate_position)
| | +-- Jika should_close -> tutup -> log -> Telegram
| |
| +-- Position Manager (trailing SL, breakeven)
| | +-- Smart Market Close Handler
| |
| |===[PHASE 3: ENTRY]================================
| |
| +-- [1] Flash Crash Guard -> tidak ada crash?
| +-- [2] Regime Filter -> bukan SLEEP / CRISIS?
| +-- [3] Risk Check -> equity & drawdown aman?
| +-- [4] Session Filter -> boleh trading (WIB)?
| +-- [5] SMC Signal -> ada setup?
| +-- [6] Signal Combination -> sinyal valid (quality != AVOID)?
| +-- [7] H1 Bias (#31B) -> H1 EMA20 selaras?
| +-- [8] Time Filter (#34A) -> bukan jam 9/21 WIB?
| +-- [9] Trade Cooldown -> cukup jeda sejak trade terakhir?
| +-- [10] Smart Risk Gate -> mode bukan STOPPED?
| +-- [11] Lot Size -> > 0 setelah kalkulasi?
| +-- [12] Position Limit -> < 2 posisi terbuka?
| +-- [13] Slippage Validation -> harga aktual vs expected
| +-- [14] Partial Fill Check -> volume aktual vs requested
| +-- SEMUA PASS -> Execute trade
| +-- Register position (harga & volume AKTUAL) -> Log -> Telegram
| |
| |===[PHASE 4: PERIODIK]=============================
| |
| +-- Setiap 20 candle (~5 jam M15): Cek auto-retrain
| +-- Setiap 30 menit: Market update (Telegram)
| +-- Setiap 1 jam: Hourly analysis (Telegram)
| +-- Pergantian hari: Daily summary + reset
|
|===[CANDLE BARU? TIDAK -> POSITION CHECK ONLY]========
|
+-- Setiap 10 detik: cek posisi terbuka saja
| +-- Fetch 50 bar (minimal data)
| +-- Hitung fitur untuk ML check
| +-- Evaluasi exit conditions per posisi
|
v
Tunggu ~5 detik -> Loop lagi
Detail 14 Entry Filter
| # | Filter | Deskripsi | Sumber |
|---|---|---|---|
| 1 | Flash Crash Guard | Deteksi pergerakan harga ekstrem (>X%) dalam 5 bar terakhir | FlashCrashDetector |
| 2 | Regime Filter | Blok entry jika HMM regime = SLEEP atau CRISIS | regime_detector |
| 3 | Risk Check | Validasi equity, drawdown, dan balance aman | risk_engine |
| 4 | Session Filter | Hanya trading di sesi aktif (Sydney/London/NY, WIB) | session_filter |
| 5 | SMC Signal | Harus ada setup SMC (Order Block, FVG, BOS, CHoCH) | smc.generate_signal() |
| 6 | Signal Combination | Gabung SMC + ML, blok jika market quality AVOID | _combine_signals() |
| 7 | H1 Bias (#31B) | BUY hanya jika H1 BULLISH, SELL hanya jika H1 BEARISH | _get_h1_bias() |
| 8 | Time Filter (#34A) | Skip jam 9 dan 21 WIB (likuiditas rendah / whipsaw) | Hardcoded WIB check |
| 9 | Trade Cooldown | Jeda minimum antar trade (mencegah overtrade) | _last_trade_time |
| 10 | Smart Risk Gate | Cek mode risk (NORMAL/CAUTIOUS/STOPPED) | smart_risk |
| 11 | Lot Size > 0 | Pastikan kalkulasi lot menghasilkan size > 0 | smart_risk.calculate_lot_size() |
| 12 | Position Limit | Maksimal 2 posisi terbuka bersamaan | smart_risk.can_open_position() |
| 13 | Slippage Validation | Cek harga eksekusi aktual vs harga yang diharapkan | Post-execution check |
| 14 | Partial Fill Check | Cek volume aktual yang terisi vs volume yang diminta | Post-execution check |
Startup Sequence
1. Load konfigurasi dari .env
2. Connect ke MT5 (max 3 retry)
3. Load model HMM dari models/hmm_regime.pkl
4. Load model XGBoost dari models/xgboost_model.pkl
5. Initialize SmartRiskManager (set balance, limits)
6. Initialize SessionFilter (WIB timezone)
7. Initialize TelegramNotifier
8. Initialize TradeLogger
9. Initialize AutoTrainer
10. Send Telegram: "BOT STARTED" (config, balance, risk settings)
11. Mulai main loop
Note: NewsAgent tidak diinisialisasi saat startup — import dan inisialisasi dikomentari sejak backtest membuktikan kerugian $178.
Shutdown Sequence
1. Signal SIGINT/SIGTERM diterima
2. Hentikan loop utama
3. Kirim Telegram: "BOT STOPPED" (balance, trades, uptime)
4. Disconnect MT5
5. Close database connections
6. Exit
Error Handling (Fault Tolerance)
Setiap iterasi loop dibungkus try-except:
try:
# Fetch data, analyze, trade
except ConnectionError:
# MT5 disconnected -> reconnect()
except Exception as e:
# Log error -> lanjut loop berikutnya
# Bot TIDAK crash dari error tunggal
Prinsip: NEVER STOP TRADING karena error non-kritis
Bot dirancang dengan prinsip fault tolerance — satu error tidak menghentikan seluruh sistem. Setiap iterasi loop dibungkus try-except sehingga error pada satu candle tidak mempengaruhi candle berikutnya. Koneksi MT5 yang putus akan otomatis di-reconnect.
Timer Periodik
| Event | Interval | Aksi |
|---|---|---|
| Full analysis + entry | Setiap candle baru M15 | Saat candle terbentuk |
| Position monitoring | ~10 detik | Di antara candle |
| Performance logging | 4 candle (~1 jam) | loop_count % 4 |
| Auto-retrain check | 20 candle (~5 jam) | loop_count % 20 |
| Market update Telegram | 30 menit | Timer |
| Hourly analysis Telegram | 1 jam | Timer |
| Daily summary | Pergantian hari | Date check |
Performa Target
Target: < 0.05 detik per iterasi analisis (50ms)
Full Analysis (saat candle baru):
+-- MT5 data fetch: ~10ms (200 bar)
+-- Feature engineering: ~5ms (Polars, vectorized)
+-- SMC analysis: ~5ms (Polars native)
+-- HMM predict: ~2ms
+-- XGBoost predict: ~3ms
+-- Position monitoring: ~5ms
+-- Entry logic: ~5ms
+-- Overhead: ~15ms
------
~50ms total
Position Check Only (di antara candle):
+-- MT5 data fetch: ~5ms (50 bar saja)
+-- Feature engineering: ~3ms
+-- ML prediction: ~3ms
+-- Position evaluation: ~5ms
+-- Overhead: ~5ms
------
~21ms total
Hubungan Semua Komponen
flowchart TD
subgraph BOT["main_live.py — TradingBot"]
direction TB
MT5["MT5 Connector"] --> FE["Feature Eng"]
FE --> SMC["SMC Analyzer"]
SMC --> HMM["HMM Detector"]
HMM --> DC["Dynamic Confidence"]
DC --> XGB["XGBoost Model"]
XGB --> ENTRY["Entry Logic (14 Filters)<br/>Flash, Regime, Risk, Session,<br/>SMC, H1 Bias, Time, Cooldown,<br/>Smart Risk, Lot, Pos Limit"]
ENTRY --> RE["Risk Engine"]
ENTRY --> SRM["Smart Risk Mgr"]
RE --> EXEC["Execute Order<br/>(BUY/SELL)"]
SRM --> EXEC
EXEC --> MT5
EXEC --> PM["Position Manager"]
EXEC --> TL["Trade Logger<br/>(DB + CSV)"]
EXEC --> TG["Telegram Notifier"]
PM ~~~ AT["Auto Trainer<br/>(retraining)"]
TG ~~~ NA["News Agent<br/>(NONAKTIF)"]
AT ~~~ SF["Session Filter<br/>(waktu trading)"]
end