e8355b3f62
- 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>
322 lines
14 KiB
Markdown
322 lines
14 KiB
Markdown
# XAUBot AI — Referensi Fitur
|
|
|
|
## Gambaran Umum
|
|
|
|
XAUBot AI adalah bot *trading* XAUUSD (Emas) otomatis yang menggabungkan **XGBoost *Machine Learning***, **Smart Money Concepts (SMC)**, dan **Hidden Markov Model (HMM)** untuk deteksi *regime*. Bot ini beroperasi di MetaTrader 5 melalui *loop* Python asinkron, mengeksekusi *trade* pada *timeframe* M15 (15 menit).
|
|
|
|
Bot mengikuti *pipeline* yang ketat: data diambil, fitur direkayasa, struktur pasar dianalisis, *regime* diklasifikasikan, prediksi ML dihasilkan, dan serangkaian 14 *filter* berurutan menentukan apakah *trade* dieksekusi. Setelah posisi terbuka, 12 kondisi *exit* dipantau setiap 5-10 detik.
|
|
|
|
---
|
|
|
|
## *Pipeline* 14 *Entry Filter*
|
|
|
|
Terdapat **14 *filter*** yang berjalan secara berurutan selama `_trading_iteration()`. Sebuah sinyal harus melewati **SEMUA** *filter* untuk mengeksekusi *trade*.
|
|
|
|
### 1. Pengambilan Data
|
|
- Mengambil **200 *bar* M15** dari MetaTrader 5.
|
|
- Data dikonversi ke **Polars *DataFrame*** (bukan Pandas).
|
|
|
|
### 2. Rekayasa Fitur (*Feature Engineering*)
|
|
- Menghitung **37 fitur teknikal** dari data OHLCV.
|
|
- Meliputi: *RSI*, *ATR*, *MACD*, *Bollinger Bands*, *EMA* (berbagai periode), *Stochastic*, indikator berbasis volume, dan lainnya.
|
|
- Semua komputasi menggunakan Polars untuk performa.
|
|
|
|
### 3. Analisis *SMC*
|
|
- Mendeteksi struktur institusional *Smart Money Concepts*:
|
|
- ***Order Block* (OB)** — zona *supply/demand* dari aktivitas institusional.
|
|
- ***Fair Value Gap* (FVG)** — ketidakseimbangan dalam *price action*.
|
|
- ***Break of Structure* (BOS)** — sinyal kelanjutan tren.
|
|
- ***Change of Character* (CHoCH)** — sinyal pembalikan arah.
|
|
|
|
### 4. Deteksi *Regime*
|
|
- ***HMM* (*Hidden Markov Model*)** mengklasifikasikan kondisi pasar saat ini:
|
|
- `TRENDING` — pergerakan searah, kondusif untuk *entry*.
|
|
- `RANGING` — konsolidasi menyamping, ukuran posisi dikurangi.
|
|
- `HIGH_VOLATILITY` — pergerakan tidak menentu, butuh kehati-hatian.
|
|
- `CRISIS` — kondisi ekstrem, *trading* diblokir.
|
|
|
|
### 5. Pelindung *Flash Crash*
|
|
- Proteksi darurat: jika pergerakan harga melebihi ambang persentase tertentu, **semua posisi langsung ditutup**.
|
|
- Mencegah kerugian katastropik saat dislokasi pasar mendadak.
|
|
|
|
### 6. *Filter Regime*
|
|
- Memblokir *trading* sepenuhnya jika rekomendasi *regime* adalah `SLEEP`.
|
|
- Mencegah *entry* saat kondisi pasar tidak menguntungkan yang teridentifikasi oleh *HMM*.
|
|
|
|
### 7. Pemeriksaan Risiko
|
|
- Memblokir *trading* jika:
|
|
- **Batas kerugian harian** telah tercapai (5% dari kapital).
|
|
- ***Equity*** terlalu rendah relatif terhadap *margin* yang dibutuhkan.
|
|
- **Batas kerugian total** telah dilanggar (10% dari kapital).
|
|
|
|
### 8. *Filter* Sesi
|
|
- Memfilter berdasarkan sesi *trading* **WIB (Waktu Indonesia Barat)**.
|
|
- Setiap sesi menerapkan ***lot size multiplier*** untuk mengontrol eksposur:
|
|
- **Sydney** (06:00-13:00 WIB) — *multiplier* 0.5x (volatilitas rendah).
|
|
- **Tokyo** (07:00-16:00 WIB) — *multiplier* 0.7x (volatilitas sedang).
|
|
- **London** (15:00-24:00 WIB) — *multiplier* 1.0x (volatilitas tinggi).
|
|
- **New York** (20:00-24:00 WIB) — *multiplier* 1.0x (volatilitas ekstrem).
|
|
- ***Off-Hours*** (00:00-06:00 WIB) — **diblokir sepenuhnya**.
|
|
|
|
### 9. *Filter Bias* H1 (#31B)
|
|
- Konfirmasi *multi-timeframe* menggunakan ***EMA20* pada *chart* H1**.
|
|
- Posisi harga relatif terhadap *EMA20* H1 menentukan bias arah:
|
|
- **BULLISH** (harga di atas *EMA20*) — hanya sinyal *BUY* yang diizinkan.
|
|
- **BEARISH** (harga di bawah *EMA20*) — hanya sinyal *SELL* yang diizinkan.
|
|
- **NEUTRAL** (harga dekat *EMA20*) — **semua sinyal diblokir**.
|
|
- Hasil *backtest*: **+$343 peningkatan, *win rate* 81.8%, *Sharpe* 3.97**.
|
|
|
|
### 10. Generasi Sinyal *SMC*
|
|
- Menghasilkan sinyal ***BUY* atau *SELL*** berdasarkan analisis struktur *SMC*.
|
|
- Setiap sinyal memiliki ***confidence score*** yang berasal dari kualitas struktur yang terdeteksi (kedekatan *OB*, keselarasan *FVG*, konteks *BOS*/*CHoCH*).
|
|
|
|
### 11. Kombinasi Sinyal
|
|
- Menggabungkan **sinyal *SMC* + prediksi *ML* (*XGBoost*)**.
|
|
- Menerapkan ***dynamic confidence threshold*** yang beradaptasi berdasarkan:
|
|
- Sesi *trading* saat ini.
|
|
- *Regime* pasar.
|
|
- Volatilitas terkini.
|
|
- Kedua sinyal harus sepakat arah; *confidence* gabungan harus melampaui *threshold*.
|
|
|
|
### 12. *Filter* Waktu (#34A)
|
|
- Melewatkan jam WIB tertentu yang dikenal berkondisi buruk:
|
|
- **Jam 9 WIB** — akhir sesi *New York*, likuiditas rendah.
|
|
- **Jam 21 WIB** — transisi *London*-*New York*, rawan *whipsaw*.
|
|
- Hasil *backtest*: **+$356 peningkatan**.
|
|
|
|
### 13. *Cooldown Trade*
|
|
- Memberlakukan jeda minimum **150 detik (2.5 menit)** antara *trade* berturut-turut.
|
|
- Mencegah *overtrading* dan *entry* bertubi-tubi dari sinyal yang noisy.
|
|
|
|
### 14. Gerbang Risiko Cerdas (*Smart Risk Gate*)
|
|
- Gerbang terakhir sebelum eksekusi. Memeriksa:
|
|
- **Mode *trading***: `NORMAL`, `RECOVERY`, `PROTECTED`, atau `STOPPED`.
|
|
- **Perhitungan *lot size***: Berdasarkan *ATR*, mode kapital, dan *multiplier* sesi.
|
|
- **Batas posisi**: Maksimal **2 posisi bersamaan** diizinkan.
|
|
- Jika mode `STOPPED`, tidak ada *trade* yang dieksekusi terlepas dari kualitas sinyal.
|
|
|
|
---
|
|
|
|
## 12 Kondisi *Exit*
|
|
|
|
**12 kondisi *exit*** diperiksa setiap **5-10 detik** selama posisi terbuka.
|
|
|
|
### 1. *Take Profit* (TP Level Broker)
|
|
- *TP* dipasang di level broker saat *entry*.
|
|
- Dihitung menggunakan rasio *risk-reward* berbasis *ATR*.
|
|
|
|
### 2. *Trailing Stop* (#24B)
|
|
- ***Trailing stop* adaptif berbasis *ATR***:
|
|
- Jarak aktivasi: ***ATR* x 4.0**.
|
|
- Ukuran langkah: ***ATR* x 3.0**.
|
|
- Mengunci keuntungan seiring harga bergerak menguntungkan.
|
|
|
|
### 3. Perpindahan *Breakeven* (#24B)
|
|
- Memindahkan *stop loss* ke **harga *entry*** (*breakeven*) saat keuntungan belum direalisasi melampaui ***ATR* x 2.0**.
|
|
- Menghilangkan risiko pada *trade* setelah pergerakan menguntungkan.
|
|
|
|
### 4. *Exit* Pembalikan *ML*
|
|
- Menutup posisi jika *confidence* model *ML* **berbalik arah** dengan *confidence* melebihi **75%**.
|
|
- Merespons perubahan kondisi pasar yang terdeteksi oleh *XGBoost*.
|
|
|
|
### 5. Kerugian Maksimal Per *Trade*
|
|
- ***Stop loss* level perangkat lunak** sebesar **1% dari kapital**.
|
|
- Berfungsi sebagai jaring pengaman di samping *SL* broker.
|
|
|
|
### 6. Batas Kerugian Harian
|
|
- Jika kerugian kumulatif harian mencapai **5% dari kapital**, **semua posisi ditutup** dan *trading* dihentikan untuk hari itu.
|
|
|
|
### 7. Batas Kerugian Total
|
|
- Jika kerugian kumulatif total mencapai **10% dari kapital**, ***trading* dihentikan sepenuhnya** sampai intervensi manual.
|
|
|
|
### 8. Penanganan Penutupan Pasar
|
|
- Sebelum penutupan harian atau penutupan akhir pekan:
|
|
- Mengambil keuntungan pada posisi dengan *unrealized profit* **> $5**.
|
|
- Mencegah risiko *gap* dari posisi yang terbawa semalam/akhir pekan.
|
|
|
|
### 9. Darurat *Flash Crash*
|
|
- Dipicu oleh pergerakan harga ekstrem secara tiba-tiba.
|
|
- **Langsung menutup semua posisi terbuka** tanpa penundaan.
|
|
|
|
### 10. Proteksi *Drawdown*
|
|
- Memantau *drawdown* dari puncak *equity*.
|
|
- Menutup semua posisi jika *drawdown* melebihi **50%** dari puncak.
|
|
|
|
### 11. *Impulse Trail* (#33B)
|
|
- *Trailing stop* yang ditingkatkan menggunakan **deteksi *impulse candle***.
|
|
- Mengidentifikasi *candle* momentum kuat dan men-*trail* *stop* di belakangnya.
|
|
- Lebih responsif dibanding *trailing ATR* standar dalam kondisi tren.
|
|
|
|
### 12. *Smart Breakeven* (#28B)
|
|
- Logika *breakeven* yang ditingkatkan dengan **pemicu *ATR multiplier***:
|
|
- Pemicu: keuntungan melampaui ***ATR* x 2.0**.
|
|
- Memindahkan *SL* ke *entry* + *buffer* kecil.
|
|
- Lebih adaptif dibanding *breakeven* berbasis pip tetap.
|
|
|
|
---
|
|
|
|
## Riwayat Optimasi *Backtest*
|
|
|
|
Rangkuman optimasi utama yang diterapkan ke bot *live*, diuji dan divalidasi melalui *backtest*.
|
|
|
|
| # | Nama | Perubahan Utama | Hasil |
|
|
|---|------|-----------------|-------|
|
|
| #24B | *ATR-Adaptive Exit* | *Trailing* berbasis *ATR* (4.0x) dan *breakeven* (2.0x) *multiplier* | Optimasi dasar untuk logika *exit* |
|
|
| #28B | *Smart Breakeven* | *Breakeven* yang ditingkatkan dengan pemicu *ATR* x 2.0 | Peningkatan waktu *exit* pada *trade* yang menang |
|
|
| #31B | *Filter* H1 *EMA20* | *Filter multi-timeframe* harga H1 vs *EMA20* | +$343, WR 81.8%, *Sharpe* 3.97 |
|
|
| #33B | *Impulse Trail* | *Trail* menggunakan deteksi *impulse candle* | *Trailing* lebih baik di pasar tren |
|
|
| #34A | Lewati Jam Tertentu | Lewati jam WIB 9 dan 21 | +$356, pengurangan kerugian *whipsaw* |
|
|
|
|
---
|
|
|
|
## Manajemen Risiko
|
|
|
|
### Mode Kapital
|
|
|
|
Mode kapital dikonfigurasi otomatis berdasarkan saldo akun. Setiap mode mengatur parameter risiko yang sesuai untuk ukuran akun.
|
|
|
|
| Mode | Rentang Kapital | Risiko/*Trade* | *Lot* Maks |
|
|
|------|----------------|----------------|------------|
|
|
| MICRO | < $500 | 2% | 0.02 |
|
|
| SMALL | $500 - $10,000 | 1.5% | 0.05 |
|
|
| MEDIUM | $10,000 - $100,000 | 0.5% | 0.10 |
|
|
| LARGE | > $100,000 | 0.25% | 0.50 |
|
|
|
|
### Mode *Trading*
|
|
|
|
*Smart Risk Manager* secara dinamis menyesuaikan mode *trading* berdasarkan performa terkini.
|
|
|
|
| Mode | Pemicu | Penyesuaian *Lot* |
|
|
|------|--------|-------------------|
|
|
| NORMAL | Kondisi *default* | *Lot* dasar (0.01-0.03) |
|
|
| RECOVERY | Setelah *trade* rugi | *Lot* pemulihan (0.01) |
|
|
| PROTECTED | Mendekati batas kerugian harian | *Lot* minimum (0.01) |
|
|
| STOPPED | Batas kerugian harian atau total tercapai | *Trading* tidak diizinkan |
|
|
|
|
### Batas Risiko
|
|
|
|
| Batas | Nilai | Aksi |
|
|
|-------|-------|------|
|
|
| Kerugian harian maks | 5% dari kapital | Tutup semua posisi, hentikan *trading* untuk hari itu |
|
|
| Kerugian total maks | 10% dari kapital | Hentikan semua *trading* sampai *reset* manual |
|
|
| Kerugian maks per *trade* | 1% dari kapital | *Stop loss* perangkat lunak |
|
|
| *SL* darurat broker | 2% dari kapital | *Hard stop* level broker |
|
|
| Posisi bersamaan maks | 2 | Tolak *entry* baru jika sudah di batas |
|
|
|
|
---
|
|
|
|
## *Filter* Sesi (WIB)
|
|
|
|
Semua waktu sesi dalam **WIB (Waktu Indonesia Barat, UTC+7)**.
|
|
|
|
| Sesi | Jam (WIB) | Volatilitas | *Multiplier Lot* |
|
|
|------|-----------|-------------|-------------------|
|
|
| Sydney | 06:00 - 13:00 | Rendah | 0.5x |
|
|
| Tokyo | 07:00 - 16:00 | Sedang | 0.7x |
|
|
| London | 15:00 - 24:00 | Tinggi | 1.0x |
|
|
| New York | 20:00 - 24:00 | Ekstrem | 1.0x |
|
|
| *Off-Hours* | 00:00 - 06:00 | N/A | **Diblokir** |
|
|
|
|
### *Golden Hour*
|
|
- **19:00 - 23:00 WIB** (*London*-*New York Overlap*).
|
|
- Periode likuiditas dan volatilitas tertinggi untuk XAUUSD.
|
|
- Kondisi *trading* terbaik; *multiplier lot* penuh diterapkan.
|
|
|
|
### Jam yang Dilewati (#34A)
|
|
- **Jam 9 WIB** — Akhir sesi *New York*; likuiditas rendah menyebabkan *fill* yang tidak menentu.
|
|
- **Jam 21 WIB** — Transisi *London*-*New York*; rawan *whipsaw* dan *false breakout*.
|
|
|
|
---
|
|
|
|
## *Auto-Trainer*
|
|
|
|
Bot menyertakan *pipeline* pelatihan ulang model otomatis untuk menjaga model *ML* tetap mutakhir dengan kondisi pasar.
|
|
|
|
| Parameter | Nilai |
|
|
|-----------|-------|
|
|
| Interval pemeriksaan | Setiap 20 *candle* (~5 jam pada M15) |
|
|
| Pelatihan ulang harian | 05:00 WIB (saat pasar tutup) |
|
|
| Pelatihan akhir pekan | Pelatihan mendalam dengan jendela data yang diperluas |
|
|
| *Threshold AUC* minimum | 0.65 |
|
|
| Kebijakan *rollback* | Jika model baru berkinerja lebih buruk, kembali ke *backup* |
|
|
|
|
### Alur Pelatihan Ulang
|
|
1. Setiap 20 *candle*, *auto-trainer* memeriksa metrik performa model.
|
|
2. Jika *AUC* turun di bawah **0.65**, pelatihan ulang dipicu.
|
|
3. Pada **05:00 WIB setiap hari** (pasar tutup), pelatihan ulang terjadwal berjalan.
|
|
4. Pada **akhir pekan**, pelatihan mendalam menggunakan *dataset* historis yang lebih besar.
|
|
5. Setelah pelatihan, model baru divalidasi terhadap model sebelumnya.
|
|
6. Jika model baru berkinerja lebih buruk, sistem **melakukan *rollback*** ke model *backup*.
|
|
|
|
---
|
|
|
|
## Model *ML*
|
|
|
|
### Algoritma
|
|
- ***XGBoost* *gradient-boosted decision trees***.
|
|
|
|
### Fitur
|
|
- **37 indikator teknikal** dihitung oleh `src/feature_eng.py`:
|
|
- Tren: *EMA* (berbagai periode), *MACD*, *ADX*.
|
|
- Momentum: *RSI*, *Stochastic K/D*.
|
|
- Volatilitas: *ATR*, *Bollinger Bands* (*width*, *%B*).
|
|
- Volume: Indikator berbasis volume.
|
|
- Kustom: Fitur turunan *SMC*, fitur *regime*.
|
|
|
|
### Keluaran
|
|
- **Sinyal**: *BUY*, *SELL*, atau *HOLD*.
|
|
- ***Confidence score***: 0.0 hingga 1.0, digunakan dalam kombinasi dengan *confidence SMC*.
|
|
|
|
### *Threshold* Dinamis
|
|
- *Threshold confidence* untuk eksekusi *trade* tidak tetap.
|
|
- Menyesuaikan berdasarkan:
|
|
- **Sesi**: *Threshold* lebih tinggi saat sesi volatilitas rendah.
|
|
- ***Regime***: *Threshold* lebih tinggi saat *regime ranging*/*volatile*.
|
|
- **Performa terkini**: Diperketat setelah kerugian, dilonggarkan setelah kemenangan.
|
|
|
|
---
|
|
|
|
## Komponen Aktif
|
|
|
|
| Komponen | File | Status | Deskripsi |
|
|
|----------|------|--------|-----------|
|
|
| Penganalisis *SMC* | `src/smc_polars.py` | Aktif | Deteksi *Order Block*, *FVG*, *BOS*, *CHoCH* |
|
|
| *ML XGBoost* | `src/ml_model.py` | Aktif | Prediksi sinyal dengan *confidence* |
|
|
| *Regime HMM* | `src/regime_detector.py` | Aktif | Klasifikasi *regime* pasar |
|
|
| Mesin Fitur | `src/feature_eng.py` | Aktif | Komputasi 37 fitur teknikal |
|
|
| Mesin Risiko | `src/risk_engine.py` | Aktif | *SL*/*TP* berbasis *ATR*, *position sizing* |
|
|
| *Smart Risk Manager* | `src/smart_risk_manager.py` | Aktif | Manajemen mode dinamis |
|
|
| Manajer Posisi | `src/position_manager.py` | Aktif | Pemantauan kondisi *exit* |
|
|
| *Filter* Sesi | `src/session_filter.py` | Aktif | *Filtering* berbasis sesi WIB |
|
|
| *Confidence* Dinamis | `src/dynamic_confidence.py` | Aktif | Penyesuaian *threshold* adaptif |
|
|
| *Auto Trainer* | `src/auto_trainer.py` | Aktif | Pelatihan ulang model terjadwal |
|
|
| Notifikasi Telegram | `src/telegram_notifier.py` | Aktif | Peringatan *trade* via Telegram |
|
|
| Pencatat *Trade* | `src/trade_logger.py` | Aktif | Pencatatan *trade* ke PostgreSQL |
|
|
| Agen Berita | `src/news_agent.py` | **NONAKTIF** | *Filter* berita ekonomi (mengurangi $178 profit di *backtest*) |
|
|
| Detektor *Flash Crash* | `src/regime_detector.py` | Aktif | Penutupan posisi darurat |
|
|
|
|
---
|
|
|
|
## Diagram Arsitektur
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
MT5["MT5 Broker"] --> DF["Data Fetch"]
|
|
DF --> FE["Feature Eng (37 fitur)"]
|
|
FE --> SMC["SMC Analysis"]
|
|
SMC --> HMM["Regime Detection (HMM)"]
|
|
HMM --> FCG["Flash Crash Guard"]
|
|
FCG --> RF["Regime Filter"]
|
|
RF --> RC["Risk Check"]
|
|
RC --> SF["Session Filter"]
|
|
SF --> H1["H1 Bias Filter (#31B)"]
|
|
H1 --> SG["SMC Signal Gen"]
|
|
SG --> SC["Signal Combination (ML+SMC)"]
|
|
SC --> TF["Time Filter (#34A)"]
|
|
TF --> TC["Trade Cooldown"]
|
|
TC --> SRG["Smart Risk Gate"]
|
|
SRG --> TE["TRADE EXECUTION"]
|
|
TE --> PM["Position Manager (12 exits)"]
|
|
PM --> LOG["Telegram + PostgreSQL Logging"]
|
|
```
|