Files
xau-ai-trading-bot/RECOVERY-FEATURES-ANALYSIS.md
T
buckybonez c0976c4518 feat: implement Professor AI recommendations v0.2.2 (5 critical fixes)
Exit Strategy v6.6 "Professor AI Validated" - All recommendations implemented

FIX #1: Remove Misleading Debug Code
- Removed manual trajectory calculation (line 1262-1269)
- Trajectory predictor was CORRECT, debug comparison was WRONG
- Cleaned up false "bug found" warnings

FIX #2: Peak Detection Logic (CHECK 0A.4)
- Detects approaching peak (vel > 0, accel < 0)
- Holds position if peak within 30s and 15%+ profit ahead
- Suppresses fuzzy exits during peak approach
- Target: Peak capture 38% -> 70%+
- Added peak_hold_active field to PositionGuard

FIX #3: London False Breakout Filter
- London session + ATR ratio < 1.2 = whipsaw risk
- Requires ML confidence 70% (instead of 60%)
- Prevents false breakouts during low volatility
- Implemented in main_live.py before signal logic

FIX #4: Enhanced Kelly Partial Exit Strategy
- Active for all profits >= tp_min * 0.5 (not just >$8)
- Recommends partial exits for better peak capture
- Full exit when Kelly suggests >70% close
- Note: Actual partial close needs MT5 volume parameter (TODO)

FIX #5: Unicode Encoding Fixes
- Added UTF-8 encoding to file logger
- Replaced all emoji (⚠️ -> [WARNING]) and arrows (-> -> ->)
- No more UnicodeEncodeError on Windows console
- Fixed in 11 src/*.py files

Expected Performance:
- Peak Capture: 38% -> 70%+ (+84%)
- Avg Profit: $2.00 -> $4.50 (+125%)
- Risk/Reward: 0.49 -> 1.2+ (+145%)
- Win Rate: Maintain 76%

Files Modified:
- src/smart_risk_manager.py (peak detection, Kelly, unicode)
- src/trajectory_predictor.py (unicode arrows)
- main_live.py (London filter, UTF-8 encoding)
- src/*.py (unicode cleanup: 11 files)
- VERSION (0.2.1 -> 0.2.2)
- CHANGELOG.md (comprehensive v0.2.2 docs)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 18:16:34 +07:00

8.9 KiB
Raw Blame History

ANALISA RECOVERY FEATURES - Bot Punya Apa Saja?

YA! Bot Punya Recovery System Lengkap

1. GRACE PERIOD - Waiting Time untuk Recovery

Cara kerja:

# 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:

# 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:

# 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

# 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

# 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

# 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:

# 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

# Line 102
momentum_score: float = 0  # -100 to +100, positive = moving towards TP

Calculation:

# 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:

# 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

# 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:

# 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:

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?