chore: add training data, backups, and research docs

- Add model backups from training sessions
- Add training data parquet file
- Add risk state persistence file
- Add research documents (Gemini analysis)
- Update architecture docs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
GifariKemal
2026-02-06 09:44:49 +07:00
co-authored by Claude Opus 4.5
parent 7eff3f1a2b
commit 092926415c
19 changed files with 1374 additions and 145 deletions
+41 -24
View File
@@ -98,7 +98,7 @@ OTAK 3: Hidden Markov Model (HMM)
┌─────────────────────────────────────────────────────────────────────────┐
│ MAIN LIVE (Orchestrator) │
│ main_live.py — TradingBot │
Loop setiap ~1 detik
Candle-based (M15) + position check ~10 detik │
│ │
│ ┌─────────────── PHASE 1: DATA ──────────────────────────────────┐ │
│ │ │ │
@@ -665,10 +665,10 @@ SINYAL SMC + ML MASUK
## 6. Alur Exit: 10 Kondisi
Setiap posisi terbuka dievaluasi **setiap 1 detik** terhadap 10 kondisi exit:
Setiap posisi terbuka dievaluasi **setiap ~10 detik** (di antara candle) atau **setiap candle baru** (full analysis) terhadap 10 kondisi exit:
```
POSISI TERBUKA (dicek setiap 1 detik)
POSISI TERBUKA (dicek setiap ~10 detik)
│ Update: profit, momentum, peak, durasi
@@ -687,9 +687,12 @@ POSISI TERBUKA (dicek setiap 1 detik)
└──────────────────────────────────────────────────────────┘
│ tidak trigger
┌─ KONDISI 3: Golden Time Hold ────────────────────────────┐
Sedang di Golden Time + profit masih naik?
│ → HOLD (biarkan profit berjalan)
┌─ KONDISI 3: Early Cut (v4 — Smart Hold DIHAPUS) ────────┐
Loss >= 30% max ($15) DAN momentum < -30?
│ → TUTUP CEPAT (early cut, jangan tunggu recovery)
│ │
│ v4: "Smart Hold" dihapus — tidak ada lagi hold losers │
│ menunggu golden time atau sesi London. │
└──────────────────────────────────────────────────────────┘
│ tidak trigger
@@ -939,10 +942,10 @@ Langkah 8: Session multiplier
│ └── confidence: 0.0 - 1.0 (prob of winning side) │
│ │
│ Validation: │
│ ├── Train/Test: 70% / 30%
│ ├── Train/Test: 70% / 30% (50-bar gap, anti leakage)
│ ├── Walk-forward: 500 train / 50 test / 50 step │
│ ├── Target AUC: > 0.65 │
│ ├── Rollback AUC: < 0.52
│ ├── Rollback AUC: < 0.60 (v4: dinaikkan dari 0.52)
│ └── Overfitting ratio: train_AUC/test_AUC < 1.15 │
└──────────────────────────────────────────────────────────┘
```
@@ -1180,7 +1183,7 @@ SELL Signal:
╔═══════════════════════════════════════════════════════════════╗
║ TAHAP 6: ACTIVE MONITORING (setiap 1 detik)
║ TAHAP 6: ACTIVE MONITORING (setiap ~10 detik + candle baru)
║ ║
║ ┌── Update profit/loss real-time ║
║ ├── Update peak profit (tertinggi yang pernah dicapai) ║
@@ -1190,7 +1193,7 @@ SELL Signal:
║ ├── Cek Position Manager (trailing, breakeven) ║
║ └── Cek Market Close Handler (dekat close?) ║
║ ║
║ Setiap detik, posisi dievaluasi:
║ Setiap ~10 detik (atau candle baru), posisi dievaluasi: ║
║ → HOLD (lanjut) ║
║ → CLOSE (tutup dengan alasan spesifik) ║
╚═══════════════════════════════════════════════════════════════╝
@@ -1255,7 +1258,7 @@ SELL Signal:
│ 2. Fetch data baru dari MT5 │
│ 3. Feature Engineering + SMC │
│ 4. Train HMM baru + XGBoost baru │
│ 5. Validasi: test AUC ≥ 0.52?
│ 5. Validasi: test AUC ≥ 0.60? (v4: dinaikkan dari 0.52)
│ ├── Ya → Save model baru, reload di memory │
│ └── Tidak → ROLLBACK ke model sebelumnya │
│ 6. Log hasil ke PostgreSQL │
@@ -1264,7 +1267,7 @@ SELL Signal:
│ Safety: │
│ ├── Max 5 backup disimpan (rotasi) │
│ ├── Min 20 jam antar retrain (cooldown) │
│ ├── Auto-rollback jika AUC < 0.52
│ ├── Auto-rollback jika AUC < 0.60 (v4 threshold)
│ └── Model lama selalu tersedia untuk rollback │
└──────────────────────────────────────────────────────────────┘
```
@@ -1458,8 +1461,9 @@ Balance > $10,000 → MEDIUM MODE
### Main Loop Breakdown
```
Target: < 50ms per loop (0.05 detik)
Target: < 50ms per iterasi analisis
FULL ANALYSIS (saat candle baru M15):
┌────────────────────────────────────────────────────────────┐
│ Komponen │ Waktu │ Keterangan │
├────────────────────────┼──────────┼────────────────────────┤
@@ -1472,7 +1476,20 @@ Target: < 50ms per loop (0.05 detik)
│ Entry logic │ ~5ms │ 11 filter check │
│ Overhead │ ~15ms │ Logging, state update │
├────────────────────────┼──────────┼────────────────────────┤
│ TOTAL │ ~50ms │ 20x per detik tersedia
│ 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 │ 10 kondisi exit │
│ Overhead │ ~5ms │ Logging │
├────────────────────────┼──────────┼────────────────────────┤
│ TOTAL │ ~21ms │ │
└────────────────────────────────────────────────────────────┘
```
@@ -1480,15 +1497,15 @@ Target: < 50ms per loop (0.05 detik)
```
┌──────────────────────────────────────────────────────────┐
│ Event │ Interval │ Cara Trigger
├────────────────────────┼─────────────────────────────────┤
Data + Analysis │ ~1 detik Setiap loop
│ Position monitoring │ ~1 detik │ Setiap loop
News monitoring log │ 5 menit │ loop_count % 300
│ Auto-retrain check │ 5 menit │ loop_count % 300
│ Market update Telegram │ 30 menit │ Timer
│ Hourly analysis │ 1 jam │ Timer
│ Daily summary + reset │ Ganti hari │ Date check
│ Event │ Interval │ Cara Trigger │
├────────────────────────┼─────────────────────────────────┤
Full analysis + entry │ Candle baru M15Deteksi 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 │
└──────────────────────────────────────────────────────────┘
```
@@ -1668,7 +1685,7 @@ Smart Automatic Trading BOT + AI/
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 setiap ~1 detik (~50ms per iterasi), mengevaluasi 11 filter entry dan 10 kondisi exit secara real-time, dengan notifikasi Telegram untuk setiap kejadian penting.
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 11 filter entry dan 10 kondisi exit secara real-time, dengan notifikasi Telegram untuk setiap kejadian penting.
```
TARGET: Trading XAUUSD M15 yang KONSISTEN dan AMAN
@@ -138,6 +138,10 @@ Output: PredictionResult
3. SMC analysis (swing, FVG, OB, BOS, CHoCH)
4. Buat target: 1 jika close[t+1] > close[t], else 0
5. Split: 70% train, 30% test
PENTING: 50-bar gap antara train & test set (v4)
→ Mencegah temporal leakage (autocorrelation antar bar berdekatan)
→ Train: bar 0 sampai split_point
→ Test: bar split_point + 50 sampai akhir
6. Train XGBoost 50 round + early stopping (patience=5)
7. Evaluasi: Train AUC vs Test AUC
8. Simpan model + feature names ke .pkl
@@ -204,19 +208,24 @@ Menunjukkan fitur mana yang paling berpengaruh dalam keputusan model.
|-----|-------------|
| 0.50 | Sama dengan tebak acak |
| 0.55 | Sedikit lebih baik dari acak |
| 0.60 | Cukup baik untuk trading |
| < 0.60 | **ROLLBACK** — terlalu rendah untuk trading (v4 threshold) |
| 0.60-0.65 | Minimum acceptable, warning |
| 0.65+ | Cukup baik untuk trading |
| 0.70+ | Sangat baik |
**Rollback threshold:** Jika test AUC < 0.52, model otomatis rollback ke versi sebelumnya.
**Rollback threshold:** Jika test AUC < 0.60, model otomatis rollback ke versi sebelumnya. (v4: dinaikkan dari 0.52 karena 0.52 hampir sama dengan tebak acak)
---
## Auto-Retraining
- **Jadwal:** Harian pukul 05:00 WIB
- **Data:** 5,000 bar terakhir
- **Data:** 8,000 bar (daily) / 15,000 bar (weekend deep training)
- **Cek retrain:** Setiap 20 candle M15 (~5 jam) — candle-based, bukan time-based
- **Proses:** Backup lama -> retrain -> validasi AUC -> simpan/rollback
- **Rollback:** AUC < 0.60 → otomatis rollback (v4: dinaikkan dari 0.52)
- **Minimum interval:** 20 jam antar retrain (cegah overfitting)
- **Train/test gap:** 50 bar antara train dan test set (anti temporal leakage)
---
+66 -41
View File
@@ -35,8 +35,16 @@ Smart Money Concepts adalah metode analisis berdasarkan **cara institusi besar (
```
Window: 2 x swing_length + 1 = 11 candle (default swing_length=5)
Swing High: High saat ini = Maximum dalam 11 candle
Swing Low: Low saat ini = Minimum dalam 11 candle
Deteksi TANPA LOOKAHEAD (no future data):
- Rolling max/min menggunakan center=False (hanya data masa lalu)
- Swing point dikonfirmasi swing_length bar SETELAH terjadi
- Menggunakan shift(swing_length) untuk melihat "center" point
Swing High: High di center point = Maximum dalam window 11 bar ke belakang
Swing Low: Low di center point = Minimum dalam window 11 bar ke belakang
Catatan: Deteksi terlambat swing_length bar (5 bar), tapi
TIDAK menggunakan data masa depan (zero lookahead).
```
### Visualisasi
@@ -69,23 +77,28 @@ Swing Low: Low saat ini = Minimum dalam 11 candle
### Algoritma
```
TANPA LOOKAHEAD — Deteksi pada candle KETIGA (setelah pola selesai):
Bullish FVG: Bearish FVG:
Candle T-2: ████ high Candle T-2: ████ low
| |
| GAP (celah) | GAP (celah)
Candle T-1: (middle) Candle T-1: (middle)
| |
Candle T+1: ████ low Candle T+1: ████ high
Candle T: ████ low (SAAT INI) Candle T: ████ high (SAAT INI)
Syarat Bullish: high[T-2] < low[T+1]
Syarat Bearish: low[T-2] > high[T+1]
Syarat Bullish: high[T-2] < low[T] (gap antara candle pertama & ketiga)
Syarat Bearish: low[T-2] > high[T] (gap antara candle pertama & ketiga)
Catatan: TIDAK menggunakan shift(-1) / data masa depan.
FVG dideteksi pada candle saat ini (T) setelah pola terkonfirmasi.
```
### Zona FVG
```
Bullish FVG Zone:
Top = low[T+1] (batas atas gap)
Bottom = high[T-2] (batas bawah gap)
Top = low[T] (low candle saat ini = batas atas gap)
Bottom = high[T-2] (high candle pertama = batas bawah gap)
Mid = (top + bottom) / 2 (50% retracement)
```
@@ -108,19 +121,23 @@ Bullish FVG Zone:
### Algoritma
```
TANPA LOOKAHEAD — Validasi menggunakan candle SAAT INI:
Bullish OB:
1. Temukan swing low
2. Lihat 10 candle ke belakang
3. Cari candle bearish terakhir (close < open)
4. Jika candle berikutnya close di atas high candle tersebut:
4. Jika candle SAAT INI close di atas high candle tersebut:
-> Candle itu = Bullish Order Block
(validasi di bar saat ini, BUKAN bar berikutnya)
Bearish OB:
1. Temukan swing high
2. Lihat 10 candle ke belakang
3. Cari candle bullish terakhir (close > open)
4. Jika candle berikutnya close di bawah low candle tersebut:
4. Jika candle SAAT INI close di bawah low candle tersebut:
-> Candle itu = Bearish Order Block
(validasi di bar saat ini, BUKAN bar berikutnya)
```
### Visualisasi
@@ -271,18 +288,19 @@ Buy Side Liquidity (BSL): Sell Side Liquidity (SSL):
## Signal Generation
### ATR-Based Dynamic SL/TP (v3 Update)
### ATR-Based Dynamic SL/TP (v4 Update)
Sebelum menghitung SL dan TP, sistem mengambil nilai ATR untuk kalkulasi dinamis:
```python
# Line 631-634
atr = latest["atr"] # Dari Feature Engineering
min_sl_distance = 1.5 * atr # Minimum jarak SL = 1.5 ATR
max_tp_distance = 4.0 * atr # Maximum jarak TP = 4.0 ATR
# Fallback jika ATR tidak tersedia:
atr = current_close * 0.01 # 1% dari harga
# Sanity check ATR (v4: validasi ketat)
if atr is None or atr <= 0 or atr > current_close * 0.05:
atr = 12.0 # Default realistis untuk XAUUSD (~$12-15 tipikal)
min_sl_distance = 1.5 * atr # Minimum jarak SL = 1.5 ATR
min_rr_ratio = 2.0 # ENFORCED: Minimum Risk:Reward 1:2
```
### Kondisi Bullish Signal
@@ -291,18 +309,20 @@ atr = current_close * 0.01 # 1% dari harga
IF (market_structure == BULLISH ATAU ada BOS/CHoCH bullish)
AND (ada FVG bullish ATAU Order Block bullish):
Entry = FVG bottom atau OB bottom
Entry = current_close (v4: SELALU harga saat ini, bukan harga zone lama)
SL (v3 - ATR-based, lebih protektif):
SL (v4 - ATR-based, lebih protektif):
swing_sl = last_swing_low (jika ada & di bawah entry)
atr_sl = entry - 1.5 * ATR
SL = MIN(swing_sl, atr_sl) <- pilih yang LEBIH JAUH
IF entry - SL < min_sl_distance:
SL = entry - min_sl_distance <- enforce jarak minimum
TP (v3 - dibatasi realistis):
TP (v4 - ENFORCED minimum 1:2 RR):
risk = entry - SL
tp = entry + (risk * 2) <- minimum 2:1 RR
IF tp > entry + 4*ATR:
tp = entry + 4*ATR <- cap TP agar realistis
tp = entry + (risk * 2.0) <- TEPAT 2:1 R:R
IF actual_rr < 2.0:
-> SKIP sinyal (tidak valid) <- sinyal ditolak jika RR terlalu kecil
```
### Kondisi Bearish Signal
@@ -311,35 +331,40 @@ AND (ada FVG bullish ATAU Order Block bullish):
IF (market_structure == BEARISH ATAU ada BOS/CHoCH bearish)
AND (ada FVG bearish ATAU Order Block bearish):
Entry = FVG top atau OB top
Entry = current_close (v4: SELALU harga saat ini, bukan harga zone lama)
SL (v3 - ATR-based, lebih protektif):
SL (v4 - ATR-based, lebih protektif):
swing_sl = last_swing_high (jika ada & di atas entry)
atr_sl = entry + 1.5 * ATR
SL = MAX(swing_sl, atr_sl) <- pilih yang LEBIH JAUH
IF SL - entry < min_sl_distance:
SL = entry + min_sl_distance <- enforce jarak minimum
TP (v3 - dibatasi realistis):
TP (v4 - ENFORCED minimum 1:2 RR):
risk = SL - entry
tp = entry - (risk * 2) <- minimum 2:1 RR
IF tp < entry - 4*ATR:
tp = entry - 4*ATR <- cap TP agar realistis
tp = entry - (risk * 2.0) <- TEPAT 2:1 R:R
IF actual_rr < 2.0:
-> SKIP sinyal (tidak valid) <- sinyal ditolak jika RR terlalu kecil
```
### Perbandingan SL/TP Lama vs Baru
### Perbandingan Evolusi SL/TP
```
┌────────────┬─────────────────────────────────────────────────────────┐
│ Komponen │ Sebelum (v2) │ Sesudah (v3)
├────────────┼─────────────────────────────────────────────────────────┤
SL (BUY) │ swing_low atau │ MIN(swing_low, entry-1.5ATR)
│ │ entry * 0.995 (bisa dekat)│ <- selalu cukup jauh │
├────────────┼───────────────────────────┼──────────────────────────────┤
SL (SELL) │ swing_high atau │ MAX(swing_high, entry+1.5ATR)
│ │ entry * 1.005 (bisa dekat)│ <- selalu cukup jauh │
├────────────┼───────────────────────────┼──────────────────────────────┤
TPrisk * 2 │ MIN(risk*2, 4*ATR)
│ │ (bisa sangat jauh) │ <- dibatasi realistis │
└────────────┴───────────────────────────┴──────────────────────────────┘
┌────────────┬─────────────────────┬────────────────────────────────────────────────┐
│ Komponen │ v2 (lama) │ v3 │ v4 (sekarang)
├────────────┼─────────────────────┼────────────────────────────────────────────────┤
Entry │ Zone price (FVG/OB) │ Zone price (FVG/OB) │ SELALU current_close
├────────────┼─────────────────────┼──────────────────────┼──────────────────────────┤
│ SL (BUY) │ entry * 0.995 │ MIN(swing, 1.5ATR) │ MIN(swing, 1.5ATR) │
│ (bisa terlalu dekat)│ │ + enforce min distance
├────────────┼─────────────────────┼──────────────────────┼──────────────────────────┤
│ TP │ risk * 2 │ MIN(risk*2, 4*ATR) │ risk * 2.0 (ENFORCED) │
(tanpa batas) │ (dibatasi) │ SKIP jika RR < 2.0
├────────────┼─────────────────────┼──────────────────────┼──────────────────────────┤
│ ATR default│ close * 1% │ close * 1% │ $12 (realistis XAUUSD) │
├────────────┼─────────────────────┼──────────────────────┼──────────────────────────┤
│ Lookahead │ Ada (shift -1) │ Ada (shift -1) │ TIDAK ADA (zero future) │
└────────────┴─────────────────────┴──────────────────────┴──────────────────────────┘
```
### Sistem Confidence
+10 -4
View File
@@ -178,10 +178,16 @@ Setiap posisi terbuka dievaluasi setiap loop:
DAN loss >= 40% dari max ($20):
-> TUTUP (exit_reason: TREND_REVERSAL)
3. MAX LOSS CHECK (50% threshold)
3. EARLY CUT (v4 — Smart Hold DIHAPUS)
Jika loss >= 30% max ($15) DAN momentum < -30:
-> TUTUP CEPAT (early cut, jangan tunggu recovery)
v4: "Smart Hold" dihapus — tidak ada lagi hold losers
menunggu golden time atau sesi London.
MAX LOSS CHECK (50% threshold):
Jika loss >= $25 (50% dari $50 max):
Kecuali golden time DAN momentum > -40:
-> TUTUP (exit_reason: POSITION_LIMIT)
-> TUTUP (exit_reason: POSITION_LIMIT)
4. STALL DETECTION
Jika harga stall 10+ candle DAN loss >= $15:
@@ -355,7 +361,7 @@ check_new_day():
## Integrasi dalam Main Loop
```
Main Trading Loop (setiap 1 detik)
Main Trading Loop (candle-based + position check setiap ~10 detik)
|
v
1. check_new_day() <- Reset harian
+17 -15
View File
@@ -7,7 +7,7 @@
## Apa Itu Exit Trade?
Exit Trade adalah keseluruhan proses **monitoring posisi terbuka** dan **memutuskan kapan menutup**. Bot memeriksa setiap posisi terbuka **setiap 1 detik** dengan 10 kondisi exit berbeda.
Exit Trade adalah keseluruhan proses **monitoring posisi terbuka** dan **memutuskan kapan menutup**. Bot memeriksa setiap posisi terbuka **setiap ~10 detik** (di antara candle) atau **setiap candle baru** (full analysis) dengan 10 kondisi exit berbeda.
**Analogi:** Exit Trade seperti **pilot otomatis di pesawat** — terus monitor ketinggian (profit), cuaca (momentum), bahan bakar (waktu), dan bisa landing darurat kapan saja.
@@ -98,20 +98,22 @@ AND ML confidence >= 65% berlawanan arah:
---
### CHECK 3: Smart Hold for Golden Time
### CHECK 3: Early Cut (v4 — Smart Hold DIHAPUS)
```
Posisi sedang rugi tapi ada potensi recovery:
Posisi sedang rugi — potong cepat jika sinyal buruk:
IF profit < 0 DAN BUKAN golden time:
a) Loss >= 30% max DAN momentum < -30
-> TUTUP CEPAT (early cut)
IF profit < 0:
Loss >= 30% max ($15 dari $50) DAN momentum < -30
-> TUTUP CEPAT (early cut, jangan tunggu recovery)
b) Loss < 30% DAN golden_time <= 3 jam DAN momentum > -50
-> HOLD, tunggu recovery di golden time
c) Loss < 20% DAN jam 15:00-19:00 WIB (London) DAN momentum > -40
-> HOLD, sesi aktif masih bisa recovery
v4 PERUBAHAN: "Smart Hold" DIHAPUS
- SEBELUMNYA: Hold posisi rugi menunggu golden time (20:00-23:59)
- SEBELUMNYA: Hold posisi rugi kecil di sesi London (15:00-19:00)
- SEKARANG: Tidak ada lagi "hold losers hoping for recovery"
- ALASAN: Menahan posisi rugi menunggu sesi tertentu = perilaku
berbahaya (martingale mentality). Proper risk management:
ikuti aturan SL, jangan berharap recovery.
```
---
@@ -234,7 +236,7 @@ Tidak ada kondisi exit terpenuhi:
-> HOLD posisi
-> Log status: momentum, TP probability, ML signal
-> Evaluasi ulang di loop berikutnya (1 detik kemudian)
-> Evaluasi ulang di cek berikutnya (~10 detik atau candle baru)
```
---
@@ -292,7 +294,7 @@ if risk_result["total_limit_hit"]:
## Diagram Exit Flow
```
Setiap 1 detik, per posisi terbuka:
Setiap ~10 detik (atau candle baru), per posisi terbuka:
|
v
Update profit & momentum
@@ -304,8 +306,8 @@ Update profit & momentum
[2] Profit $5-$15? ----YES---> Reversal + momentum drop?
|NO -> Early exit
v
[3] Profit < 0? -------YES---> Golden time hold?
|NO Early cut if weak?
[3] Profit < 0? -------YES---> Loss>30% + momentum<-30?
|NO -> EARLY CUT
v
[4] ML Reversal 65%+? -YES---> Loss > 40%? -> TUTUP
|NO Else warning++
+10 -9
View File
@@ -90,7 +90,7 @@ AutoTrainer(
7. VALIDASI
├ Cek Train AUC & Test AUC
├ Test AUC < 0.52? → ROLLBACK ke model lama
├ Test AUC < 0.60? → ROLLBACK ke model lama (v4: dinaikkan dari 0.52)
├ Test AUC < 0.65? → WARNING (alert)
└ Test AUC >= 0.65? → SUCCESS
@@ -130,11 +130,11 @@ Cek Test AUC
|
├── AUC >= 0.65 ──> KEEP model baru ✅
|
├── AUC 0.52-0.65 ──> KEEP tapi WARNING ⚠️
├── AUC 0.60-0.65 ──> KEEP tapi WARNING ⚠️
| (akan trigger emergency retrain nanti)
|
└── AUC < 0.52 ──> ROLLBACK ke model lama 🔄
(copy dari backups/ ke models/)
└── AUC < 0.60 ──> ROLLBACK ke model lama 🔄
(v4: dinaikkan dari 0.52, karena 0.52 hampir = acak)
```
### Method Rollback
@@ -161,8 +161,8 @@ AUC (Area Under Curve) mengukur **seberapa baik model membedakan sinyal BUY vs S
|-----|------|------|
| 0.80+ | Sangat bagus | Model dalam kondisi prima |
| 0.65-0.80 | Bagus | Normal, lanjut trading |
| 0.52-0.65 | Kurang | Warning, pertimbangkan retrain |
| < 0.52 | Buruk | Rollback + retrain segera |
| 0.60-0.65 | Minimum | Warning, pertimbangkan retrain |
| < 0.60 | Buruk | **ROLLBACK** + retrain segera (v4 threshold) |
| 0.50 | Sama dengan tebak koin | Model tidak berguna |
### Auto-Retrain on Low AUC
@@ -219,9 +219,10 @@ data/retrain_history.txt
## Integrasi di Main Loop
```python
# main_live.py — dicek setiap 5 menit (300 loop)
# main_live.py — dicek setiap 20 candle M15 (~5 jam)
# v4: candle-based, bukan time-based (sebelumnya: loop_count % 300)
if loop_count % 300 == 0:
if candle_count % 20 == 0: # Setiap 20 candle baru
should_train, reason = auto_trainer.should_retrain()
if should_train:
@@ -288,7 +289,7 @@ if loop_count % 300 == 0:
-> Bisa rollback kapan saja
4. AUTO-ROLLBACK
-> AUC < 0.52? Otomatis rollback
-> AUC < 0.60? Otomatis rollback (v4: dinaikkan dari 0.52)
-> Model buruk tidak akan dipakai
5. CLEANUP BACKUP
+70 -49
View File
@@ -3,13 +3,14 @@
> **File:** `main_live.py`
> **Class:** `TradingBot`
> **Runtime:** Async event loop (asyncio)
> **Target:** < 0.05 detik per loop
> **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 utama setiap ~1 detik, mengkoordinasikan 15+ komponen dari data fetching hingga order execution.
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.
@@ -50,59 +51,70 @@ class TradingBot:
---
## Main Loop (Setiap ~1 Detik)
## Main Loop (Candle-Based)
```
STARTUP:
Load models → Connect MT5 → Send Telegram startup
|
v
LOOP UTAMA (setiap ~1 detik):
LOOP UTAMA (cek setiap ~5 detik, analisis pada candle baru):
|
|===[PHASE 1: DATA]=================================
├── Fetch 2 bar terakhir → cek apakah candle baru terbentuk
|
├── Fetch 200 bar M15 XAUUSD dari MT5
├── Feature Engineering (40+ fitur)
├── SMC Analysis (Swing, FVG, OB, BOS, CHoCH)
├── HMM Regime Detection
└── XGBoost Prediction
|===[CANDLE BARU? YA → FULL ANALYSIS]=================
|
|===[PHASE 2: MONITORING]===========================
| |===[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?
| ├── [8] Pullback Filter → momentum selaras?
| ├── [9] Cooldown → 5 menit sejak trade terakhir?
| ├── [10] Position Limit → < 2 posisi?
| ├── [11] Lot Size → > 0?
| └── SEMUA PASS → Execute trade → 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
| └── News Agent: Monitor (non-blocking)
|
├── Cek posisi terbuka (setiap 1 detik)
│ └── Untuk setiap posisi:
│ ├── Update profit & momentum
│ ├── 10 kondisi exit (smart_risk.evaluate_position)
│ └── Jika should_close → tutup → log → Telegram
|===[CANDLE BARU? TIDAK → POSITION CHECK ONLY]========
|
├── 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 berturut?
├── [8] Pullback Filter → momentum selaras?
├── [9] Cooldown → 5 menit sejak trade terakhir?
├── [10] Position Limit → < 2 posisi?
├── [11] Lot Size → > 0?
└── SEMUA PASS → Execute trade → Log → Telegram
|
|===[PHASE 4: PERIODIK]==============================
|
├── Setiap 5 menit: 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)
├── Setiap 10 detik: cek posisi terbuka saja
── Fetch 50 bar (minimal data)
│ ├── Hitung fitur untuk ML check
│ └── Evaluasi exit conditions per posisi
|
v
Tunggu ~1 detik → Loop lagi
Tunggu ~5 detik → Loop lagi
```
---
@@ -160,10 +172,10 @@ Prinsip: NEVER STOP TRADING karena error non-kritis
| Event | Interval | Aksi |
|-------|----------|------|
| Data fetch + analysis | ~1 detik | Setiap loop |
| Position monitoring | ~1 detik | Setiap loop |
| News monitoring log | 5 menit | `loop_count % 300` |
| Auto-retrain check | 5 menit | `loop_count % 300` |
| 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 |
@@ -173,10 +185,10 @@ Prinsip: NEVER STOP TRADING karena error non-kritis
## Performa Target
```
Target: < 0.05 detik per loop (50ms)
Target: < 0.05 detik per iterasi analisis (50ms)
Breakdown:
├── MT5 data fetch: ~10ms
Full Analysis (saat candle baru):
├── MT5 data fetch: ~10ms (200 bar)
├── Feature engineering: ~5ms (Polars, vectorized)
├── SMC analysis: ~5ms (Polars native)
├── HMM predict: ~2ms
@@ -186,6 +198,15 @@ Breakdown:
└── 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
```
---