docs: sync architecture docs with v5 major issues fix

5 major issues reflected in documentation:

1. Confidence calibration (03-SMC, 00-ARSITEKTUR):
   - Base 55% + 10% each → base 40% + weighted scoring
   - Structure +15%, BOS/CHoCH +12%, FVG +8%, OB +10%, Trend +10%

2. ATR-based pullback filter (09-Entry, 00-ARSITEKTUR):
   - Hardcoded $2/$1.5 → bounce 15% ATR, consolidation 10% ATR

3. Smarter time-based exit (10-Exit, 05-Risk, 00-ARSITEKTUR):
   - 4h: check profit growth, not just profit<$5
   - 6h: extend to 8h if profit>$10 and growing + ML agrees

4. Slippage validation (09-Entry, 23-Main, 00-ARSITEKTUR):
   - Check actual vs expected price, log if >0.15%

5. Partial fill handling (09-Entry, 23-Main, 00-ARSITEKTUR):
   - Check filled volume, use actual values for tracking

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
buckybonez
2026-02-06 10:06:43 +07:00
parent db806b21de
commit 9d883ccc45
6 changed files with 191 additions and 65 deletions
+31 -9
View File
@@ -439,7 +439,7 @@ Signal Generation:
├── Entry: harga saat ini
├── SL: ATR-based, minimum 1.5 × ATR dari entry
├── TP: 2:1 Risk-Reward minimum, cap 4 × ATR
├── Confidence: 55-85% (berdasarkan confluence)
├── Confidence: 40-85% (v5: calibrated weighted scoring) (berdasarkan confluence)
└── Reason: "BOS + Bullish FVG at 2645.50"
```
@@ -619,13 +619,15 @@ SINYAL SMC + ML MASUK
└──────────────────────────────────────────────────────────┘
│ PASS
┌─ FILTER 8: Pullback Filter ─────────────────────────────┐
┌─ FILTER 8: Pullback Filter (v5: ATR-based) ────────────┐
│ Apakah momentum selaras dengan arah sinyal? │
│ ✗ BUY tapi RSI > 80 (overbought) → BLOCK │
│ ✗ SELL tapi RSI < 20 (oversold) → BLOCK │
│ ✗ MACD histogram berlawanan → BLOCK │
│ ✗ Harga bounce > $2 dalam 3 candle → BLOCK
│ ✗ Harga bounce > 15% ATR dalam 3 candle → BLOCK │
│ ✓ Movement < 10% ATR (consolidation) → PASS │
│ ✓ Momentum selaras → PASS │
│ (v5: threshold dinamis berdasarkan ATR, bukan fixed $2) │
└──────────────────────────────────────────────────────────┘
│ PASS
@@ -727,9 +729,12 @@ POSISI TERBUKA (dicek setiap ~10 detik)
└──────────────────────────────────────────────────────────┘
│ tidak trigger
┌─ KONDISI 9: Time-Based ─────────────────────────────────┐
│ (a) > 4 jam + profit < $5 → TUTUP (terlalu lama)
│ (b) > 6 jam → FORCE TUTUP (apapun kondisi)
┌─ KONDISI 9: Smart Time-Based (v5: Don't Cut Winners) ──┐
│ (a) > 4 jam + no growth → TUTUP (stuck)
│ (b) > 4 jam + growing + ML agrees → HOLD (extend)
│ (c) > 6 jam + profit < $10 → TUTUP │
│ (d) > 6 jam + profit > $10 + growing → extend ke 8 jam │
│ (e) > 8 jam → TUTUP (final max time) │
└──────────────────────────────────────────────────────────┘
│ tidak trigger
@@ -1092,7 +1097,7 @@ BUY Signal:
├── Entry: harga saat ini
├── SL: di bawah zone, minimum 1.5 × ATR
├── TP: 2:1 R:R, maximum 4 × ATR
└── Confidence: 55-85% (lebih banyak confluence = lebih tinggi)
└── Confidence: 40-85% (v5: calibrated weighted scoring) (lebih banyak confluence = lebih tinggi)
SELL Signal:
├── BOS bearish ATAU CHoCH bullish→bearish
@@ -1100,7 +1105,7 @@ SELL Signal:
├── Entry: harga saat ini
├── SL: di atas zone, minimum 1.5 × ATR
├── TP: 2:1 R:R, maximum 4 × ATR
└── Confidence: 55-85%
└── Confidence: 40-85% (v5: calibrated weighted scoring)
```
---
@@ -1165,10 +1170,27 @@ SELL Signal:
╔═══════════════════════════════════════════════════════════════╗
║ TAHAP 4b: POST-EXECUTION VALIDATION (v5 BARU) ║
║ ║
║ Slippage Validation: ║
║ → Bandingkan harga aktual vs expected ║
║ → Max acceptable: 0.15% dari harga (~$4 untuk XAUUSD) ║
║ → Log WARNING jika melebihi batas ║
║ → Gunakan harga AKTUAL untuk position tracking ║
║ ║
║ Partial Fill Handling: ║
║ → Cek apakah volume terisi = volume diminta ║
║ → Jika partial: log fill ratio, update lot_size aktual ║
║ → Risk calculation tetap akurat dengan volume sebenarnya ║
╚═══════════════════════════════════════════════════════════════╝
╔═══════════════════════════════════════════════════════════════╗
║ TAHAP 5: POSITION REGISTERED ║
║ ║
║ Smart Risk Manager: ║
║ → Catat entry price, direction, lot, timestamp
║ → Catat entry price AKTUAL, direction, lot AKTUAL, timestamp║
║ → v5: Menggunakan harga & volume dari broker (bukan planned)║
║ → Inisialisasi peak_profit = 0 ║
║ → Mulai tracking momentum ║
║ ║
+28 -7
View File
@@ -367,14 +367,35 @@ AND (ada FVG bearish ATAU Order Block bearish):
└────────────┴─────────────────────┴──────────────────────┴──────────────────────────┘
```
### Sistem Confidence
### Sistem Confidence (v5: Calibrated Weighted Scoring)
```
Base confidence: 55%
+ BOS/CHoCH: +10%
+ FVG: +10%
+ Order Block: +10%
Maximum: 85%
Sebelum (v4): Sesudah (v5):
Base: 55% Base: 40%
+ BOS/CHoCH: +10% + Structure aligned: +15%
+ FVG: +10% + BOS/CHoCH: +12%
+ OB: +10% + FVG: +8%
Max: 85% + Order Block: +10%
+ Trend strength: +10%
+ Fresh level: +5%
Max: 85%
Kalkulasi confidence sekarang menggunakan metode calculate_confidence():
1. Base = 40% (minimum, selalu ada)
2. Structure aligned = +15% (market_structure searah sinyal)
3. BOS/CHoCH = +12% (ada break of structure/character)
4. FVG = +8% (ada Fair Value Gap)
5. Order Block = +10% (ada Order Block)
6. Trend strength = +10% (ada ≥2 BOS searah dalam 20 bar terakhir)
7. Fresh level = +5% (first touch of key level)
8. Cap di 85% (tidak pernah 100% yakin)
Contoh:
BUY signal, structure bullish, ada BOS + FVG + OB, trend kuat:
= 40% + 15% + 12% + 8% + 10% + 10% = 95% → cap 85%
BUY signal, structure bearish, ada CHoCH + FVG saja:
= 40% + 0% + 12% + 8% + 0% + 0% = 60%
```
### Output Signal
@@ -385,7 +406,7 @@ SMCSignal:
entry_price: float
stop_loss: float # ATR-based (min 1.5 ATR dari entry)
take_profit: float # 2:1 RR, capped di 4 ATR
confidence: 0.55 - 0.85
confidence: 0.40 - 0.85 # v5: base diturunkan ke 40% (calibrated)
reason: "Bullish BOS + FVG + OB"
risk_reward: float # Minimum 2.0
```
+31 -25
View File
@@ -199,33 +199,35 @@ Setiap posisi terbuka dievaluasi setiap loop:
Jika peak_profit > $30 DAN current < 60% dari peak:
-> TUTUP (lindungi profit)
6. TIME-BASED EXIT (v3: BARU)
Jika posisi terbuka >= 4 jam DAN profit < $5:
- Jika profit >= $0 -> TUTUP (breakeven/profit kecil)
- Jika profit > -$15 -> TUTUP (loss kecil, daripada makin besar)
6. SMART TIME-BASED EXIT (v5: Don't Cut Winners)
Jika posisi terbuka >= 4 jam:
- profit < $5 DAN tidak growing -> TUTUP
- profit >= $5 DAN growing + ML agrees -> HOLD (extend)
Jika posisi terbuka >= 6 jam:
-> FORCE EXIT (tutup apapun kondisinya)
- profit < $10 ATAU tidak growing -> TUTUP
- profit >= $10 DAN growing -> extend ke 8 jam
Jika posisi terbuka >= 8 jam:
-> TUTUP (take profit atau max time)
```
### Time-Based Exit Detail (v3 Update)
### Smart Time-Based Exit Detail (v5 Update)
```
Jam 0 Jam 4 Jam 6
|------------|------------------|-----> waktu
| |
| profit < $5? | FORCE EXIT
| Ya -> evaluasi: | (apapun kondisinya)
| profit >= 0 |
| -> tutup OK |
| loss > -$15 |
| -> tutup |
| loss <= -$15 |
| -> tahan |
Jam 0 Jam 4 Jam 6 Jam 8
|------------|------------------|------------------|-----> waktu
| | |
| stuck? | profitable? | FINAL EXIT
| (no growth) | (growing?) |
| -> TUTUP | -> extend! |
| | not growing? |
| growing? | -> TUTUP |
| -> HOLD | |
Kenapa perlu time-based exit?
- Trade yang stuck tanpa progress = buang waktu & margin
- Lebih baik exit kecil daripada menunggu loss besar
- Mencegah posisi "zombie" yang tidak kemana-mana
v5 Perubahan dari v3:
- 4h: Cek profit GROWTH (momentum), bukan hanya profit < $5
- 6h: Bukan force close lagi — extend ke 8h jika profit > $10 + growing
- ML agreement diperhitungkan sebelum timeout
- Prinsip: jangan potong pemenang yang masih berjalan
```
### Broker Stop Loss (v3: ATR-Based Protection)
@@ -428,14 +430,18 @@ Backtest menggunakan **logika exit yang identik** dengan live trading:
```
Exit reversal: 0.65 (65% ML confidence) <- synced dengan live
Time-based exit:
16 bars (4 jam M15) + profit < $5 -> exit
24 bars (6 jam M15) -> force exit
Smart time-based exit (v5):
16 bars (4 jam M15) + no growth -> exit (stuck)
16 bars + growing + ML agrees -> hold (extend)
24 bars (6 jam M15) + profit<$10 -> exit
24 bars + profit>$10 + growing -> extend ke 32 bars (8 jam)
32 bars (8 jam M15) -> final exit
Perhitungan bar:
bars_since_entry = current_bar_index - entry_bar_index
16 bars * 15 menit = 4 jam
24 bars * 15 menit = 6 jam
32 bars * 15 menit = 8 jam (v5: max extended time)
```
**Kenapa penting disinkronkan?** Agar hasil backtest akurat mewakili performa live trading.
@@ -449,5 +455,5 @@ Perhitungan bar:
3. **Multi-Layer Protection** — Per-trade, per-day, total limit, circuit breaker
4. **Recovery First** — Setelah loss, otomatis masuk mode defensif
5. **Profit Protection** — Jika profit sudah besar, lindungi dari drawback
6. **Time-Bounded** — Tidak ada posisi "zombie", max 6 jam (v3 update)
6. **Smart Time-Bounded** — Tidak ada posisi "zombie", max 6-8 jam, tapi jangan potong pemenang (v5 update)
7. **Faster Reversal** — Exit lebih cepat di 65% ML confidence (v3 update)
+64 -6
View File
@@ -167,13 +167,27 @@ if not can_enter:
return # Sedang pullback, tunggu momentum selaras
```
**v5: Threshold sekarang ATR-based (bukan hardcoded)**
```
ATR diambil dari data (default $12 untuk XAUUSD)
bounce_threshold = ATR × 0.15 # ~$1.80 (sebelumnya: $2.00 fixed)
consolidation_threshold = ATR × 0.10 # ~$1.20 (sebelumnya: $1.50 fixed)
Kenapa ATR-based?
- Threshold menyesuaikan volatilitas pasar saat ini
- Saat volatilitas tinggi (ATR=$20): bounce=$3, consolidation=$2
- Saat volatilitas rendah (ATR=$8): bounce=$1.2, consolidation=$0.8
- Lebih akurat daripada threshold tetap
```
**Untuk signal BUY, block jika:**
- Harga turun > $2 dalam 3 candle terakhir
- Harga turun > bounce_threshold (15% ATR) dalam 3 candle terakhir
- MACD bearish + harga turun
- Harga jauh di bawah EMA9 + terus turun
**Untuk signal SELL, block jika:**
- Harga naik > $2 dalam 3 candle terakhir
- Harga naik > bounce_threshold (15% ATR) dalam 3 candle terakhir
- MACD bullish + harga naik
- Harga jauh di atas EMA9 + terus naik
@@ -182,6 +196,7 @@ if not can_enter:
```
1. Short-term Momentum (3 candle terakhir)
-> Arah pergerakan harga terkini
-> Block jika bounce > 15% ATR (v5: dinamis)
2. MACD Histogram
-> Rising = bullish momentum
@@ -194,6 +209,10 @@ if not can_enter:
4. RSI Extreme
-> RSI > 80 = overbought (block BUY)
-> RSI < 20 = oversold (block SELL)
5. Consolidation Check
-> Jika movement < 10% ATR = consolidation → ALLOW
-> v5: dinamis, bukan fixed $1.5
```
---
@@ -276,22 +295,61 @@ result = mt5.send_order(
if gagal dan error 10016:
result = mt5.send_order(sl=0, ...) # Tanpa broker SL
# Step E: Register posisi untuk monitoring
# Step E: Slippage Validation (v5 BARU)
if result.success:
actual_price = result.price
slippage = abs(actual_price - signal.entry_price)
max_slippage = signal.entry_price * 0.0015 # 0.15% dari harga
if slippage > max_slippage:
log WARNING "HIGH SLIPPAGE" # Catat slippage tinggi
# Gunakan harga AKTUAL untuk tracking, bukan harga expected
# Step F: Partial Fill Check (v5 BARU)
filled_volume = result.volume
if filled_volume < requested_volume:
log WARNING "PARTIAL FILL"
# Update lot_size ke volume yang sebenarnya terisi
position.lot_size = filled_volume
# Step G: Register posisi (gunakan nilai AKTUAL)
smart_risk.register_position(
ticket=result.order_id,
entry_price=signal.entry_price,
lot_size=position.lot_size,
entry_price=actual_price, # v5: harga aktual (bukan expected)
lot_size=filled_volume, # v5: volume aktual (bukan requested)
direction=signal.signal_type,
)
```
### Slippage & Partial Fill (v5 Detail)
```
SLIPPAGE VALIDATION:
expected_price = signal.entry_price
actual_price = result.price (dari broker)
slippage = |actual - expected|
max_acceptable = 0.15% dari harga (~$4 untuk XAUUSD @$2650)
Jika slippage > max_acceptable:
-> LOG WARNING (untuk monitoring & analisis)
-> Tetap pakai harga aktual untuk position tracking
PARTIAL FILL HANDLING:
requested_volume = lot dari risk calculation
filled_volume = result.volume (dari broker)
Jika filled < requested:
-> LOG WARNING dengan fill ratio (%)
-> Update position.lot_size ke filled_volume
-> Risk calculation tetap akurat (berdasarkan volume sebenarnya)
```
---
## Post-Entry
```python
# Step F: Log trade detail
# Step H: Log trade detail
trade_logger.log_trade_open(
signal, ml_prediction, regime, market_quality, ...
)
+32 -16
View File
@@ -197,34 +197,50 @@ IF hari Jumat setelah 04:00 WIB:
---
### CHECK 9: Time-Based Exit (v3 BARU)
### CHECK 9: Smart Time-Based Exit (v5: Smarter — Don't Cut Winners)
```
Mencegah posisi "zombie" yang stuck:
Mencegah posisi "zombie" TAPI jangan potong posisi profit yang masih tumbuh.
trade_duration = (sekarang - entry_time) dalam jam
profit_growing = momentum > 0
ml_agrees = ML signal searah dengan posisi
IF 4+ jam DAN profit < $5:
a) profit >= $0
-> TUTUP [TIMEOUT] Breakeven setelah 4 jam
IF 4+ jam:
a) profit < $5 DAN NOT profit_growing:
- profit >= $0 -> TUTUP [TIMEOUT] Breakeven + no growth
- profit > -$15 -> TUTUP [TIMEOUT] Small loss + no growth
b) profit >= $5 DAN profit_growing DAN ml_agrees:
-> HOLD (extend time — profit masih tumbuh!)
-> Log: "extending time"
b) profit > -$15
-> TUTUP [TIMEOUT] Loss kecil, daripada stuck
IF 6+ jam:
a) profit < $10 ATAU NOT profit_growing:
-> TUTUP [MAX TIME] (sebelumnya: force close apapun kondisi)
b) profit >= $10 DAN profit_growing:
-> EXTEND ke max 8 jam (v5 BARU — biarkan profit berjalan)
-> Di jam 8+ -> TUTUP [MAX TIME] Take profit
IF 6+ jam (apapun profit):
-> TUTUP [MAX TIME] Force exit — max hold 6 jam
v5 PERUBAHAN:
- 4h: Sekarang cek profit growth, bukan hanya profit < $5
- 6h: BUKAN force close lagi — extend ke 8h jika profitable + growing
- ML agreement dipertimbangkan sebelum timeout
- Prinsip: jangan potong pemenang yang masih berjalan
```
**Visualisasi:**
```
Jam: 0 1 2 3 4 5 6
|-----|-----|-----|-----|-----|-----|
entry | |
| |
4h check: 6h FORCE EXIT
profit<$5?
Ya -> exit
Jam: 0 1 2 3 4 5 6 7 8
|-----|-----|-----|-----|-----|-----|-----|-----|
entry | | |
| | |
4h check: 6h check: 8h FINAL EXIT
stuck? profitable?
no growth? growing?
-> exit -> extend!
not growing?
-> exit
```
---
@@ -92,11 +92,14 @@ LOOP UTAMA (cek setiap ~5 detik, analisis pada candle baru):
| ├── [5] ML Agreement → tidak strongly disagree?
| ├── [6] Dynamic Quality → bukan AVOID?
| ├── [7] Confirmation → 2x candle berturut?
| ├── [8] Pullback Filter → momentum selaras?
| ├── [8] Pullback Filter → momentum selaras? (v5: ATR-based)
| ├── [9] Cooldown → 5 menit sejak trade terakhir?
| ├── [10] Position Limit → < 2 posisi?
| ├── [11] Lot Size → > 0?
| ── SEMUA PASS → Execute trade → Log → Telegram
| ── 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
| |
| |===[PHASE 4: PERIODIK]=============================
| |