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:
co-authored by
Claude Opus 4.5
parent
7eff3f1a2b
commit
092926415c
@@ -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 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 │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
@@ -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)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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 │
|
||||
├────────────┼───────────────────────────┼──────────────────────────────┤
|
||||
│ TP │ risk * 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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++
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user