# ERMT PME v1.3 - CHANGELOG & IMPLEMENTATION GUIDE ## Release Date: 2025-12-03 --- ## 🎯 **Primary Objective** **Decouple phase-based profit locks from adaptive trailing stops** to eliminate premature position exits caused by overly aggressive phase lock tightening during natural market retracements. --- ## 📋 **Summary of Changes** ### **1. Phase Lock System - NOW SAFETY FLOORS ONLY** **Previous Behavior (v1.2)**: - Phase locks calculated dynamically with progressive locking - Applied breathing room reduction (50% of peak) - Tightened stops by 20% on phase retreats - Adjusted based on momentum and volatility - **Result**: Positions closed prematurely at 60-80 points during natural retracements **New Behavior (v1.3)**: - Phase locks are **MINIMUM PROFIT GUARANTEES** based on highest phase achieved - **NO** progressive locking calculations - **NO** breathing room reduction - **NO** retreat tightening multiplier - **NO** dynamic momentum/volatility adjustments to phase locks - **Result**: Phase lock sets absolute floor, adaptive trailing manages dynamic protection above it **Modified File**: `Modules_PME/ProfitMaximizer_PME.mqh` **Key Change** (Line 1020-1101): ```mql5 bool GetPhaseProtectionStop(ulong ticket, double &stop_price, string &reason) { // v1.3: Calculate MINIMUM phase lock only (safety floor) ENUM_PROFIT_PHASE highest_phase = m_trackers[index].highest_phase_achieved; double minimum_lock = GetMinimumPhaseLock(highest_phase); // Calculate phase floor price (no progressive calculations!) double phase_floor_price; if(pos_type == POSITION_TYPE_BUY) phase_floor_price = entry_price + (minimum_lock * point_value); else phase_floor_price = entry_price - (minimum_lock * point_value); // Only update if current SL is below the phase minimum // Phase lock never tightens - it's a static floor } ``` **Phase Floor Guarantees**: - PROTECTION (40-60pts): **10 points minimum** - ACCUMULATION (60-100pts): **25 points minimum** - MAXIMIZATION (100-200pts): **50 points minimum** - RUNNER (200-400pts): **100 points minimum** - EXTREME (400+pts): **200 points minimum** --- ### **2. Adaptive Trailing - NOW PHASE-AWARE** **Previous Behavior (v1.2)**: - Fixed trail distance: 40 points (or ATR-based) - Applied uniformly regardless of profit phase - Volatility multiplier **tightened** stops in high volatility (logic error) **New Behavior (v1.3)**: - **Phase-aware trail multipliers**: - INITIAL (<40pts): No trailing - PROTECTION (40-60pts): **2.5× ATR** (very wide) - ACCUMULATION (60-100pts): **2.2× ATR** (wide) - MAXIMIZATION (100-200pts): **1.8× ATR** (moderate) - RUNNER (200-400pts): **3.0× ATR** (very wide again) - EXTREME (400+pts): **3.5× ATR** (ultra-wide) - **Volatility logic FIXED**: - High volatility (ratio > 1.5): **WIDEN** trail by 30% (was: tighten!) - Low volatility (ratio < 0.7): Tighten by 15% - **Momentum awareness**: - Strong momentum (>1.5): Widen trail by 20% **Modified File**: `Modules_PME/PositionManager_PME_Complete.mqh` **Key Changes**: 1. **CalculateTrailDistance()** (Lines 911-999): ```mql5 // v1.3: Phase-based trail width double trail_multiplier = 2.0; if(profit_points < 40) return 0; // No trail yet else if(profit_points < 60) trail_multiplier = 2.5; // PROTECTION: very wide else if(profit_points < 100) trail_multiplier = 2.2; // ACCUMULATION: wide // ... (continues for all phases) double base_distance = atr * trail_multiplier; // v1.3: Volatility adjustment CORRECTED if(vol_ratio > 1.5) base_distance *= 1.3; // WIDEN in high volatility (not tighten!) ``` 2. **ApplyTrailingStop()** (Lines 873-975): ```mql5 // v1.3: Check against phase minimum lock (safety floor) double phase_minimum_lock = 0; if(profit_points >= 400) phase_minimum_lock = 200; // EXTREME else if(profit_points >= 200) phase_minimum_lock = 100; // RUNNER // ... (continues) // If trailing SL is below phase floor, use phase floor instead if(new_sl < phase_floor_price) new_sl = phase_floor_price; ``` --- ### **3. Optimized Partial Closure Schedule** **Previous Behavior (v1.2)**: - Trigger 1: 50pts → 20% closed (80% remaining) - Trigger 2: 100pts → 20% closed (60% remaining) - Trigger 3: 200pts → 25% closed (35% remaining) - Trigger 4: 400pts → 20% closed (15% runner) - **Profit banked by 100 points**: 40% - **Profit banked by 200 points**: 65% **New Behavior (v1.3)**: - Trigger 1: **40pts** → **25%** closed (75% remaining) - Trigger 2: **80pts** → **25%** closed (50% remaining) - Trigger 3: **150pts** → **25%** closed (25% remaining) - Trigger 4: **300pts** → **15%** closed (10% runner) - **Profit banked by 80 points**: 50% ✅ (+10% vs v1.2) - **Profit banked by 150 points**: 75% ✅ (+10% vs v1.2) **Runner Configuration**: - Size: **10%** (was 15%) - Trail multiplier: **3.0×** (was 2.0×) - Ultra-wide trail for extreme move capture **Modified File**: `ERMT_PME_1.3.mq5` **Key Changes** (Lines 142-153): ```mql5 input double InpPartialTrigger1 = 40; // [v1.3: was 50] input double InpPartialPercent1 = 25; // [v1.3: was 20] input double InpPartialTrigger2 = 80; // [v1.3: was 100] input double InpPartialPercent2 = 25; // [v1.3: was 20] input double InpPartialTrigger3 = 150; // [v1.3: was 200] input double InpPartialPercent3 = 25; // [v1.3: was 25] input double InpPartialTrigger4 = 300; // [v1.3: was 400] input double InpPartialPercent4 = 15; // [v1.3: was 20] input double InpRunnerPercentage = 10; // [v1.3: was 15] input double InpRunnerTrailMultiplier = 3.0; // [v1.3: was 2.0] ``` --- ### **4. Input Parameter Updates** **Modified File**: `ERMT_PME_1.3.mq5` | Parameter | v1.2 Value | v1.3 Value | Change | Reason | |-----------|------------|------------|---------|---------| | `InpTrailDistance` | 40 | **50** | +25% | Wider base trail distance | | `InpTrailStep` | 15 | **20** | +33% | Larger trail step increments | | `InpPhaseLockBreathingRoom` | 50 | **80** | +60% | More room for retracements (unused in floor mode) | | `InpRetreatLockMultiplier` | 1.2 | **1.0** | DISABLED | No penalty for phase retreats | | `InpLowVolatilityMultiplier` | 0.8 | **0.85** | Slightly less aggressive | | `InpHighVolatilityMultiplier` | 1.5 | **1.3** | Widening (fixed logic) | --- ## 📊 **Expected Performance Improvements** ### **Metrics Comparison** | Metric | v1.2 | v1.3 (Expected) | Improvement | |--------|------|-----------------|-------------| | Premature exits due to retracement | 60-70% | **<25%** | 65% reduction | | Average profit per winning trade | +85 points | **+120 points** | +41% | | Runner survival rate (reaching 400+) | 15% | **35%** | 133% increase | | Profit banked by 150 points | 65% | **75%** | +15% faster | | Stop hits during natural retracements | 45% | **<20%** | 56% reduction | ### **Risk Considerations** **Potential Downsides**: 1. Wider stops mean larger drawdowns during sudden reversals 2. Runner portion (10%) exposed to full retracement risk 3. May underperform in choppy, range-bound markets **Mitigations**: 1. Phase floor minimums provide hard safety nets (10/25/50/100/200 pts) 2. Partial closure schedule banks 75% by 150 points (guaranteed profit taking) 3. Adaptive trailing still responds to volatility and momentum 4. Runner size reduced to 10% (limited exposure) --- ## 🚀 **Installation & Testing Instructions** ### **Step 1: Backup Current Files** ```bash cd "/Users/basma/Library/Application Support/net.metaquotes.wine.metatrader5/drive_c/Program Files/MetaTrader 5/MQL5/Experts/Advisors/ERMT_PMEx" # Backup current files cp ERMT_PME_1.2.mq5 ERMT_PME_1.2_BACKUP.mq5 cp Modules_PME/ProfitMaximizer_PME.mqh Modules_PME/ProfitMaximizer_PME_BACKUP.mqh cp Modules_PME/PositionManager_PME_Complete.mqh Modules_PME/PositionManager_PME_Complete_BACKUP.mqh ``` ### **Step 2: Compile v1.3** 1. Open MetaEditor 2. Open `ERMT_PME_1.3.mq5` 3. Click **Compile** (F7) 4. Verify 0 errors, 0 warnings ### **Step 3: Demo Testing (Required)** **DO NOT deploy to live account without demo testing!** 1. Attach `ERMT_PME_1.3` to demo chart 2. Enable dashboard: `InpShowDashboard = true` 3. Watch for: - Phase lock messages: "Phase floor set at..." - Trailing activation: "Adaptive trailing activated..." - Partial closures: "Partial close X% at Y points" - Phase transitions: "Transitioning from X to Y" 4. Test scenarios: - Position reaches 120 points → retraces to 80 points - **Expected**: Position remains open (phase floor at 50pts) - **v1.2 behavior**: Would have closed at ~72 points - Position reaches 150 points → volatility spikes - **Expected**: Trail widens (not tightens) - **v1.2 behavior**: Would have tightened stops 5. Monitor for 5-10 trades minimum ### **Step 4: A/B Comparison (Optional)** Run v1.2 and v1.3 side-by-side on separate demo accounts for 1 week: - Compare average profit per trade - Count premature exits vs natural closures - Measure runner success rate - Check maximum adverse excursion (MAE) ### **Step 5: Live Deployment** **Only after successful demo testing!** 1. Start with **reduced position size** (50% of normal) 2. Monitor first 20 trades closely 3. Gradually increase to full size after validation --- ## 🔍 **Monitoring & Validation** ### **Log Messages to Watch For** **Phase Lock Floor Application**: ``` Position #12345: Phase floor set at 1.2050 (50.0 pts minimum from MAXIMIZATION phase) ``` **Adaptive Trailing**: ``` Position #12345: Trail distance calculated: 75.0 points (phase-based: 2.2x ATR) Position #12345: High volatility (1.65) - widening trail by 30% Position #12345: Adaptive trailing activated at 85.0 points profit ``` **Phase Transitions**: ``` Position #12345 transitioning from ACCUMULATION to MAXIMIZATION (Peak: 105.0, Current: 102.0) ``` **Partial Closures**: ``` Position #12345: Partial close 25% at 40 points ``` ### **Dashboard Indicators** Monitor these key metrics: - **Active Locks**: Number of positions with phase floors active - **Min Locked**: Total minimum profit guaranteed across all positions - **Runners Created**: Positions reaching RUNNER phase (200+ points) - **Extreme Profits**: Positions reaching EXTREME phase (400+ points) --- ## 🐛 **Troubleshooting** ### **Issue 1: Compilation Errors** **Error**: `'g_profit_max' - undeclared identifier` **Fix**: Ensure `#include "Modules_PME/ProfitMaximizer_PME.mqh"` is present **Error**: `'PHASE_PROTECTION' - undeclared identifier` **Fix**: Verify `DataTypes_PME.mqh` includes `ENUM_PROFIT_PHASE` definition ### **Issue 2: Phase Lock Not Applying** **Symptom**: No "Phase floor set..." messages in logs **Check**: 1. `InpUsePhaseProfitLocks = true` in inputs 2. Position has reached at least PROTECTION phase (40+ points) 3. `USE_PHASE_LOCKING true` in main file defines ### **Issue 3: Trailing Too Tight** **Symptom**: Stops hitting on small retracements despite phase-aware trailing **Check**: 1. Verify `InpAdaptiveTrailing = true` 2. Check ATR value - if ATR is very small, trail may be too tight 3. Manually increase `InpTrailDistance` to 60-70 points ### **Issue 4: Partial Closures Not Triggering** **Symptom**: Position reaches 80 points but no partial closure **Check**: 1. `InpPartialEnabled = true` 2. `USE_PARTIAL_CLOSURES true` in defines 3. Minimum lot size: Verify `SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN)` 4. If lot size too small for 25% closure, system skips it --- ## 📈 **Performance Benchmarks (Target Metrics)** Track these KPIs weekly and compare to v1.2: 1. **Average Profit Per Trade** - Target: >+100 points - v1.2 baseline: +85 points 2. **Premature Exit Rate** - Target: <25% of total exits - v1.2 baseline: 60-70% 3. **Runner Survival Rate** - Target: >30% reach 400+ points - v1.2 baseline: 15% 4. **Profit Banking Efficiency** - Target: 75% banked by 150 points - v1.2 baseline: 65% by 200 points 5. **Stop Loss Hit Analysis** - Target: >80% of SL hits are at phase floors (intentional) - v1.2 baseline: 55% were premature (unintentional) --- ## 🔄 **Rollback Instructions** If v1.3 underperforms in live testing: ```bash cd "/Users/basma/Library/Application Support/net.metaquotes.wine.metatrader5/drive_c/Program Files/MetaTrader 5/MQL5/Experts/Advisors/ERMT_PMEx" # Restore v1.2 files cp ERMT_PME_1.2_BACKUP.mq5 ERMT_PME_1.2.mq5 cp Modules_PME/ProfitMaximizer_PME_BACKUP.mqh Modules_PME/ProfitMaximizer_PME.mqh cp Modules_PME/PositionManager_PME_Complete_BACKUP.mqh Modules_PME/PositionManager_PME_Complete.mqh # Recompile v1.2 # Reattach to chart ``` --- ## 📝 **Version History** ### **v1.3 (2025-12-03)** - Phase locks decoupled from adaptive trailing - Phase locks now safety floors only - Adaptive trailing phase-aware with corrected volatility logic - Optimized partial closure schedule - Retreat tightening disabled ### **v1.2 (Previous)** - Progressive phase-based profit locking - Adaptive trailing with ATR - Partial closures at 50/100/200/400 points - Dynamic momentum/volatility adjustments --- ## 🎓 **Key Architectural Principles (v1.3)** 1. **Separation of Concerns**: - Phase locks = Safety floor guarantees - Adaptive trailing = Dynamic profit protection - Partial closures = Active profit taking 2. **Phase Locks Are Passive**: - Set once when phase is achieved - Never tighten (only maintain or move up) - No calculations based on retracements 3. **Trailing Is Active**: - Adjusts continuously based on market conditions - Respects phase floor minimums - Responds to volatility and momentum 4. **Partials Are Aggressive**: - Bank profit early and often - Create runners for extreme moves - Reduce exposure progressively --- ## ✅ **Success Criteria** v1.3 is considered successful if after 50 trades: 1. ✅ Average profit >+100 points (vs +85 in v1.2) 2. ✅ <25% premature exits (vs 60-70% in v1.2) 3. ✅ >30% runners reach 400+ points (vs 15% in v1.2) 4. ✅ 75%+ profit banked by 150 points 5. ✅ Sharpe ratio improvement >0.3 vs v1.2 **Acceptance Test**: Position reaching 120 points that retraces to 70 points should remain open (phase floor at 50pts, trailing at 60-70pts). --- ## 📞 **Support & Documentation** - **Analysis Document**: `ANALYSIS_AdaptiveTrailing_PhaseLock.md` - **Changelog**: `V1.3_CHANGELOG.md` (this file) - **Main EA**: `ERMT_PME_1.3.mq5` - **Modified Modules**: - `Modules_PME/ProfitMaximizer_PME.mqh` - `Modules_PME/PositionManager_PME_Complete.mqh` --- **END OF CHANGELOG**