166 lines
4.1 KiB
Markdown
166 lines
4.1 KiB
Markdown
# Position Manager — Manajemen Posisi Cerdas
|
|||
|
|
|
||
|
|
> **File:** `src/position_manager.py`
|
||
|
|
> **Class:** `SmartPositionManager`, `SmartMarketCloseHandler`
|
||
|
|
> **Fitur:** Trailing SL, Profit Protection, Market Close Handler
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Apa Itu Position Manager?
|
||
|
|
|
||
|
|
Position Manager mengelola posisi terbuka secara **aktif dan cerdas** — trailing stop loss, proteksi profit, dan keputusan otomatis saat market mendekati penutupan.
|
||
|
|
|
||
|
|
**Analogi:** Position Manager seperti **co-pilot yang mengawasi perjalanan** — mengamankan keuntungan saat angin baik, dan mengambil tindakan darurat saat cuaca memburuk.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2 Komponen Utama
|
||
|
|
|
||
|
|
### A. SmartPositionManager
|
||
|
|
|
||
|
|
Mengelola posisi aktif: trailing SL, breakeven, profit protection.
|
||
|
|
|
||
|
|
### B. SmartMarketCloseHandler
|
||
|
|
|
||
|
|
Keputusan cerdas saat market mendekati penutupan (harian/weekend).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## SmartPositionManager — 7 Kondisi Aksi
|
||
|
|
|
||
|
|
Untuk setiap posisi terbuka, dicek berurutan:
|
||
|
|
|
||
|
|
### 0. Market Close Check (Prioritas Tertinggi)
|
||
|
|
|
||
|
|
```
|
||
|
|
Dekat market close?
|
||
|
|
├── Profit >= $10 + dekat close → CLOSE (amankan profit)
|
||
|
|
├── Loss + dekat weekend + SL >50% hit → CLOSE (gap risk)
|
||
|
|
├── Loss + dekat weekend + loss > $100 → CLOSE (gap risk)
|
||
|
|
└── Loss kecil + dekat weekend → HOLD (bisa recovery Senin)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 1. Regime Danger
|
||
|
|
|
||
|
|
```
|
||
|
|
Regime CRISIS atau HIGH_VOLATILITY + profit > $50:
|
||
|
|
→ CLOSE (amankan profit dari volatilitas)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Opposite Signal
|
||
|
|
|
||
|
|
```
|
||
|
|
Posisi BUY + sinyal bearish kuat + profit > $25:
|
||
|
|
→ CLOSE (amankan sebelum reversal)
|
||
|
|
|
||
|
|
Posisi SELL + sinyal bullish kuat + profit > $25:
|
||
|
|
→ CLOSE (amankan sebelum reversal)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Drawdown from Peak
|
||
|
|
|
||
|
|
```
|
||
|
|
Peak profit > $50 DAN drawdown > 30% dari peak:
|
||
|
|
→ CLOSE (profit sudah turun terlalu banyak)
|
||
|
|
|
||
|
|
Contoh: Peak $80, sekarang $50 → drawdown 37.5% → CLOSE
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. High Urgency
|
||
|
|
|
||
|
|
```
|
||
|
|
Urgency score >= 7 (dari 10) DAN profit > 0:
|
||
|
|
→ CLOSE (banyak sinyal bahaya bersamaan)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. Breakeven Protection
|
||
|
|
|
||
|
|
```
|
||
|
|
Profit >= 15 pips:
|
||
|
|
→ Pindah SL ke breakeven + 2 poin buffer
|
||
|
|
(tidak bisa rugi lagi)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6. Trailing Stop
|
||
|
|
|
||
|
|
```
|
||
|
|
Profit >= 25 pips:
|
||
|
|
→ SL mengikuti harga dengan jarak 10 pips
|
||
|
|
(kunci profit sambil biarkan profit berjalan)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 7. Default: HOLD
|
||
|
|
|
||
|
|
```
|
||
|
|
Tidak ada kondisi terpenuhi → HOLD posisi
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## SmartMarketCloseHandler
|
||
|
|
|
||
|
|
### Market Hours (XAUUSD)
|
||
|
|
|
||
|
|
```
|
||
|
|
Minggu 17:00 EST (Senin 05:00 WIB) → Jumat 17:00 EST (Sabtu 05:00 WIB)
|
||
|
|
24 jam, 5 hari seminggu
|
||
|
|
|
||
|
|
Daily close: 05:00 WIB (= 17:00 EST hari sebelumnya)
|
||
|
|
Weekend close: Sabtu 05:00 WIB (= Jumat 17:00 EST)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Konfigurasi
|
||
|
|
|
||
|
|
```python
|
||
|
|
SmartMarketCloseHandler(
|
||
|
|
daily_close_hour_wib=5, # 05:00 WIB
|
||
|
|
hours_before_close=2.0, # "Dekat close" = 2 jam sebelumnya
|
||
|
|
min_profit_to_take=10.0, # Ambil profit >= $10 sebelum close
|
||
|
|
max_loss_to_hold=100.0, # Hold loss sampai $100
|
||
|
|
weekend_loss_cut_percent=50.0, # Cut jika SL >50% hit sebelum weekend
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4 Rekomendasi
|
||
|
|
|
||
|
|
| Rekomendasi | Kondisi | Aksi |
|
||
|
|
|-------------|---------|------|
|
||
|
|
| **CLOSE_PROFIT** | Profit + dekat close | Tutup, amankan profit |
|
||
|
|
| **CUT_LOSS_WEEKEND** | Loss besar + dekat weekend | Tutup, hindari gap |
|
||
|
|
| **HOLD_LOSS** | Loss kecil + dekat close | Hold, bisa recovery |
|
||
|
|
| **NORMAL** | Belum dekat close | Lanjut normal |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Market Analysis (Urgency Score)
|
||
|
|
|
||
|
|
```
|
||
|
|
Score dimulai dari 0, lalu ditambah:
|
||
|
|
|
||
|
|
Regime crisis/high_vol: +3
|
||
|
|
ML opposite >75% confidence: +2
|
||
|
|
RSI >75 (overbought): +2
|
||
|
|
RSI <25 (oversold): +2
|
||
|
|
Trend + momentum berlawanan: +3
|
||
|
|
|
||
|
|
Total max: ~10
|
||
|
|
Score >= 7 = HIGH URGENCY → tutup jika ada profit
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Konfigurasi SmartPositionManager
|
||
|
|
|
||
|
|
```python
|
||
|
|
SmartPositionManager(
|
||
|
|
breakeven_pips=15.0, # Breakeven setelah 15 pips profit
|
||
|
|
trail_start_pips=25.0, # Mulai trailing setelah 25 pips
|
||
|
|
trail_step_pips=10.0, # Trail distance: 10 pips
|
||
|
|
min_profit_to_protect=50.0, # Min $50 untuk proteksi profit
|
||
|
|
max_drawdown_from_peak=30.0, # Max 30% drawdown dari peak
|
||
|
|
enable_market_close_handler=True, # Aktifkan market close handler
|
||
|
|
min_profit_before_close=10.0, # Take profit $10+ sebelum close
|
||
|
|
max_loss_to_hold=100.0, # Hold loss sampai $100
|
||
|
|
)
|
||
|
|
```
|