# EA Analysis & Improvement Recommendations **Date**: 2026-03-29 **Analyst**: Kimi Code CLI **EAs Analyzed**: - OrdersEA_Smart_Grid.mq5 (v3.0) - MultiSignal_Confluence_EA.mq5 (v1.13) --- ## 📊 Current Performance Summary ### MultiSignal Confluence EA (March 2026 Report) | Metric | Value | Assessment | |--------|-------|------------| | Net Profit | ~$15,000 (15%) | ✅ Good | | Win Rate | 46% | ⚠️ Below 50% | | Largest Win | $8,091 | ✅ Excellent | | Largest Loss | -$805 | ✅ Well controlled | | Signal Type | Long-only (BUY) | ⚠️ Missing short side | ### Key Observations - **Strong risk management**: Losses are 10x smaller than wins - **Asymmetric returns**: Good R:R ratio - **Directional bias**: Only taking long trades - missing opportunities --- ## 🚨 CRITICAL ISSUES FOUND ### 1. OrdersEA_Smart_Grid - Daily Forced Position Closure (HIGH PRIORITY) **Location**: `OrdersEA_Smart_Grid.mq5` lines 555-563 **Problem Code**: ```cpp if(dt.hour == 0 && dt.min < 5) { Print("NEW DAY - Cancelling old grid and recalculating pivots"); CancelAllOrders("End of day - new pivot calculation"); CloseAllPositions("End of day - close positions"); // ❌ PROBLEMATIC CalculatePivotPoints(); gridPlaced = false; } ``` **Impact**: - **Profitable positions closed prematurely** at midnight - **Losses realized immediately** instead of letting SL/TP work - Disrupts natural trade lifecycle - Reduces overall profitability **Recommended Fix**: ```cpp // Only cancel pending orders, let positions run with SL/TP if(dt.hour == 0 && dt.min < 5 && !TradeExecutedToday) { CancelAllOrders("End of day - reset for new grid"); // DO NOT close positions - let them hit SL/TP CalculatePivotPoints(); gridPlaced = false; } ``` --- ### 2. MultiSignal_Confluence_EA - Missing Short Trade Logic (MEDIUM PRIORITY) **Location**: `MultiSignal_Confluence_EA.mq5` signals analysis **Observation**: Historical reports show **ONLY LONG positions** (15/15 trades were BUY) **Potential Causes**: - Pivot calculation may always favor support over resistance - Trend filter (`InpUseTrendFilter`) may be blocking shorts - ADX filter may be asymmetric **Evidence**: ```cpp // From report: "Long Trades: 15, Short Trades: 0" // This suggests systematic bias ``` **Recommended Actions**: 1. Review pivot signal logic for symmetry 2. Add debug logging to see when SELL signals are blocked 3. Temporarily disable trend filter to test short generation --- ### 3. Both EAs - Missing Equity Protection (HIGH PRIORITY) **Issue**: Neither EA has daily/session drawdown protection **Risk Scenario**: - Confluence EA could open 3 positions simultaneously - If all hit SL: 3 × -$805 = -$2,415 loss (2.4% of $100k account) - Grid EA could accumulate 10+ positions during strong trend **Recommended Implementation**: ```cpp // Add to both EAs input double InpMaxDailyDrawdown = 3.0; // Max 3% daily loss double dailyStartEquity = 0; datetime lastEquityReset = 0; bool CheckDailyDrawdown() { datetime today = TimeCurrent() / 86400 * 86400; if(today != lastEquityReset) { dailyStartEquity = AccountInfoDouble(ACCOUNT_EQUITY); lastEquityReset = today; return true; } double currentEquity = AccountInfoDouble(ACCOUNT_EQUITY); double drawdown = (dailyStartEquity - currentEquity) / dailyStartEquity * 100; if(drawdown >= InpMaxDailyDrawdown) { Print("⚠️ DAILY DRAWDOWN LIMIT REACHED: ", drawdown, "%"); return false; // Block new trades } return true; } ``` --- ## 🔧 CODE QUALITY ISSUES ### 4. OrdersEA_Smart_Grid - Incomplete AutoPivots Implementation **Location**: Lines 143-161 **Issue**: `UseAutoPivots` calculates levels but doesn't actually use them to set HIGH/LOW inputs ```cpp if(UseAutoPivots) { // Calculates PivotR1/PivotS1 but doesn't assign to HIGH/LOW // Note comment says: "In actual usage, you would set HIGH/LOW from inputs" // This is never done! } ``` **Fix**: ```cpp if(UseAutoPivots) { double atr = 0; if(ATRHandle != INVALID_HANDLE) { double atrBuf[1]; if(CopyBuffer(ATRHandle, 0, 0, 1, atrBuf) > 0) atr = atrBuf[0]; } if(UseATRFilter && atr > 0) { HIGH = NormalizeDouble(PivotP + (atr * ATRMultiplier), _Digits); LOW = NormalizeDouble(PivotP - (atr * ATRMultiplier), _Digits); } else { HIGH = PivotR1; // Actually assign the values! LOW = PivotS1; } } ``` --- ### 5. MultiSignal_Confluence_EA - Signal Strength Calculation Bug **Location**: Lines 638-642 ```cpp if(buyCount > 0) strength = 0.6 + (buyCount * 0.15); if(sellCount > 0) strength = -(0.6 + (sellCount * 0.15)); ``` **Issue**: If both buyCount and sellCount > 0, strength will be negative (sell overrides) **Better Logic**: ```cpp if(buyCount > 0 && sellCount == 0) strength = 0.6 + (buyCount * 0.15); else if(sellCount > 0 && buyCount == 0) strength = -(0.6 + (sellCount * 0.15)); else strength = 0; // Conflicting signals ``` --- ## 📈 PERFORMANCE OPTIMIZATIONS ### 6. Grid EA - Missing Trend-Aware Grid Adjustment **Current Behavior**: - Places grid orders once at bar open - Doesn't adjust for emerging trends **Improvement**: Trend-Responsive Grid Spacing ```cpp // Adjust grid spacing based on ADX double GetDynamicGridSpacing() { if(ADXHandle == INVALID_HANDLE) return Entry; double adxBuf[1]; if(CopyBuffer(ADXHandle, 0, 0, 1, adxBuf) <= 0) return Entry; // Wider spacing in trending markets if(adxBuf[0] > 30) return Entry * 2.0; // Double spacing else if(adxBuf[0] < 15) return Entry * 0.8; // Tighter in ranging return Entry; } ``` --- ### 7. Confluence EA - Position Sizing Needs Symbol Adjustment **Current Issue**: Fixed 1% risk may be too high for volatile pairs **Improvement**: Volatility-Adjusted Position Sizing ```cpp double CalculateAdaptiveLotSize(double slPoints) { // Get current ATR double atrBuf[1]; double atr = 0; if(CopyBuffer(ATRHandle, 0, 0, 1, atrBuf) > 0) atr = atrBuf[0]; // Adjust risk based on volatility double adjustedRisk = InpRiskPercent; if(atr > 0) { double atrPercent = (atr / iClose(_Symbol, _Period, 0)) * 100; // Reduce risk in high volatility if(atrPercent > 1.0) adjustedRisk *= 0.7; // 30% reduction else if(atrPercent < 0.2) adjustedRisk *= 0.8; // 20% reduction (choppy) } // Use adjusted risk for calculation double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE); double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP); double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); if(tickSize <= 0 || slPoints <= 0) return InpLotSize; double riskAmount = accountBalance * adjustedRisk / 100.0; double lots = riskAmount / (slPoints * tickValue / tickSize); lots = MathFloor(lots / lotStep) * lotStep; lots = MathMax(minLot, MathMin(maxLot, lots)); return lots; } ``` --- ## 🛡️ RISK MANAGEMENT ENHANCEMENTS ### 8. Grid EA - Missing Correlation Check **Risk**: Running grid on multiple correlated pairs (EURUSD + GBPUSD) amplifies risk **Solution**: Add correlation filter (simplified version) ```cpp // Check if other grid EAs are running on correlated pairs bool CheckCorrelationRisk() { // Get total exposure across all symbols double totalLongExposure = 0; double totalShortExposure = 0; for(int i = 0; i < PositionsTotal(); i++) { ulong ticket = PositionGetTicket(i); if(ticket == 0) continue; if(PositionSelectByTicket(ticket)) { if(PositionGetInteger(POSITION_MAGIC) == MagicNum) { double volume = PositionGetDouble(POSITION_VOLUME); ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); if(type == POSITION_TYPE_BUY) totalLongExposure += volume; else totalShortExposure += volume; } } } // Limit total exposure double maxExposure = 0.5; // Max 0.5 lots total if(totalLongExposure + totalShortExposure >= maxExposure) { Print("Max total exposure reached: ", totalLongExposure + totalShortExposure); return false; } return true; } ``` --- ### 9. Both EAs - Missing Weekend/News Protection **Issue**: EAs will trade through high-impact news events **Simple Solution**: ```cpp bool IsHighImpactNews() { // Simple time-based filter (NFP, FOMC typically 8:30-9:00 EST) MqlDateTime dt; TimeToStruct(TimeCurrent(), dt); // Friday NFP (first Friday of month, 8:30-9:00 EST) // FOMC (every 6 weeks, 14:00 EST) // Conservative: Don't trade first 2 hours of major sessions if(dt.hour < 2) return true; // Avoid early Asian return false; } ``` --- ## 📋 PRIORITY IMPROVEMENT CHECKLIST ### 🔴 Critical (Fix Immediately) - [ ] **1. Remove forced position closure** from Grid EA daily reset - [ ] **2. Add daily drawdown protection** to both EAs - [ ] **3. Fix AutoPivots** to actually assign HIGH/LOW values ### 🟡 High Priority - [ ] **4. Debug short signal generation** in Confluence EA - [ ] **5. Fix signal strength override bug** (sell overrides buy) - [ ] **6. Add correlation/exposure check** to Grid EA ### 🟢 Medium Priority - [ ] **7. Implement volatility-adjusted position sizing** - [ ] **8. Add trend-responsive grid spacing** - [ ] **9. Add news/time-based filters** - [ ] **10. Improve logging** with structured trade journals --- ## 📊 EXPECTED IMPACT | Improvement | Expected Benefit | |-------------|------------------| | Remove daily position closure | +5-10% profit (letting winners run) | | Add drawdown protection | -50% max drawdown reduction | | Fix short signals | +20-30% more trading opportunities | | Volatility-adjusted sizing | Better risk-adjusted returns | | Exposure correlation check | Reduced tail risk | --- ## 🛠️ IMPLEMENTATION NOTES 1. **Test fixes on demo** before live deployment 2. **Version control**: Create v3.1 for Grid EA, v1.14 for Confluence EA 3. **Backtest each change** individually to measure impact 4. **Monitor first week** closely after deployment --- *Analysis complete. Ready to implement improvements.*