2026-02-06 09:17:20 +07:00
# Main Live — Orchestrator Utama
> **File:** `main_live.py`
> **Class:** `TradingBot`
> **Runtime:** Async event loop (asyncio)
2026-02-06 09:44:49 +07:00
> **Mode:** Candle-based (analisis penuh hanya saat candle baru M15)
> **Target:** < 0.05 detik per iterasi analisis
2026-02-06 09:17:20 +07:00
---
## Apa Itu Main Live?
2026-02-06 09:44:49 +07:00
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.
2026-02-06 09:17:20 +07:00
**Analogi:** Main Live seperti **konduktor orkestra** — tidak memainkan alat musik sendiri, tapi mengarahkan semua pemain (komponen) agar bermain harmonis pada waktu yang tepat.
---
## Komponen yang Dimuat
```python
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 ( ... ) # Monitor berita
# 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
```
---
2026-02-06 09:44:49 +07:00
## Main Loop (Candle-Based)
2026-02-06 09:17:20 +07:00
```
STARTUP:
Load models → Connect MT5 → Send Telegram startup
|
v
2026-02-06 09:44:49 +07:00
LOOP UTAMA (cek setiap ~5 detik, analisis pada candle baru):
2026-02-06 09:17:20 +07:00
|
2026-02-06 09:44:49 +07:00
├── Fetch 2 bar terakhir → cek apakah candle baru terbentuk
2026-02-06 09:17:20 +07:00
|
2026-02-06 09:44:49 +07:00
|===[CANDLE BARU? YA → FULL ANALYSIS]=================
2026-02-06 09:17:20 +07:00
|
2026-02-06 09:44:49 +07:00
| |===[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
| │ ├── 10 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] Session Filter → boleh trading?
| ├── [2] Risk Mode → bukan STOPPED?
| ├── [3] SMC Signal → ada setup?
| ├── [4] ML Confidence → >= threshold?
| ├── [5] ML Agreement → tidak strongly disagree?
| ├── [6] Dynamic Quality → bukan AVOID?
| ├── [7] Confirmation → 2x candle berturut?
2026-02-06 10:06:43 +07:00
| ├── [8] Pullback Filter → momentum selaras? (v5: ATR-based)
2026-02-06 09:44:49 +07:00
| ├── [9] Cooldown → 5 menit sejak trade terakhir?
| ├── [10] Position Limit → < 2 posisi?
| ├── [11] Lot Size → > 0?
2026-02-06 10:06:43 +07:00
| ├── SEMUA PASS → Execute trade
| ├── Slippage validation (v5: cek harga aktual vs expected)
| ├── Partial fill check (v5: cek volume aktual vs requested)
| └── Register position (harga & volume AKTUAL) → Log → Telegram
2026-02-06 09:44:49 +07:00
| |
| |===[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
| └── News Agent: Monitor (non-blocking)
2026-02-06 09:17:20 +07:00
|
2026-02-06 09:44:49 +07:00
|===[CANDLE BARU? TIDAK → POSITION CHECK ONLY]========
2026-02-06 09:17:20 +07:00
|
2026-02-06 09:44:49 +07:00
├── Setiap 10 detik: cek posisi terbuka saja
│ ├── Fetch 50 bar (minimal data)
│ ├── Hitung fitur untuk ML check
│ └── Evaluasi exit conditions per posisi
2026-02-06 09:17:20 +07:00
|
v
2026-02-06 09:44:49 +07:00
Tunggu ~5 detik → Loop lagi
2026-02-06 09:17:20 +07:00
```
---
## 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
```
---
## 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
```
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
```
---
## Timer Periodik
| Event | Interval | Aksi |
|-------|----------|------|
2026-02-06 09:44:49 +07:00
| 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` |
2026-02-06 09:17:20 +07:00
| Market update Telegram | 30 menit | Timer |
| Hourly analysis Telegram | 1 jam | Timer |
| Daily summary | Pergantian hari | Date check |
---
## Performa Target
```
2026-02-06 09:44:49 +07:00
Target: < 0.05 detik per iterasi analisis (50ms)
2026-02-06 09:17:20 +07:00
2026-02-06 09:44:49 +07:00
Full Analysis (saat candle baru):
├── MT5 data fetch: ~10ms (200 bar)
2026-02-06 09:17:20 +07:00
├── 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
2026-02-06 09:44:49 +07:00
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
2026-02-06 09:17:20 +07:00
```
---
## Hubungan Semua Komponen
```
┌─────────────────────────────────────────────────────────┐
│ main_live.py │
│ (TradingBot) │
│ │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ ┌──────────┐ │
│ │ MT5 │ │ Feature │ │ SMC │ │ HMM │ │
│ │Connector│→ │ Eng │→ │ Analyzer │→ │ Detector │ │
│ └─────────┘ └─────────┘ └──────────┘ └──────────┘ │
│ ↑ ↓ ↓ │
│ │ ┌──────────────────────┐ │
│ │ │ Dynamic Confidence │ │
│ │ └──────────────────────┘ │
│ │ ↓ │
│ │ ┌──────────────────┐ │
│ │ │ XGBoost Model │ │
│ │ └──────────────────┘ │
│ │ ↓ │
│ │ ┌─────────────────────────────────┐ │
│ │ │ Entry Logic (11 Filters) │ │
│ │ │ Session, Risk, SMC, ML, ... │ │
│ │ └─────────────────────────────────┘ │
│ │ ↓ │
│ │ ┌────────────┐ ┌───────────────┐ │
│ ├────│ Risk Engine│ │Smart Risk Mgr │ │
│ │ └────────────┘ └───────────────┘ │
│ │ ↓ │
│ │←── Execute Order (BUY/SELL) │
│ │ ↓ │
│ │ ┌────────────┐ ┌───────────────┐ │
│ │ │ Position │ │ Trade Logger │ │
│ │ │ Manager │ │ (DB + CSV) │ │
│ │ └────────────┘ └───────────────┘ │
│ │ ↓ │
│ │ ┌────────────┐ ┌───────────────┐ │
│ │ │ Telegram │ │ Auto Trainer │ │
│ │ │ Notifier │ │ (retraining) │ │
│ │ └────────────┘ └───────────────┘ │
│ │ │
│ │ ┌────────────┐ ┌───────────────┐ │
│ │ │News Agent │ │Session Filter │ │
│ │ │(monitor) │ │(waktu trading)│ │
│ │ └────────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────┘
```