Files
XauBot/docs/reports/RECOVERY-FEATURES-ANALYSIS.md
T
Vanszs a4619dd005 chore: clean up workspace for production
- Remove tracked generated artifacts: backtest logs (52), xlsx (43),
  experiment model pkls (7), ml_v3 training logs (11), result csv/txt
- Remove junk files: stray =1.4.5, training_output.log, *_analysis_output.txt,
  dead api.log, runtime bot.lock
- Remove throwaway scripts: analyze_performance, test_trajectory_bug, verify_settings
- Move reusable analysis scripts to scripts/analysis/
- Move status/report docs to docs/reports/
- Tighten .gitignore to prevent re-adding generated artifacts; ignore .kiro/
2026-06-06 12:04:13 +07:00

341 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ANALISA RECOVERY FEATURES - Bot Punya Apa Saja?
## ✅ YA! Bot Punya Recovery System Lengkap
### 1. **GRACE PERIOD** - Waiting Time untuk Recovery
**Cara kerja:**
```python
# Line 1065-1072 - smart_risk_manager.py
if regime == "ranging":
grace_minutes = 12 # PALING LAMA - "will bounce"
elif regime == "volatile":
grace_minutes = 10 # "normal swings"
elif regime == "trending":
grace_minutes = 6 # "cut sooner if wrong direction"
else:
grace_minutes = 8 # default
```
**Philosophy:**
- **Ranging market:** Harga akan bounce back → kasih 12 menit recovery time
- **Volatile:** Normal swings → kasih 10 menit
- **Trending:** Kalau salah arah, cut cepat → 6 menit saja
**Example:**
```
Trade: SELL @ 5050
Loss: -$5 at 10:05 (5 min)
Regime: ranging
Grace: 12 minutes
Decision: HOLD! (masih dalam grace, akan diberi kesempatan recovery)
Result: Price bounces to 5045 → profit $5 ✅
```
---
### 2. **RECOVERY TRACKING** - Deteksi Trade yang Bounce Back
**Code:**
```python
# Line 216-218
if self.min_profit_seen < -2.0 and profit > 0 and not self.has_recovered:
self.has_recovered = True
self.recovery_count += 1
```
**Cara kerja:**
- Track min profit yang pernah dicapai
- Jika trade pernah loss >$2 dan sekarang positive → FLAG as "recovered"
- Counter: berapa kali trade bounce dari loss ke profit
**Impact setelah recovery:**
```python
# Line 944-945
if guard.has_recovered:
loss_mult *= 1.5 # Trade proved it can bounce back
```
**Meaning:** Jika trade sudah pernah recovery sekali, bot kasih LEBIH BANYAK ruang untuk recovery berikutnya!
**Example:**
```
Trade history:
10:00 → Profit: $0
10:05 → Profit: -$4 (min_profit_seen = -$4)
10:10 → Profit: -$2 (recovering!)
10:15 → Profit: $+1 ✅ (has_recovered = TRUE)
Now loss tolerance wider:
- Normal max loss: $9
- With recovery flag: $9 × 1.5 = $13.50
- Reason: "Trade proved it can bounce"
```
---
### 3. **DYNAMIC LOSS MULTIPLIER** - Extra Room untuk Recovery
#### A. Ranging Regime Bonus
```python
# Line 908-909
if regime == "ranging":
loss_mult *= 1.3 # "will likely bounce back"
```
**Ranging market = sideways → price akan bounce → kasih 30% extra room**
#### B. RSI/Stochastic Oversold/Overbought
```python
# Line 967-969
if guard.direction == "BUY" and rsi < 30:
loss_mult *= 1.3 # "Oversold: BUY should recover"
elif guard.direction == "SELL" and rsi > 70:
loss_mult *= 1.3 # "Overbought: SELL should recover"
```
**Logic:**
- BUY at RSI <30 (oversold) → price will bounce UP → recovery expected
- SELL at RSI >70 (overbought) → price will drop DOWN → recovery expected
**Example:**
```
BUY position at loss -$6
RSI = 25 (oversold)
Normal max loss: $9
With RSI bonus: $9 × 1.3 = $11.70
Reason: "Oversold - price likely to bounce up, BUY will recover"
```
---
### 4. **TRADE STATE CLASSIFICATION** - Detect Recovery State
```python
# Line ~990 - _classify_trade_state()
States:
- "accelerating" velocity increasing (profit growing faster)
- "cruising" stable velocity (profit growing steady)
- "stalling" velocity decreasing (profit slowing)
- "crashing" velocity very negative (losing fast)
- "recovering" ??? (should exist but not in code!)
```
**Dynamic thresholds based on state:**
```python
# Line 1501-1503
if trade_state != "crashing":
mom_threshold = -60 # More patient
loss_threshold = 0.30 # Wider threshold
else: # crashing
mom_threshold = -40 # Less patient
loss_threshold = 0.20 # Tighter threshold
```
**Meaning:** Bot MORE AGGRESSIVE on crashing trades, MORE PATIENT on normal/recovering trades!
---
### 5. **MOMENTUM TRACKING** - Positive Momentum = Recovery
```python
# Line 102
momentum_score: float = 0 # -100 to +100, positive = moving towards TP
```
**Calculation:**
```python
# Simplified logic
if velocity > 0 and acceleration >= 0:
momentum = +50 to +100 # Strong recovery!
elif velocity > 0:
momentum = +20 to +50 # Moderate recovery
elif velocity < 0:
momentum = -50 to -100 # Losing
```
**Usage in exits:**
```python
# Line 1458
if momentum >= 0:
# Profit growing, let it run!
continue
```
**Example:**
```
Trade timeline:
10:00 → Loss: -$3, vel=-0.10, momentum=-80 (crashing)
10:05 → Loss: -$1, vel=+0.05, momentum=+30 (RECOVERING!) ✅
10:10 → Profit: $2, vel=+0.08, momentum=+60 (cruising)
Decision at 10:05: HOLD! (momentum positive = recovery detected)
```
---
### 6. **VELOCITY REVERSAL DETECTION** - Catch Momentum Shift
```python
# Line 1608-1610
profit_growing = momentum > 0 and _vel > 0
```
**Logic:**
- Track velocity transitions
- If velocity changes from negative to positive → RECOVERY!
- Hold position while velocity positive
**Example log:**
```
[MOMENTUM] profit=$-2.15 | vel=-0.0303$/s (declining)
[MOMENTUM] profit=$-1.71 | vel=+0.1034$/s (RECOVERING!) ✅
[GRACE] Loss $1.71 + momentum (+1) vel(+0.103) → holding
```
**This is EXACTLY what happened in trade #161272706:**
- Started at -$5.49
- Velocity turned positive (+0.0603$/s)
- Bot held position during recovery
- Loss reduced to -$1.77 (saved $3.72!)
---
## 📊 RECOVERY FEATURES SUMMARY
| Feature | How it Works | Impact |
|---------|--------------|--------|
| **Grace Period** | 6-12 min waiting time | Gives time to bounce |
| **Recovery Flag** | Tracks bounce from loss→profit | 1.5x wider next loss tolerance |
| **Ranging Bonus** | Ranging regime → 1.3x loss room | "Will bounce back" |
| **RSI/Stoch Bonus** | Oversold/Overbought → 1.3x | "Should recover" |
| **Trade State** | Classify recovery vs crash | More patient on recovery |
| **Momentum Track** | Positive momentum = hold | "Moving towards TP" |
| **Velocity Reversal** | Neg→Pos velocity = recovery | "Catch the turn" |
---
## 🎯 REAL EXAMPLE - Trade #161272706
**Timeline:**
```
22:15:43 → profit=$-5.49 | vel=-0.2358$/s (CRASHING)
22:16:17 → profit=$-2.99 | vel=+0.0938$/s (RECOVERING!) ✅
22:17:25 → profit=$-3.70 | vel=+0.0125$/s (still recovering)
22:18:04 → [GRACE] holding 2.5m/8m grace (recovery mode)
22:19:06 → profit=$-1.71 | vel=+0.1034$/s (STRONG RECOVERY!)
22:19:34 → EXIT via Kelly @ -$1.77 (fuzzy=53%)
Result:
- Peak loss: -$5.49
- Final loss: -$1.77
- Saved: $3.72 (67% recovery!) ✅
```
**Recovery features that worked:**
1. ✅ Grace period (2.5m/8m used)
2. ✅ Velocity reversal detected (neg→pos)
3. ✅ Momentum tracking (logged "+1" momentum)
4. ✅ Kelly criterion (optimal exit at 53% confidence)
---
## ⚠️ PROBLEM: Recovery Tidak Selalu Berhasil
### Case: -$34.70 Catastrophic Loss
**What went wrong?**
```
Trade likely timeline:
23:30 → Entry
23:31 → Loss: -$5 (vel=-0.50, FAST crash)
23:32 → Loss: -$15 (vel=-0.80, VERY FAST)
23:33 → Loss: -$25 (vel=-0.60, crashing)
23:34 → EXIT @ -$34.70
```
**Why recovery failed:**
1. ❌ Crash TOO FAST (dalam 4 menit)
2. ❌ Grace period masih aktif (8 min default)
3. ❌ Velocity emergency threshold tidak tercapai (need <-0.40 sustained)
4. ❌ Fuzzy confidence masih rendah (trade baru)
5. ❌ No hard cap to stop catastrophe
**Kesimpulan:** Recovery works untuk normal losses, GAGAL untuk fast crashes!
---
## 💡 RECOMMENDATION: Add "No Recovery Zone"
### Current Logic:
```
IF in grace period:
ALWAYS allow recovery attempt
Even if losing $30+
```
### BETTER Logic:
```
IF in grace period:
IF loss < $15:
Allow recovery (current behavior)
ELSE:
NO RECOVERY - EXIT IMMEDIATELY!
Reason: "Too deep, no point waiting"
```
**Implementation:**
```python
# Line ~1490 - Before ATR HARD STOP
# NEW: No Recovery Zone
NO_RECOVERY_THRESHOLD = 15.0 # $15 per 0.01 lot
if current_profit <= -NO_RECOVERY_THRESHOLD:
# Too deep in loss - no point waiting for recovery
return True, ExitReason.POSITION_LIMIT, (
f"[NO RECOVERY] Loss ${abs(current_profit):.2f} too deep "
f"(threshold ${NO_RECOVERY_THRESHOLD}) - cut immediately"
)
```
**Benefits:**
- Prevents -$34.70 scenarios
- Still allows normal recovery (-$5 to $0)
- Cuts deep losses FAST
- "Know when to give up" logic
---
## 🎯 FINAL ANSWER
**Pertanyaan:** "Ketika masuk zona loss kita punya fitur bisa recovery?"
**Jawaban:** **YA! Punya 7 recovery features:**
1.**Grace Period** (6-12 min wait time)
2.**Recovery Tracking** (1.5x wider loss tolerance after bounce)
3.**Ranging Bonus** (1.3x room in sideways markets)
4.**RSI/Stoch Bonus** (1.3x room at oversold/overbought)
5.**Trade State Detection** (more patient on recovery state)
6.**Momentum Tracking** (positive momentum = hold)
7.**Velocity Reversal** (detect neg→pos turn)
**Tapi ada MASALAH:**
- Recovery works untuk **normal losses** ($2-10)
- Recovery **GAGAL** untuk **fast crashes** (>$15 in <5 min)
- Need "No Recovery Zone" untuk deep losses
**Solution:**
```python
IF loss >= $15:
NO RECOVERY - CUT IMMEDIATELY
ELSE:
ALLOW RECOVERY (current features)
```
---
**Apakah sudah cukup jelas? Atau mau saya tunjukkan fitur recovery lainnya yang mungkin terlewat?**