Files
buckybonez 7044c42b44 fix(v0.2.8): trajectory override now recovery-based (critical fix)
Trade #162698852 predicted +$4.54 recovery (80% conf) but override failed.
Bug: checked pred_1m > 0 (absolute) instead of recovery amount.

Fix:
- Recovery-based: recovery_amount = pred_1m - current_profit
- Override if recovery >$3 OR near-breakeven (pred >-$2)
- Relaxed accel threshold: 0.01 → 0.005
- User requirement: "profit kecil dengan interval lama OK" 

Impact: Same scenario now triggers override, holds 5-15 min for recovery.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 23:37:14 +07:00

943 lines
36 KiB
Markdown
Raw Permalink 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.
# Changelog
All notable changes to XAUBot AI will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
---
## [0.2.8] - 2026-02-11
### Fixed (Critical: Trajectory Override Logic Bug)
**Problem:** Trade #162698852 lost -$5.81 despite trajectory predicting recovery from -$5.81 → -$1.27 (recovery +$4.54, conf 80%). Trajectory override did NOT trigger because condition checked `pred_1m > 0` (absolute profit) instead of RECOVERY AMOUNT.
#### Bug in v0.2.7
```python
# OLD (WRONG):
if pred_1m > 0 AND confidence > 75% AND accel > 0.01:
OVERRIDE
# Trade #162698852 at exit:
# - current_profit = -$5.81
# - pred_1m = -$1.27 (NEGATIVE) ❌
# - accel = +0.009913 (< 0.01) ❌
# Result: Override FAILED, exit at -$5.81
```
#### Root Cause
**Trajectory override condition was TOO STRICT:**
1. Required absolute profit (pred > 0), but market volatility means pred can be slightly negative even when recovering
2. Ignored RECOVERY DIRECTION — trade predicted to improve from -$5.81 → -$1.27 = **+$4.54 recovery!**
3. Acceleration threshold 0.01 too high (0.009913 failed by 0.0001)
#### Fix: Recovery-Based Override
```python
# NEW (CORRECT):
recovery_amount = pred_1m - current_profit
significant_recovery = recovery_amount > 3.0 # Predict >$3 improvement
near_breakeven = pred_1m > -2.0 # Or predict small loss only
strong_confidence = confidence > 0.75
positive_momentum = accel > 0.005 # Relaxed from 0.01
if (significant_recovery OR near_breakeven) AND strong_confidence AND positive_momentum:
OVERRIDE
# Trade #162698852 with fix:
# - recovery_amount = -$1.27 - (-$5.81) = +$4.54 ✅ (>$3)
# - confidence = 80% ✅
# - accel = +0.009913 ✅ (>0.005)
# Result: Override TRIGGERED, hold for recovery
```
#### Changes
1. **Golden Emergency Override:** Check recovery amount instead of absolute profit
2. **Trajectory Hold Logic:** Same recovery-based check
3. **Relaxed thresholds:**
- Acceleration: 0.01 → 0.005 (more sensitive)
- Accept near-breakeven: pred > -$2 (small loss OK if recovering)
#### Impact
- v0.2.7: Trade #162698852 exit at -$5.81 (no override)
- v0.2.8: Same scenario would OVERRIDE → hold 5-10 min → potential recovery to profit or small loss
- User requirement: "recovery meskipun profit kecil dengan interval lama tidak apa" — NOW IMPLEMENTED
#### Code Cleanup
- Searched for dead code (if False, DEPRECATED, etc.) — none found
- Imports optimized
- No unused functions detected
---
## [0.2.7] - 2026-02-11
### Added (Trajectory Recovery System for Golden Session)
**Problem:** Trade #162626070 lost -$6.07 at 22:45 in Golden Session despite trajectory predicting +$3.81 recovery (78% confidence). Actual market 31 min later showed would-be profit of +$5.05. Bot cut too early due to Golden Emergency exit, ignoring strong recovery signals.
#### Root Cause
1. **Golden Emergency hard rule** (loss >$5 + 45s + never-profitable) → immediate cut, no exceptions
2. **Trajectory Hold disabled** for never-profitable trades (v0.2.5e fix to prevent bad holds)
3. **Conflict:** Emergency exit vs Recovery prediction — emergency always wins
4. **Result:** Trade with 78% confidence recovery prediction gets cut, misses +$5 profit
#### Solution: Trajectory Override System
**1. Golden Emergency Threshold Extended**
- Changed trigger time: **45s → 60s** (align with grace period floor)
- Gives more time for trajectory and recovery systems to activate
**2. Trajectory Override for Strong Recovery**
```python
# Before cutting in Golden Emergency, check trajectory:
if pred_1m > 0 AND confidence > 75% AND acceleration > 0.01:
OVERRIDE emergency exit, continue holding
else:
Proceed with emergency cut
```
**3. Hybrid Trajectory Hold Logic**
- **Ever-profitable trades:** Trajectory hold ACTIVE (no change from v0.2.5e)
- **Never-profitable + Golden + strong signal (>75% conf):** Trajectory hold NOW ACTIVE (NEW)
- **Never-profitable + normal session:** Trajectory hold DISABLED (no change from v0.2.5e)
#### Impact Analysis
**Trade #162626070 with v0.2.7:**
```
22:45:02 ENTRY -$0
22:45:43 pred=$0.55 conf=77% ✅ → Trajectory hold activated
22:45:48 pred=$3.81 conf=78% ✅ → Golden Emergency OVERRIDDEN
22:46:00+ Continue holding...
22:50-23:00 Price recovery → Exit with profit $2-5
```
**Recovery Time Extension:**
- Current (v0.2.6): Golden never-profitable = **47s max hold** (hard cut)
- After fix (v0.2.7): Golden never-profitable = **up to 15 min** if strong recovery signal
- Normal session: **No change** (fast cut for never-profitable without recovery signal)
**Safety Nets Still Active:**
- NO_RECOVERY threshold $15 (last resort)
- EMERGENCY_MAX_LOSS $20 (absolute cap)
- Fuzzy/Kelly exits active after grace period
- Only override if trajectory confidence >75% AND positive acceleration
#### Expected Outcome
- Reduce "early cut" losses on trades with strong recovery potential
- Golden Session: Smart waiting (only if model predicts profit)
- Maintain fast cut for trades without recovery signals
- Balance: more recovery time vs controlled risk
---
## [0.2.6] - 2026-02-11
### Fixed (Critical: Grace Period & Threshold Unit Bugs)
**Problem:** Trade #162554401 lost -$8.01 in Golden Session. Fuzzy exit confidence was 94.58% at t=86s but was SUPPRESSED by grace period. Three critical bugs discovered:
#### BUG FIX 1: Fuzzy/Kelly Grace Threshold Wrong Unit
- `abs(current_profit) < 200` was meant to be $2.00 but current_profit is in DOLLARS
- So `200` = $200 threshold — effectively suppressed ALL loss exits during grace
- **Fix:** Changed to `abs(current_profit) < 2.0` — only suppress micro-losses (<$2)
#### BUG FIX 2: Fuzzy/Kelly Grace Period Not Unified
- Fuzzy/Kelly section had its OWN hardcoded grace (90s for high_volatility)
- This IGNORED all v0.2.5 fixes (ever_profitable cap, Golden Session reduction)
- **Fix:** Replaced hardcoded dict with `grace_minutes * 60` (unified dynamic grace)
#### BUG FIX 3: NO_RECOVERY & EMERGENCY Thresholds Wrong Unit
- `NO_RECOVERY_THRESHOLD = 1500` ($1500) and `EMERGENCY_MAX_LOSS = 2000` ($2000)
- These safety nets NEVER trigger for 0.01 lot trades (max ~$25 loss)
- **Fix:** Changed to 15.0 ($15) and 20.0 ($20) respectively
#### NEW: Golden Session Emergency Exit
- Never-profitable trades in Golden Session with loss > $5 after 45s → immediate exit
- No grace period, no fuzzy threshold — just cut the loss fast
- Golden Session floor reduced: 1.0 min (never-profitable) / 1.5 min (ever-profitable)
#### Impact Analysis
- Trade #162554401 scenario: fuzzy 94.58% at -$7.93 would now EXIT (not suppressed)
- Grace period in Golden + never-profitable: 72s (was 90s hardcoded)
- Losses > $2 no longer suppressed during grace period at all
- Safety nets (NO_RECOVERY $15, EMERGENCY $20) now actually functional
---
## [0.2.5] - 2026-02-11
### Fixed (Professor AI Analysis: Golden Session + Loss Protection)
**Problem:** v0.2.4 caused -$17.52 loss in 8 minutes during Golden Session (London-NY Overlap).
Two trades (#162324181: -$8.20, #162333556: -$9.32) both with SMC 63% (FVG only), ML HOLD 50%.
#### Root Cause Analysis
1. **Grace period too long for never-profitable trades** — 5 min grace given to trade that NEVER saw profit
2. **Max loss WIDENED during trade** — Dynamic multiplier changed from "declining"→"stalling", widening stop from $7.9→$8.8
3. **Golden Session (20:00-00:00 WIB) has extreme volatility** — No special handling despite ATR 1.20x+
#### Fix #3: Grace Period for Never-Profitable Trades
- Added `ever_profitable` field to PositionGuard (true once profit > $0.50)
- Trades that were NEVER profitable: grace capped at **2 minutes max** (was 5-8 min)
- Trades that were once profitable: normal grace (regime-based)
#### Fix #4: Monotonic Max Loss Ratchet
- Added `tightest_max_loss` and `tightest_atr_loss` fields to PositionGuard
- `effective_max_loss` can only TIGHTEN (shrink), never widen back
- `max_atr_loss` can only TIGHTEN, never widen back
- Prevents: trade state changing from "declining"→"stalling" widening the stop
#### Golden Session Special Handling
- `market_context` now includes `is_golden`, `session_name`, `session_volatility`
- During Golden Session (London-NY Overlap):
- `loss_mult *= 0.70` — 30% tighter max loss tolerance
- `profit_mult *= 0.85` — Take profit slightly sooner (fast reversals)
- Grace period reduced by 40% (`grace *= 0.60`)
- Combined with Fix #3: never-profitable trade in Golden = 2 min max grace
- Enhanced dynamic log shows: `[GOLDEN]` tag, ratchet values, ever_profitable status
#### Expected Impact
- **Trade #162324181 scenario:** Grace 5m → 1.2m (golden×never-profitable), max_loss $8.8 → stays at $7.9
- **Trade #162333556 scenario:** Grace 5m → 1.2m, tighter stop = earlier exit = smaller loss
- **Net reduction:** -$17.52 → estimated -$8 to -$12 (30-55% improvement)
---
## [0.2.4] - 2026-02-11
### Fixed (CRITICAL: Restore TRUE SMC-Only Logic)
**User Discovery:** v0.2.3 logic was WRONG - still blocking SMC signals based on ML!
#### Problem Identified
- **User:** "Perasaan tadi sebelum perbaikan, kita mengabaikan ML dan fokus SMC saja"
- **Investigation:** v0.2.3 still had 3-tier logic that BLOCKS SMC 60-75% if ML disagrees
- **Original v4:** ML filters DISABLED - SMC signal = immediate trade (except SELL filter)
- **v0.2.3 mistake:** Added medium tier that requires ML agreement (WRONG!)
#### Root Cause Analysis
```python
# ORIGINAL v4 (CORRECT - SMC-Only):
if smc_signal:
if ml_agrees:
confidence = avg(smc, ml) # Boost
else:
confidence = smc # Use SMC as-is
execute() # ALWAYS execute
# v0.2.3 (WRONG - Still blocking):
if smc >= 75%:
execute()
elif smc 60-75%:
if ml_agrees: # ← WRONG! This blocks trades!
execute()
else:
skip() # ← Blocked signal 63% wrongly!
```
#### Example Impact
- **Signal:** SMC BUY 63%, ML HOLD 50%
- **v0.2.3 behavior:** ❌ BLOCKED (medium tier needs ML confirm)
- **Should be:** ✅ EXECUTE (SMC-only mode)
#### Solution Implemented
**Logic v6 - TRUE SMC-Only:**
```python
if smc_signal and smc_conf >= 0.55:
# SELL filter (only exception)
if signal == "SELL":
if ml_signal != "SELL" or ml_conf < 0.75:
skip() # SELL safety filter
# For all other signals: ML is OPTIONAL boost
if ml_agrees:
confidence = avg(smc, ml) # Boost
else:
confidence = smc # Use SMC as-is (ML IGNORED)
execute() # ALWAYS execute if SMC >= 55%
```
**Key Changes:**
- ❌ Removed: 3-tier logic (HIGH/MEDIUM/LOW)
- ✅ Added: Single threshold (>= 55%)
- ✅ ML role: OPTIONAL boost only (not blocker)
- ✅ SELL filter: Only exception (requires ML >= 75%)
**Expected Behavior:**
| SMC | ML | v0.2.3 (Wrong) | v0.2.4 (Correct) |
|-----|-----|----------------|------------------|
| BUY 63% | HOLD 50% | ❌ BLOCKED | ✅ EXECUTE (conf 63%) |
| BUY 75% | HOLD 50% | ✅ EXECUTE (conf 71%) | ✅ EXECUTE (conf 75%) |
| BUY 80% | BUY 70% | ✅ EXECUTE (conf 75%) | ✅ EXECUTE (conf 75%) |
| SELL 75% | HOLD 50% | ✅ EXECUTE | ❌ BLOCKED (safety) |
**Files Modified:**
- `main_live.py` - Signal logic v6 (line 1940-2010)
- `VERSION` - Updated to 0.2.4
- `CHANGELOG.md` - This entry
**User Feedback Integration:**
- ✅ "Mengabaikan ML" - ML truly ignored (except SELL safety)
- ✅ "Fokus SMC saja" - SMC >= 55% executes always
- ✅ Original v4 intention restored
---
## [0.2.3] - 2026-02-11
### Fixed (SMC Primary Strategy Restoration)
**Philosophy Change:** SMC is PRIMARY, ML is SECONDARY support (not blocker)
#### Problem Identified
- **User Feedback:** "SMC adalah patokan utama, ML hanya pendukung"
- **Issue:** v0.2.2 London Filter + SELL Filter blocking high-confidence SMC signals
- **Example:** SMC BUY 75% confidence blocked because ML predicted HOLD 50%
- **Impact:** Missing profitable trades when SMC is confident
#### Solutions Implemented
**FIX #1: London Filter - Penalty Instead of Block** 🔧
```python
# BEFORE (v0.2.2):
if is_london and atr_ratio < 1.2:
if ml_confidence < 0.70:
return None # BLOCKS trade completely!
# AFTER (v0.2.3):
if is_london and atr_ratio < 1.2:
london_penalty = 0.90 # Reduce confidence by 10%, don't block
```
- **Impact:** SMC signals no longer blocked, only confidence adjusted
- **Files:** `main_live.py` line 1910-1935
**FIX #2: Signal Logic v5 - SMC Primary Hierarchy** 🎯
```python
# NEW 3-TIER LOGIC:
if smc_confidence >= 0.75:
# TIER 1: HIGH CONFIDENCE - Execute regardless of ML
execute_trade(confidence = smc * 0.95 if ML disagree else avg(smc, ml))
elif smc_confidence >= 0.60:
# TIER 2: MEDIUM CONFIDENCE - Require ML agreement
if ml_agrees and ml_confidence >= 0.60:
execute_trade(confidence = avg(smc, ml))
else:
skip()
else:
# TIER 3: LOW CONFIDENCE - Skip (SMC not confident)
skip()
```
**Logic Changes:**
- **SMC >= 75%:** Execute ALWAYS (ML only boosts/minor penalty)
- **SMC 60-75%:** Needs ML confirmation (both agree)
- **SMC < 60%:** Skip (SMC itself not confident)
- **SELL Filter:** Removed (SMC confidence determines execution)
**Expected Results:**
- ✅ High SMC confidence (75-85%) trades execute
- ✅ No more blocking from ML HOLD predictions
- ✅ ML still provides boost when agrees (+5-10% confidence)
- ✅ ML disagree on high SMC = minor penalty (-5% confidence)
**Trade Scenarios:**
| SMC | ML | Old (v0.2.2) | New (v0.2.3) |
|-----|-----|--------------|--------------|
| BUY 85% | HOLD 50% | ❌ BLOCKED (London filter) | ✅ EXECUTE (conf 81%) |
| BUY 75% | BUY 70% | ✅ EXECUTE (conf 73%) | ✅ EXECUTE (conf 73%) |
| BUY 65% | HOLD 50% | ❌ BLOCKED (ML disagree) | ❌ SKIP (needs ML) |
| SELL 80% | HOLD 60% | ❌ BLOCKED (SELL filter) | ✅ EXECUTE (conf 76%) |
**Files Modified:**
- `main_live.py` - Signal aggregation logic rewritten (line 1936-2035)
- `VERSION` - Updated to 0.2.3
- `CHANGELOG.md` - This entry
---
## [0.2.2] - 2026-02-11
### Fixed (Professor AI Optimizations - 5 Critical Fixes)
**Exit Strategy v6.6 "Professor AI Validated"** - Implementing all Professor AI recommendations
#### Trade Analysis Summary
- **Trade #162091505:** +$0.27 profit, but only **38% peak capture** ($0.71 peak)
- **Win Rate:** 76% (excellent) but **Avg Loss 2x Avg Win** (poor risk/reward)
- **Risk/Reward:** 0.49 (below 1.0, target >1.5)
- **Problem:** Exit too aggressive, loses 62% of peak profit
#### Professor AI Diagnosis
1.**Trajectory predictor bug:** Manual calculation over-predicts 17-61x (misleading debug output)
2.**Poor peak capture:** 38% vs target 70%+ (early exit on deceleration)
3.**False breakout risk:** London + low ATR = potential whipsaw (no filter)
4. ⚠️ **Partial exit missing:** No 50% profit taking at tp_target (all-or-nothing)
5.**Unicode errors:** Emoji/arrows break Windows console logging
#### Solutions Implemented
**FIX #1: Remove Misleading Debug Code** 🔧
```python
# REMOVED dead code:
manual_1m = current_profit + _vel * 60 + 0.5 * _accel * 60**2
# ^ This was NOT dampened, always showed 17-61x "error"
# Trajectory predictor is CORRECT, debug was wrong!
```
- **Impact:** Clean logs, no more false bug warnings
- **Files:** `src/smart_risk_manager.py` line 1262-1269 removed
**FIX #2: Peak Detection Logic (CHECK 0A.4)** 🎯
```python
# NEW CHECK: Hold when approaching peak
if profit >= tp_min and vel > 0.02 and accel < -0.001:
time_to_peak = -vel / accel # When velocity reaches 0
if 0 < time_to_peak <= 30: # Peak within 30 seconds
peak_estimate = profit + vel*t + 0.5*accel*
if peak_estimate > profit * 1.15: # 15% more profit ahead
HOLD() # Suppress fuzzy exit
```
- **Impact:** Prevents early exit when profit still rising but decelerating
- **Example:** Profit $0.50, vel=+0.05, accel=-0.002 → peak in 25s at $1.15 → HOLD
- **Expected:** Peak capture 38% → 70%+
- **Files:** `src/smart_risk_manager.py` CHECK 0A.4 (line 1550+)
**FIX #3: London False Breakout Filter** ⚠️
```python
# NEW: Filter whipsaws in London + low volatility
if session == "London" and atr_ratio < 1.2:
# London + quiet = whipsaw risk
if ml_confidence < 0.70: # Require HIGHER confidence (60% -> 70%)
SKIP_ENTRY()
```
- **Impact:** Reduces false breakouts during London low-vol periods
- **Trade #162091505:** Started at 16:54 London session, atr_ratio likely <1.2
- **Expected:** Win rate 76% maintained, fewer whipsaw losses
- **Files:** `main_live.py` line 1907+ (before signal logic)
**FIX #4: Enhanced Kelly Partial Exit Strategy** 💰
```python
# BEFORE: Kelly only for large profits (>$8) with fuzzy >80%
if profit >= 8.0 and exit_confidence > 0.80:
kelly_full_exit()
# AFTER: Kelly active for ALL profits >= tp_min * 0.5
if profit >= tp_min * 0.5: # Earlier activation
kelly_fraction = calculate_optimal_fraction()
if 0.3 <= kelly_fraction < 1.0:
LOG("[KELLY PARTIAL] Recommend close {frac}%")
# TODO: Implement mt5.close_position(ticket, volume=lot*frac)
elif kelly_fraction >= 0.70:
FULL_EXIT()
```
- **Impact:** Recommends partial exits (50% at tp_target * 0.5) for peak capture
- **Note:** Actual partial close implementation requires MT5 volume parameter
- **Expected:** Risk/Reward 0.49 → 1.2+ (avg profit/trade $2.00 → $4.50)
- **Files:** `src/smart_risk_manager.py` line 1426-1444
**FIX #5: Unicode Encoding Errors** 🔧
```python
# BEFORE:
logger.add("logs/bot.log", ...) # No encoding (Windows cp1252 breaks on emoji)
# AFTER:
logger.add("logs/bot.log", encoding="utf-8", ...) # UTF-8 for emoji support
# ALSO: Replace all emoji/arrows with ASCII
"→" -> "->"
"⚠️" -> "[WARNING]"
"⏳" -> "[removed]"
```
- **Impact:** No more `UnicodeEncodeError: 'charmap' codec` errors
- **Files:** `main_live.py` (logger setup), `src/*.py` (emoji/arrow replacement)
#### Expected Performance Improvement
| Metric | Before (v0.2.1) | Target (v0.2.2) | Improvement |
|--------|-----------------|-----------------|-------------|
| **Peak Capture** | 38% | 70%+ | +84% |
| **Avg Profit/Trade** | $2.00 | $4.50 | +125% |
| **Risk/Reward** | 0.49 | 1.2+ | +145% |
| **Win Rate** | 76% | 76% (maintain) | 0% |
| **Avg Loss** | -$4.10 | -$3.00 | -27% |
#### Trade Retrospective (v0.2.2)
Will validate after 5-10 trades:
- Peak capture improvement from better deceleration handling
- Reduced whipsaw losses from London filter
- Better profit/loss ratio from partial exits
---
## [0.2.1] - 2026-02-11
### Fixed (Fast Exit Optimization - Peak Capture Improvement)
**Exit Strategy v6.5.1 "Faster Crash Exits"** - Addressing 35% peak capture issue from Trade #162076645
#### Problem Identified (Trade #162076645)
- Trade peaked at **$1.10** but closed at **$0.39** (only **35% peak capture**)
- Crash detected at 16:45:25 (predicted -$25.56) but exit **delayed 23 seconds**
- Velocity crashed from +0.2481 → -0.0299 $/s in 5 seconds (extreme flip!)
- Lost **$0.69** (64% of peak) waiting for fuzzy threshold
- **Root Cause:** Dampening made crash warnings "less urgent" + fuzzy threshold too high
#### Solutions Implemented
**FIX 1: Dynamic Fuzzy Threshold on Crash** 🎯
```python
# BEFORE v0.2.0:
if profit < 3.0:
threshold = 0.75 # Fixed, even during crashes
# AFTER v0.2.1:
if trajectory_pred < 0: # Crash predicted
threshold = threshold - 0.10 # Lower by 10%
# $1.08 crash → 75% - 10% = 65% → exit faster!
```
- **Impact:** Exits 10-20 seconds faster when crash detected
- **Trade #162076645:** Would exit at $1.08 (65% threshold) instead of waiting for $0.39 (76%)
- **Expected:** Peak capture 35% → 70%+
**FIX 2: Asymmetric Dampening** ⚖️
```python
# BEFORE v0.2.0:
growth_damped = growth * 0.30 # Dampen ALL (positive & negative)
# Problem: Crash -$87 → Damped -$26 (less urgent!)
# AFTER v0.2.1:
if growth > 0:
growth_damped = growth * 0.30 # Dampen optimism
else:
growth_damped = growth * 1.00 # DON'T dampen crashes!
# Solution: Crash -$87 → RAW -$87 (urgent!)
```
- **Impact:** Crash predictions stay URGENT (not dampened)
- **Positive predictions:** Still dampened to prevent over-optimism
- **Trade #162076645:** Crash -$87.72 RAW (not -$25.56) → immediate panic exit!
**FIX 3: Velocity Crash Override** 🚨
```python
# NEW CHECK 0A.3: Emergency exit on extreme velocity flips
if velocity < -0.05 and prev_velocity > 0.10:
if velocity_drop > 0.15: # Extreme crash
return INSTANT_EXIT # Bypass fuzzy threshold!
```
- **Impact:** Instant exit on extreme momentum crashes (no delay!)
- **Trade #162076645:** vel +0.2481 → -0.0299 (drop 0.2780 > 0.15) → instant exit at $1.08!
- **Bypasses:** Fuzzy logic, trajectory override, all delays
### Changed
- Version bumped from 0.2.0 → 0.2.1 (PATCH - bug fix)
- Exit strategy upgraded from v6.5 → v6.5.1
- trajectory_predictor.py: Asymmetric dampening (only positive growth)
- smart_risk_manager.py: Crash threshold adjustment + velocity override
### Expected Impact
- **Peak Capture:** 35% → 70-80% ⬆️ (2x improvement!)
- **Exit Delay:** 23s → 5-10s ⬇️ (70% faster on crashes)
- **Profit Retention:** +$0.50-0.70 per crash trade ⬆️
- **False Exits:** No increase (only faster on REAL crashes)
### Trade #162076645 - Retrospective
**Actual Performance:**
- Duration: 46 seconds (very fast!)
- Peak: $1.10, Close: $0.39
- Peak Capture: 35% (POOR)
- Exit Reason: Fuzzy 76.66% (CORRECT but LATE)
**With v0.2.1 (Simulated):**
- Exit would trigger at $1.08 (16:45:25)
- FIX 1: Threshold lowered 75% → 65% ✅
- FIX 2: Crash -$87.72 RAW (not damped) ✅
- FIX 3: Velocity crash override (+0.24 → -0.03) ✅
- **Expected Close:** $1.08 (98% peak capture!)
- **Improvement:** +$0.69 (+177% better!)
### Note
- This is a **PATCH version** (bug fix, backward compatible)
- All 3 fixes work together synergistically
- No changes to core prediction formula (still mathematically correct)
- Only exit TIMING optimized (faster on crashes, same on normal exits)
---
## [0.2.0] - 2026-02-11
### Added (Regime-Based Dampening for Trajectory Predictions)
**Exit Strategy v6.5 "Realistic Predictions"** - Validated dampening from 33 minutes live monitoring
#### Investigation Results (v0.1.4 Debug)
-**Formula VERIFIED CORRECT** - All predictions matched manual calculations (diff=$0.00)
-**Model TOO OPTIMISTIC** - Parabolic assumption ignores market friction/decay
- 📊 **Data from 2 trades:**
- Trade #161778984: Over-prediction 2.3x-17.2x (avg 7.5x) → closed +$4.15 ✅
- Position #161850770: Predicted profit $6-38 from loss -$7 to -$10 ❌
#### Root Cause Analysis
**NOT a bug, but MODEL LIMITATION:**
1. Parabolic formula assumes acceleration continues indefinitely ❌
2. Real market has friction (resistance at levels, momentum fade) ✅
3. Predictions accurate for INPUT values, but inputs too volatile ✅
#### Solution: Regime-Based Dampening
**Implementation v0.2.0:**
- Added dampening factors to trajectory_predictor.py
- Only dampen GROWTH component (velocity + acceleration), NOT base profit
- Regime-specific factors validated from live data:
```python
dampening_factors = {
"ranging": 0.20, # 80% reduction (most conservative)
"volatile": 0.30, # 70% reduction (validated)
"trending": 0.50 # 50% reduction (momentum continues)
}
```
**Validation from Live Trades:**
- Trade #161778984 with 0.30x dampening:
- Raw $71.42 → Damped $21.43 (actual: $4.15) - still 5x over but acceptable ✅
- Raw $12.23 → Damped $3.67 (actual: $4.15) - VERY CLOSE! ✅✅✅
- Raw $9.74 → Damped $2.92 (conservative, safe) ✅
- Position #161850770 with 0.30x dampening:
- Raw $38.15 → Damped $11.45 (more realistic from -$7.74) ✅
- Raw $32.21 → Damped $9.66 (achievable expectation) ✅
#### New Features
1. **Regime parameter** added to `predict_future_profit()` and `should_hold_position()`
2. **Smart dampening** - only reduce growth component (v×t + 0.5×a×t²), not base profit
3. **Debug logging updated** - shows raw vs damped predictions with regime
4. **Backward compatible** - defaults to 0.30x if regime not provided
### Changed
- Version bumped from 0.1.4 → 0.2.0 (MINOR - new feature)
- Exit strategy upgraded from v6.4.3 → v6.5
- trajectory_predictor.py: Added `regime` parameter and dampening logic
- smart_risk_manager.py: Pass `regime` to trajectory predictor (2 calls updated)
### Expected Impact
- Prediction accuracy: 27% → 70-85% ⬆️
- Over-prediction: 7.5x → 1.2-1.5x ⬇️
- Peak capture: 100% maintained (exit timing stays excellent) ✅
- False holds: Reduced (more realistic profit expectations) ✅
### Performance Targets
- Average over-prediction: <2x (currently 7.5x)
- Prediction accuracy: >70% (currently 27%)
- Peak capture: Maintain 80%+ (currently 100% on Trade #161778984)
### Note
- This is a **MINOR version** (new feature, backward compatible)
- Dampening factors can be fine-tuned after 5-10 more trades
- Consider adjusting to 0.25-0.35 range if needed
- Core prediction formula remains unchanged and verified correct
---
## [0.1.4] - 2026-02-11
### Added (Deep Debug for Trajectory Bug Investigation)
**Exit Strategy v6.4.3 "Trajectory Debug Mode"** - Investigating 13x prediction error
#### Problem Identified
- Trajectory predictor formula is **CORRECT** (verified via test)
- But live predictions are **13.4x over-optimistic**
- Example: Expected $5.07, Logged $67.64
- Causing false HOLD signals → poor peak capture (54.5% avg)
- Bug location: **UNKNOWN** (between Kalman → Predictor → Log)
#### Debug Features Added
1. **Comprehensive Input Logging** (smart_risk_manager.py)
- Log all inputs to trajectory predictor
- Compare guard.velocity vs guard.kalman_velocity vs _vel
- Track velocity_history and acceleration_history values
2. **Calculation Breakdown** (trajectory_predictor.py)
- Log each term: p₀, v×t, 0.5×a×
- Show final prediction for each horizon (1m, 3m, 5m)
3. **Manual Verification** (smart_risk_manager.py)
- Calculate prediction manually inline
- Compare predictor output vs manual calculation
- Log WARNING if difference > $0.01
#### Next Steps
- Monitor 1-2 trades with full debug output
- Identify exact point where 13x scaling occurs
- Fix bug in v0.1.5
- Expected: Peak capture 54% → 75%+
### Changed
- Version bumped from 0.1.3 → 0.1.4 (PATCH - debug release)
- Exit strategy upgraded from v6.4.2 → v6.4.3
### Note
- This is a **DEBUG release** for investigation
- No functional changes to trading logic
- All debug logs use logger.debug() (won't spam console)
---
## [0.1.3] - 2026-02-11
### Fixed (Critical: FIX 1 v0.1.1 Was Never Active!)
**Exit Strategy v6.4.2 "Tiered Thresholds Finally Working"** - Live trade #161706070 revealed FIX 1 not active
#### Problem (Trade #161706070)
- Profit peaked at **$0.69** → closed at **$0.11** (lost 84% of peak!)
- Exit reason: "Fuzzy 94.58%, threshold=90%"
- **WRONG**: Profit $0.11 (<$1) should get threshold **70%**, not 90%!
- **Root Cause**: Hardcoded fuzzy_threshold at line 1313-1324 NEVER called `_calculate_fuzzy_exit_threshold()`
#### FIX: Activate Tiered Fuzzy Thresholds (FIX 1 v0.1.1) ✅
- **BEFORE**: Hardcoded thresholds ignored tiered function
```python
if current_profit < 3.0:
fuzzy_threshold = 0.90 # WRONG for micro profits!
```
- **AFTER**: Actually call the FIX 1 function
```python
fuzzy_threshold = self._calculate_fuzzy_exit_threshold(current_profit)
# Returns: <$1→70%, $1-3→75%, $3-8→85%, >$8→90%
```
- **IMPACT**: Micro profits (<$1) now exit at 70% confidence instead of 90%
- Expected: Earlier exits on micro profits → higher profit retention
- Target: Peak capture 16% → 60%+ for micro trades
#### Trade #161706070 Analysis
- Entry: BUY @ 5056.12
- Peak: $0.69 (vel +0.0748$/s, accel +0.0006) at 09:55:05
- Exit: $0.11 (vel -0.0040$/s) at 09:55:38 → 3m 5s duration
- **Exit was correct** (price dropped to 5052.99, would be -$3.13 loss now)
- **But late**: Should have exited at $0.50-0.60 with 70% threshold
### Changed
- Version bumped from 0.1.2 → 0.1.3 (PATCH - critical bug fix)
- Exit strategy upgraded from v6.4.1 → v6.4.2
### Note
- **BACKTEST v0.1.1 WAS INVALID** - FIX 1 was not active in backtest either
- Need to re-run backtest with FIX 1 actually working
- Grace period (v0.1.2) is still active and working
---
## [0.1.2] - 2026-02-11
### Fixed (Grace Period for Loss Exits)
**Exit Strategy v6.4.1 "Loss Recovery Window"** - Live trade analysis revealed early exit issue
#### Problem (Trade #161699163)
- Trade exited after only **18 seconds** with loss -$0.22
- Fuzzy confidence 94.58% triggered immediate exit
- Velocity was still positive (+0.0693$/s) but profit retention "collapsed"
- **Root Cause**: No grace period for micro swings, small loss after small profit treated as catastrophic
#### FIX 1: Grace Period for Loss Trades ✅
- **BEFORE**: Fuzzy exit active immediately after entry
- **AFTER**: Grace period based on regime:
- Ranging: 120 seconds (2 minutes)
- Volatile: 90 seconds (1.5 minutes)
- Trending: 60 seconds (1 minute)
- **Suppression Logic**: Loss <$2 during grace period → fuzzy exit suppressed
- **IMPACT**: Prevents premature exits on micro swings, allows recovery window
#### FIX 2: Profit Retention Calculation Fix ✅
- **BEFORE**: `retention = current_profit / peak_profit` → -$0.22 / $0.17 = -1.29 → clamped to 0 ("collapsed")
- **AFTER**: Small loss (<$0) after small profit (<$3) → retention = 0.50 (medium, not collapsed)
- **IMPACT**: Micro swings no longer trigger "collapsed retention" → 95% exit confidence
### Changed
- Version bumped from 0.1.1 → 0.1.2 (PATCH - bug fix)
- Exit strategy upgraded from v6.4 → v6.4.1
### Expected Impact
- Avg trade duration: 18s → 60-120s (more reasonable)
- False early exits: -30% (grace period filtering)
- Recovery opportunities: More micro swings can recover to profit
### Note
- Trade #161699163 exit was actually **correct** (price continued to drop from 5053.74 → 5052.55)
- Grace period prevents false exits while preserving correct exit decisions for sustained losses
---
## [0.1.1] - 2026-02-11
### Fixed (Professor AI Exit Strategy Improvements)
**Exit Strategy v6.4 "Validated Fixes"** - Backtest validated over 338 trades (90 days)
#### FIX 1: Tiered Fuzzy Exit Thresholds (PRIORITY 1) ✅
- **BEFORE**: Fixed 90% fuzzy threshold for ALL profit levels
- **AFTER**: Dynamic thresholds based on profit magnitude:
- Micro profits (<$1): 70% threshold → early exit
- Small profits ($1-$3): 75% threshold → protection
- Medium profits ($3-$8): 85% threshold → hold longer
- Large profits (>$8): 90% threshold → maximize
- **IMPACT**: Avg win increased $4.07 → $9.36 (+130%), Micro profits reduced 75% → 13%
#### FIX 2: Trajectory Prediction Calibration (PRIORITY 2) ✅
- **BEFORE**: Optimistic parabolic prediction (95% error rate)
- **AFTER**: Conservative prediction with:
- Regime penalty (ranging 0.4x, volatile 0.6x, trending 0.9x)
- Uncertainty bounds (95% confidence interval lower bound)
- Prevents premature exits based on overestimated future profit
- **IMPACT**: More realistic profit forecasting, reduced false exits
#### FIX 4: Unicode Fix (PRIORITY 4) ✅
- **BEFORE**: Emoji in exit messages caused encoding errors
- **AFTER**: ASCII-only exit messages for Windows compatibility
- **IMPACT**: No more UnicodeEncodeError in logs
#### FIX 5: Maximum Loss Enforcement (PRIORITY 5) ✅
- **BEFORE**: Max loss $50/trade
- **AFTER**: Max loss $25/trade with SL cap at entry
- **IMPACT**: Tighter risk control (avg loss $33 in backtest due to M15 slippage, will be closer to $25 in live with tick data)
### Changed
- Version bumped from 0.0.0 → 0.1.1 (Kalman + Bug Fixes)
- Exit strategy upgraded from v6.3 → v6.4
### Backtest Results (90 days, 338 trades)
- **Avg Win**: $9.36 ✅ (target: $8-12)
- **Micro Profits**: 13% ✅ (target: <20%, was 75%)
- **Net P/L**: +$595.16 (11.9% return)
- **Profit Factor**: 1.30 (sustainable)
- **Sharpe Ratio**: 1.29 (near target 1.5)
- **Fuzzy Exits**: 69% of trades (232/338)
### Note
- FIX 3 (Session Filter) NOT applied - trade ALL sessions per user request
- RR Ratio 1:3.57 due to M15 backtest slippage, expected to improve in live trading
---
## [0.0.0] - 2026-02-11
### Initial Release
Starting point for versioned releases. All previous development consolidated into v0.0.0 baseline.
---
## [0.0.0] - 2026-02-11
### Initial Release
Starting point for versioned releases. All previous development consolidated into v0.0.0 baseline.
#### Core Features
- **MT5 Integration**: Real-time connection to MetaTrader 5
- **Smart Money Concepts (SMC)**: Order Blocks, Fair Value Gaps, BOS/CHoCH detection
- **Machine Learning**: XGBoost model for trade signal prediction (37 features)
- **HMM Regime Detection**: Market classification (trending/ranging/volatile)
- **Risk Management**: Multi-tier capital modes (MICRO/SMALL/MEDIUM/LARGE)
- **Session Filtering**: Sydney/London/NY session optimization
- **Telegram Notifications**: Real-time trade alerts and commands
#### Advanced Exit Systems
- **v6.0 Kalman Intelligence**: Kalman filter for velocity smoothing
- **v6.1 Profit-Tier Strategy**: Dynamic exit thresholds based on profit magnitude
- **v6.2 Bug Fixes**: ExitReason.STOP_LOSS → POSITION_LIMIT correction
- **v6.3 Predictive Intelligence**:
- Trajectory Predictor (profit forecasting 1-5min ahead)
- Momentum Persistence Detector (continuation probability)
- Recovery Strength Analyzer (loss recovery optimization)
#### Technical Infrastructure
- **Framework**: Python 3.11+, Polars (not Pandas), asyncio
- **Models**: XGBoost (binary classification), HMM (regime detection)
- **Database**: PostgreSQL for trade logging
- **Dashboard**: Next.js web monitoring interface
- **Deployment**: Docker support with multi-environment configs
### Performance Metrics (Baseline)
- Win Rate: 56-58%
- Average Win: $2.78 (v6.2) → Target $6-8 (v6.3)
- Peak Capture: 71% → Target 85%+
- Daily Loss Limit: 5% of capital
- Risk per Trade: 0.5-2% (capital-mode dependent)
---
## Version History Format
### [MAJOR.MINOR.PATCH] - YYYY-MM-DD
#### Added
- New features that are backward compatible
#### Changed
- Changes in existing functionality
#### Deprecated
- Features that will be removed in future versions
#### Removed
- Features that have been removed
#### Fixed
- Bug fixes
#### Security
- Security vulnerability fixes
---
## Semantic Versioning Guidelines
### MAJOR version (x.0.0)
Increment when making incompatible API changes:
- Breaking changes to core trading logic
- Removal of major features
- Database schema changes requiring migration
- Configuration format changes
Examples:
- Switching from Pandas to Polars
- Changing ML model architecture completely
- Removing hard stop-loss system
### MINOR version (0.x.0)
Increment when adding functionality in a backward-compatible manner:
- New exit strategies (e.g., v6.3 Predictive Intelligence)
- New indicators or features
- New filters or risk management modes
- Enhanced logging or monitoring
Examples:
- Adding Trajectory Predictor
- Adding new session filter
- Implementing Kelly Criterion
### PATCH version (0.0.x)
Increment when making backward-compatible bug fixes:
- Bug fixes that don't change behavior
- Performance optimizations
- Documentation updates
- Code refactoring (no logic changes)
Examples:
- Fixing ExitReason.STOP_LOSS typo
- Fixing variable scope errors
- Correcting log messages
---
## Feature Tracking
Current feature set determines version automatically:
| Feature | Version Component | Impact |
|---------|------------------|--------|
| Basic Trading (SMC + ML + MT5) | 0.x.x | Core |
| Exit v6.0 (Kalman) | 0.1.x | MINOR |
| Exit v6.1 (Profit-Tier) | 0.2.x | MINOR |
| Exit v6.2 (Bug Fixes) | 0.2.1 | PATCH |
| Exit v6.3 (Predictive) | 0.3.x | MINOR |
| Fuzzy Logic Controller | +0.1 | MINOR |
| Kelly Criterion | +0.1 | MINOR |
| Recovery Detector | +0.1 | MINOR |
---
## Links
- [Repository](https://github.com/GifariKemal/xaubot-ai)
- [Documentation](./docs/)
- [Issues](https://github.com/GifariKemal/xaubot-ai/issues)