2026-02-09 05:46:54 +07:00
# *Take Profit* (T/P) — Sistem Pengambilan Profit Cerdas
2026-02-06 09:01:35 +07:00
> **File terkait:** `src/smc_polars.py`, `main_live.py`, `src/smart_risk_manager.py`
---
2026-02-09 05:46:54 +07:00
## Flowchart Prioritas *Take Profit*
2026-02-06 09:01:35 +07:00
2026-02-09 05:46:54 +07:00
```mermaid
flowchart TD
A["Evaluasi Posisi Terbuka"] --> B{"profit >= $40?"}
B -- Ya --> B1["Layer 1: Hard TP\nTutup langsung"]
B -- Tidak --> C{"profit >= $25\nDAN momentum < -30?"}
C -- Ya --> C1["Layer 2: Momentum TP\nAmankan profit"]
C -- Tidak --> D{"peak > $30\nDAN current < 60% peak?"}
D -- Ya --> D1["Layer 3: Peak Protection\nKunci sisa profit"]
D -- Tidak --> E{"profit >= $20\nDAN TP probability < 25%?"}
E -- Ya --> E1["Layer 4: Probability TP\nAmbil sekarang"]
E -- Tidak --> F{"profit $5-15\nDAN ML reversal\nDAN momentum < -50?"}
F -- Ya --> F1["Layer 5: Early Exit\nProfit kecil > loss"]
F -- Tidak --> G["Layer 6: Broker TP\nHarga hit level otomatis"]
2026-02-06 09:01:35 +07:00
2026-02-09 05:46:54 +07:00
style B1 fill:#16a34a,color:#fff
style C1 fill:#2563eb,color:#fff
style D1 fill:#7c3aed,color:#fff
style E1 fill:#d97706,color:#fff
style F1 fill:#dc2626,color:#fff
style G fill:#64748b,color:#fff
```
2026-02-06 09:01:35 +07:00
---
2026-02-09 05:46:54 +07:00
## Apa Itu *Take Profit* di Bot Ini?
*Take Profit* bukan hanya satu target harga — ini adalah **sistem multi-layer** yang secara cerdas memutuskan kapan mengambil profit berdasarkan *momentum* , *probability* , dan *peak protection* .
**Analogi:** TP di bot ini seperti **pemanen buah pintar** — tahu kapan buah sudah matang (*Hard TP*), kapan cuaca akan buruk (*momentum* drop), dan kapan panen sebelum busuk (*Peak Protection*).
---
## Layer *Take Profit*
2026-02-06 09:01:35 +07:00
```
Layer 1: Broker TP <- Target harga dikirim ke broker (SMC-generated)
Layer 2: Hard TP <- Software tutup jika profit >= $40
Layer 3: Momentum TP <- Tutup jika profit bagus tapi momentum turun
Layer 4: Peak Protection <- Tutup jika profit turun dari peak
Layer 5: Probability TP <- Tutup jika probabilitas capai TP rendah
Layer 6: Early Exit <- Tutup profit kecil jika reversal terdeteksi
```
---
## Layer 1: Broker TP (SMC-Generated)
**Sumber:** `smc_polars.py` (Lines 654-659, 704-709)
**Dikirim ke:** Broker MT5 sebagai TP order aktif
### Perhitungan
```python
# ATR-based TP cap
atr = latest [ "atr" ] # Contoh: ATR = $8.50
max_tp_distance = 4.0 * atr # 4 * 8.50 = $34.00
# Untuk BUY:
risk = entry - sl # $4950 - $4937 = $13
tp = entry + ( risk * 2 ) # $4950 + $26 = $4976 (2:1 RR)
if tp > entry + max_tp_distance : # $4976 vs $4950 + $34 = $4984
tp = entry + max_tp_distance # Tidak kena cap, tetap $4976
# Untuk SELL:
risk = sl - entry # $4963 - $4950 = $13
tp = entry - ( risk * 2 ) # $4950 - $26 = $4924 (2:1 RR)
if tp < entry - max_tp_distance : # $4924 vs $4950 - $34 = $4916
tp = entry - max_tp_distance # Tidak kena cap, tetap $4924
```
### Kenapa TP Di-cap 4 ATR?
```
Sebelum (v2): TP = risk * 2 (tanpa batas)
-> Bisa sangat jauh ($50+ dari entry)
-> Jarang tercapai, posisi terbuka terlalu lama
Sesudah (v3): TP = MIN(risk * 2, 4 * ATR)
-> Dibatasi maksimal 4x ATR
-> Target lebih realistis, lebih sering tercapai
```
### Dikirim ke Broker
```python
# main_live.py
result = mt5 . send_order (
sl = broker_sl ,
tp = signal . take_profit , # <- TP dari SMC (ATR-capped)
...
)
```
Jika harga mencapai TP level, broker otomatis menutup posisi — tidak perlu bot online.
---
2026-02-09 05:46:54 +07:00
## Layer 2: *Hard Take Profit* ($40)
2026-02-06 09:01:35 +07:00
**Sumber:** `smart_risk_manager.py` (Lines 595-599)
```python
# Profit mencapai $40+ -> langsung tutup
if current_profit >= 40 :
return True , ExitReason . TAKE_PROFIT ,
"[TP] Target profit reached: $40.00"
```
**Kenapa $40?** Ini threshold profit yang cukup besar untuk diamankan, terlepas dari kondisi pasar.
---
2026-02-09 05:46:54 +07:00
## Layer 3: *Momentum*-Based TP ($25+)
2026-02-06 09:01:35 +07:00
**Sumber:** `smart_risk_manager.py` (Lines 601-603)
```python
# Profit $25+ tapi momentum turun -> amankan profit
if current_profit >= 25 and momentum < - 30 :
return True , ExitReason . TAKE_PROFIT ,
"[SECURE] Securing $25.00 (momentum dropping)"
```
2026-02-09 05:46:54 +07:00
### Bagaimana *Momentum* Dihitung
2026-02-06 09:01:35 +07:00
```python
# PositionGuard.calculate_momentum() (Lines 113-131)
# Melihat 5 profit history terakhir
recent_profits = profit_history [ - 5 :]
profit_change = recent_profits [ - 1 ] - recent_profits [ 0 ]
# Normalisasi: $10 change = 50 poin
momentum = ( profit_change / 10 ) * 50
# Range: -100 sampai +100
# momentum < -30 artinya profit sedang TURUN cukup cepat
```
**Visualisasi:**
```
Profit ($)
40 |
35 | /\
30 | / \ <- Momentum mulai negatif
25 |------/----\------ Layer 3 trigger: amankan!
20 | / \
15 | / \
10 | / \
5 | /
0 |_/________________________> waktu
```
---
2026-02-09 05:46:54 +07:00
## Layer 4: *Peak Protection* ($30+ peak)
2026-02-06 09:01:35 +07:00
**Sumber:** `smart_risk_manager.py` (Lines 605-607)
```python
# Profit pernah $30+ tapi sekarang turun ke 60% dari peak
if guard . peak_profit > 30 and current_profit < guard . peak_profit * 0.6 :
return True , ExitReason . TAKE_PROFIT ,
"[LOCK] Securing profit (was $35 peak)"
```
### Cara Kerja Peak Tracking
```python
# Setiap evaluasi, update peak profit
guard . peak_profit = max ( guard . peak_profit , current_profit )
# Contoh:
# Peak: $35 -> 60% = $21
# Current: $18 (turun dari $35)
# $18 < $21 -> TUTUP, lindungi sisa profit
```
**Visualisasi:**
```
Profit ($)
35 | * <- peak_profit = $35
30 | / \
25 | / \
21 |./.....\....... 60% threshold ($21)
18 | \* <- current = $18, TUTUP!
15 | \
10 | (kehilangan lebih banyak dihindari)
```
---
2026-02-09 05:46:54 +07:00
## Layer 5: *Probability*-Based TP ($20+)
2026-02-06 09:01:35 +07:00
**Sumber:** `smart_risk_manager.py` (Lines 609-611)
```python
# Probabilitas capai TP rendah + profit cukup -> ambil sekarang
if tp_probability < 25 and current_profit >= 20 :
return True , ExitReason . TAKE_PROFIT ,
"[PROB] Taking profit $20 (TP prob: 15%)"
```
2026-02-09 05:46:54 +07:00
### Cara Hitung TP *Probability*
2026-02-06 09:01:35 +07:00
```python
# PositionGuard.get_tp_probability() (Lines 133-168)
# Score 0-100% berdasarkan 4 faktor:
Factor 1 : Progress ke TP ( 0 - 40 poin )
progress = ( current_profit / target_tp_profit ) * 100
-> Makin dekat ke TP = skor tinggi
Factor 2 : Momentum ( 0 - 30 poin )
2026-02-09 05:46:54 +07:00
-> * Momentum * positif = skor tinggi
2026-02-06 09:01:35 +07:00
2026-02-09 05:46:54 +07:00
Factor 3 : ML * Confidence * Trend ( 0 - 20 poin )
-> ML * confidence * naik = skor tinggi
2026-02-06 09:01:35 +07:00
Factor 4 : Time Penalty ( 0 - 10 poin DIKURANGI )
-> 2 poin per jam ( makin lama = makin rendah )
probability = factor1 + factor2 + factor3 - time_penalty
```
---
2026-02-09 05:46:54 +07:00
## Layer 6: *Early Exit* (Profit Kecil + Reversal)
2026-02-06 09:01:35 +07:00
**Sumber:** `smart_risk_manager.py` (Lines 617-627)
```python
# Profit $5-$15 + momentum sangat buruk + ML reversal
if 5 <= current_profit < 15 :
if momentum < - 50 and ml_confidence >= 0.65 :
if ml_signal berlawanan dengan posisi :
return True , ExitReason . TAKE_PROFIT ,
"Early exit - reversal detected"
```
**Logika:** Lebih baik ambil profit kecil ($5-$15) daripada menunggu profit hilang karena reversal.
---
## Prioritas Exit (Urutan Pengecekan)
```
1. Hard TP ($40+) <- Paling prioritas
2. Momentum TP ($25+, mom<-30)
3. Peak Protection ($30+ peak, <60%)
4. Probability TP ($20+, prob<25%)
5. Early Exit ($5-15, reversal)
6. Broker TP (harga hit level) <- Independen dari software
```
**Catatan:** Broker TP berjalan independen — jika harga hit TP level di broker, posisi tertutup otomatis meskipun bot offline.
---
## Contoh Skenario
### Skenario 1: TP Broker Hit
```
Entry BUY @ $4950, TP broker @ $4976
-> Harga naik ke $4976
-> BROKER TP HIT -> Tutup otomatis
-> Profit: ~$26 (0.01 lot = $2.60)
```
### Skenario 2: Software TP Lebih Cepat
```
Entry BUY @ $4950, TP broker @ $4990
-> Harga naik ke $4990 (profit $40)
-> Software: profit >= $40 -> HARD TP
-> Tutup sebelum broker TP level
```
2026-02-09 05:46:54 +07:00
### Skenario 3: *Momentum* Drop
2026-02-06 09:01:35 +07:00
```
Entry BUY @ $4950
-> Profit naik: $10 -> $20 -> $28 -> $25
-> momentum = -35 (turun)
-> Software: profit $25 + momentum < -30
-> MOMENTUM TP: amankan $25
```
2026-02-09 05:46:54 +07:00
### Skenario 4: *Peak Protection*
2026-02-06 09:01:35 +07:00
```
Entry BUY @ $4950
-> Profit naik: $15 -> $25 -> $35 (peak!)
-> Profit turun: $35 -> $30 -> $22 -> $19
-> 60% dari $35 = $21
-> $19 < $21 -> PEAK PROTECTION: amankan $19
(tanpa ini, profit bisa turun ke $0 atau bahkan loss)
```
---
## Tabel Ringkasan Layer TP
| Layer | Trigger | Profit Min | Kondisi Tambahan |
|-------|---------|-----------|------------------|
| **1. Broker TP** | Harga hit level | - | Otomatis, independen |
2026-02-09 05:46:54 +07:00
| **2. *Hard TP** * | profit >= $40 | $40 | Tidak ada |
| **3. *Momentum* TP** | profit >= $25 | $25 | *momentum* < -30 |
| **4. *Peak Protection** * | peak > $30 | ~$18+ | current < 60% peak |
| **5. *Probability* TP** | profit >= $20 | $20 | TP *probability* < 25% |
| **6. *Early Exit** * | profit $5-15 | $5 | ML reversal + *momentum* < -50 |