# DualEA — Production Multi-Strategy Trading System ## Paper EA + Live EA with ML Policy Engine ## System Overview **DualEA** is a production-ready, multi-strategy Expert Advisor ecosystem for MetaTrader 5 that combines: 1. **PaperEA_v2** (2793 lines) - Executes real MT5 orders on demo accounts with 8-stage gate filtering, 23 signal generators, ML integration 2. **LiveEA** (1702 lines) - Real trading implementation with insights/policy gating from PaperEA 3. **ML Pipeline** - Python-based TensorFlow/Keras training with LSTM models and policy export 4. **Knowledge Base** - Shared CSV/JSON data store in Common Files for cross-system communication **Compilation Status**: ✅ **0 errors, 0 warnings** (MQL5 Build 5572+ compatible) ### Core Architecture ``` MQL5/ ├── Experts/ │ └── Advisors/ │ └── DualEA/ │ ├── PaperEA/ # PaperEA_v2 System (Demo Execution) │ │ ├── PaperEA_v2.mq5 # Enhanced Paper EA with 8-stage gates │ │ └── PaperEA_backtest.ini │ ├── LiveEA/ # Live Trading System │ │ ├── LiveEA.mq5 # Live EA with advanced gating │ │ ├── LiveEA_StrategyBridge.mqh │ │ ├── Telemetry.mqh │ │ └── build_liveea.bat │ ├── Include/ # Core System Components │ │ ├── IStrategy.mqh # Strategy interface │ │ ├── StrategySelector.mqh # Strategy selection & scoring │ │ ├── TradeManager.mqh # Trade execution management │ │ ├── PositionManager.mqh # Position management │ │ ├── KnowledgeBase.mqh # Data persistence layer │ │ ├── GateManager.mqh # 8-stage gate system │ │ ├── LearningBridge.mqh # Learning data bridge │ │ ├── Telemetry.mqh # Telemetry system │ │ ├── TelemetryStandard.mqh # Standard telemetry │ │ ├── InsightsLoader.mqh # Insights JSON loader │ │ ├── SessionManager.mqh # Session management │ │ ├── CorrelationManager.mqh # Correlation analysis │ │ ├── VolatilitySizer.mqh # Volatility-based sizing │ │ ├── Strategies/ # Strategy Implementations │ │ │ ├── Registry.mqh # Strategy registry │ │ │ ├── ADXStrategy.mqh │ │ │ ├── BollAveragesStrategy.mqh │ │ │ ├── MeanReversionBBStrategy.mqh │ │ │ ├── SuperTrendADXKamaStrategy.mqh │ │ │ ├── RSI2BBReversionStrategy.mqh │ │ │ ├── DonchianATRBreakoutStrategy.mqh │ │ │ └── ... (17 more strategies) │ │ └── Indicators/ # Technical Indicators │ │ ├── ATR.mqh │ │ ├── Donchian.mqh │ │ ├── KAMA.mqh │ │ └── ... (7 more indicators) │ ├── ML/ # Machine Learning Pipeline │ │ ├── train.py # Model training script │ │ ├── policy_export.py # Policy generation │ │ ├── dataset.py # Data loading utilities │ │ ├── features.py # Feature engineering │ │ ├── model.py # Model definitions │ │ ├── policy.py # Policy utilities │ │ ├── artifacts/ # Model artifacts │ │ │ ├── tf_model.keras # Trained model │ │ │ ├── scaler.pkl # Feature scaler │ │ │ └── features.json # Feature definitions │ │ └── requirements.txt # Python dependencies │ ├── Scripts/ # Utility Scripts │ │ ├── InsightsRebuild.mq5 # Rebuild insights from data │ │ └── PolicyDump.mq5 # Policy debugging │ ├── docs/ # Documentation │ │ ├── README.md # This file │ │ ├── CORE_IMPLEMENTATION_PLAN.md │ │ ├── DualEA_Handbook.md │ │ └── ... (11 more docs) │ ├── config/ # Configuration │ │ └── learning_config.json │ ├── logs/ # Log files │ ├── results/ # Test results │ └── build_*.bat # Build scripts ``` ### Common Files Structure (Shared Data) ``` Terminal/Common/Files/DualEA/ ├── features.csv # Feature data from strategies (with rotation) ├── knowledge_base.csv # Trade execution records ├── insights.json # Performance analytics per strategy/symbol/timeframe ├── policy.json # ML-generated trading policy with confidence thresholds ├── insights.reload # Trigger file for insights reload (LiveEA uses this to request rebuilds) └── policy.reload # Trigger file for policy reload (PaperEA_v2 uses this; LiveEA requires restart) ``` ## Current Implementation Status ### ✅ Fully Implemented & Working **PaperEA v2 System (2793 lines)** - 8-stage gate system with unified configuration (ConfigManager, EventBus, SystemMonitor) - 23 indicator-based signal generators (e.g., `ADXStrategy`, `RSIStrategy`, `MACDStrategy`) with asset-class registry - Real MT5 order execution on demo accounts via `CTradeManager::ExecuteOrder()` - Advanced optimization: AdaptiveSignalOptimizer, PolicyUpdater, PositionReviewer, GateLearningSystem - Comprehensive input parameters (180+ settings for fine-tuning) - Circuit breakers, news filtering, regime detection, session management - Knowledge Base with CFeaturesKB (features.csv) and CKnowledgeBase (knowledge_base.csv) - Real-time telemetry with TelemetryStandard wrapper - UnifiedTradeLogger for JSON lifecycle tracking - TradeManager with market/pending orders, ATR/fixed trailing stops **LiveEA System (1702 lines)** - Complete insights gating from insights.json (strategy/symbol/TF performance metrics) - ML policy gating from policy.json with confidence thresholds and SL/TP/trail scaling - Risk gating: spread, session, daily loss, drawdown, margin, consecutive losses - News blackout filtering with CSV-based event calendar - Exploration mode for strategies with insufficient historical data - Position/Session/Correlation/Volatility managers fully integrated - InsightsLoader for DRY insights parsing - Strategy bridge for live execution **ML Pipeline (Python)** - train.py: TensorFlow/Keras classifier + LSTM with TimeSeriesSplit validation - policy_export.py: Converts trained models to policy.json with slice-based probabilities - features.py: Yahoo Finance enrichment, technical indicators, scaling - dataset.py: CSV loading with label generation from R-multiples - File rotation and compression for large artifacts - artifacts/: Saved models (.keras), scalers (.pkl), metadata (.json) **Supporting Systems** - GateManager: 8 gates with learning-based threshold adjustment - LearningBridge: Bidirectional data flow between Paper/Live, CSignalDecision records - StrategySelector: Performance-based strategy scoring with recency weighting - InsightsRebuild.mq5: One-click insights.json generation from features.csv - Test suite: 8 test files for integration, gates, managers, system health ### 🔄 Implemented with Minor Gaps - **Insights auto-reload**: LiveEA watches for `insights.reload` request and polls for `insights.ready` to auto-reload. PaperEA's `CheckInsightsReload()` exists but only deletes the file (rebuild logic commented out). - **LSTM sequence training**: Code exists but needs min sequence validation - **Multi-timeframe confirmation**: P5_MTFConfirmEnable parameter exists, needs gate implementation ### 🔴 Not Implemented (Future Enhancements) - **Real-time Insights Auto-Rebuild**: Automatic background InsightsRebuild trigger when features.csv is stale - **LiveEA Policy Hot-Reload**: Watch `policy.reload` to refresh ML policy without EA restart (PaperEA already supports this) - **Multi-timeframe MTF Gate**: P5_MTFConfirmEnable parameter exists but gate logic needs implementation - **Advanced Correlation Pruning**: More sophisticated portfolio correlation algorithms beyond Pearson - **Distributed Training**: Multi-machine ML training for large datasets ## �️ P0-P5 Advanced Hardening & Intelligence (NEW) The EA now includes a comprehensive hardening and intelligence upgrade with P0 through P5 priority levels: ### **P0 (Production Risk) - CRITICAL** - **Nuclear Risk Engine**: VaR 95%, CVaR, Kelly Criterion, correlation matrix monitoring - **SQLite Knowledge Base**: Parallel CSV migration with 30-day transition period - **Shadow Logging**: Atomic CSV writes with checksums and file locking ### **P1 (Architectural Hardening)** - **Feature Cache**: Pre-warmed indicator handles (ADX, ATR, RSI) to eliminate redundant calculations - **System Monitor**: Real-time CPU and memory tracking with automatic circuit breakers - **Volatility Exits**: Trailing stop system with volatility-adjusted sizing ### **P2 (Intelligence Enhancements)** - **Concept Drift Detector**: Welford's Algorithm-based gate threshold auto-adjustment - **Auto-Promotion System**: Performance-based strategy promotion from PaperEA to LiveEA - **Shadow Trading Bridge**: Parallel demo execution to detect slippage - **Multi-Timeframe Confirmation Gate**: MTF entry validation to reduce false signals - **Correlation-Aware Pruner**: Prevents strategy over-concentration (0.70 max correlation) ### **P3 (Performance Optimizations)** - **CPU Budgeting**: 10ms fail-fast with risk gate protection (G1/G4/G7/G8 never skipped) - **Indicator Cache**: Pre-warmed handles for all technical indicators - **Lock-Free Ring Buffers**: 8192-element capacity for zero-contention logging - **Batch Telemetry Writes**: Batched I/O to reduce disk pressure - **Timer Strategy Scanner**: Centralized low-tick strategy scanning ### **P4 (Strategic Evolution)** - **gRPC ML Bridge**: Real-time ML inference with latency monitoring - **Adversarial Fuzzer**: Automated jailbreak testing for robustness validation - **Nuclear Risk Engine** (comprehensive): VaR, Kelly, correlation-based circuit breakers - **Feature Drift Detector**: Real-time distribution shift detection ### **Integration Architecture** ```cpp // P0-P5 systems are managed by CDualEAController singleton // Integrated via PaperEA_v2_P0P5_Integration.mqh // OnInit: InitializeP0P5Systems(); // Initializes all P0-P5 subsystems // OnTick: OnTickP0P5(); // Processes drift detection, CPU budgeting, risk checks // OnTimer: OnTimerP0P5(); // Periodic maintenance (telemetry flush, shadow trades) // OnDeinit: ShutdownP0P5Systems(); // Clean shutdown of all P0-P5 components ``` **Key Design Decisions**: - Risk gates (G1, G4, G7, G8) are never skipped under CPU pressure - Multi-symbol management remains chart-per-symbol with Redis coordination - SQLite runs parallel to CSV for 30-day migration period - All P0-P5 features have enable/disable input parameters for gradual rollout ## �🔧 Unified System Architecture (NEW) The DualEA system features a **Unified Architecture** that eliminates redundancy by consolidating insights management and gating pipeline into three core components: **Core Components:** - **ConfigManager**: Centralized configuration for gates, insights, and system settings - **EventBus**: Cross-component communication with priority-based event logging - **SystemMonitor**: Real-time health monitoring and performance metrics **Key Benefits:** - Single source of truth for configuration and monitoring - Event-driven architecture with unified logging - Real-time performance tracking and health scoring - Backward compatibility with legacy mode support **Quick Start:** ```cpp // Initialize unified system (enabled by default) CGateManager* gateManager = new CGateManager(symbol, timeframe, learning, true); // Access unified components for advanced configuration CConfigManager* config = CConfigManager::GetInstance(); config->SetVerboseLogging(true); config->SetNoConstraintsMode(false); ``` See [UnifiedSystemGuide.md](UnifiedSystemGuide.md) for detailed integration documentation. ## Key Features ### 8-Stage Gate System (PaperEA v2) 1. **Signal Rinse**: Basic signal validation and confidence filtering 2. **Market Soap**: Market context analysis (volatility, correlation, regime) 3. **Strategy Scrub**: Strategy-specific validation and parameter adjustment 4. **Risk Wash**: Risk-based position sizing and validation 5. **Performance Wax**: Backtest-based performance validation 6. **ML Polish**: Machine learning confidence scoring 7. **Live Clean**: Live market condition validation 8. **Final Verify**: Final trade validation before execution ### Machine Learning Pipeline - **Feature Engineering**: 50+ technical indicators and market features - **Model Training**: TensorFlow/Keras with LSTM and Dense model support - **Policy Generation**: Automated policy.json creation with confidence thresholds - **Yahoo Finance Integration**: Market data enrichment for training - **Time Series Validation**: Proper temporal splits for backtesting ### Strategy Library (23 Signal Generators in PaperEA, 21 IStrategies in LiveEA) PaperEA_v2 uses **23 indicator-based signal generators** via `StrategySignalGenerators.mqh`: - ADX, RSI, MACD, Stochastic, CCI, Momentum, Williams %R, DeMarker, Force Index - Bears Power, Bulls Power, RVI, OsMA, TriX, Accelerator Oscillator, Awesome Oscillator - Alligator, Gator, Ichimoku, Fractals, ZigZag, Ultimate Oscillator, Moving Average LiveEA includes **21 IStrategy implementations** via `LiveEA_StrategyBridge.mqh` (available for external orchestration): - ADXStrategy, SuperTrendADXKamaStrategy, DonchianATRBreakoutStrategy, ForexTrendStrategy, AlligatorStrategy - BollAveragesStrategy, MeanReversionBBStrategy, RSI2BBReversionStrategy, VWAPReversionStrategy - AwesomeOscillatorStrategy, AcceleratorOscillatorStrategy, BearsPowerStrategy, BullsPowerStrategy, KeltnerMomentumStrategy, AroonStrategy - GoldVolatilityStrategy, IndicesEnergiesStrategy, OpeningRangeBreakoutStrategy - MultiIndicatorStrategy, EMAPullbackStrategy, StochasticOscillatorStrategy ### Data Management - **Knowledge Base**: Centralized trade logging with CSV rotation - **Features Export**: Long-format feature data for ML training - **Insights Generation**: Performance analytics per strategy/symbol/timeframe - **Common Files**: Cross-EA data sharing via MT5 Common Files directory ## System Configuration and Monitoring ### Gate Configuration Parameters The unified system supports comprehensive gate configuration through `ConfigManager`: ```cpp // News filtering UseNewsFilter, NewsBufferBeforeMin, NewsBufferAfterMin, NewsImpactMin // Trading windows UsePromotionGate, PromoStartHour, PromoEndHour // Market regime detection UseRegimeGate, RegimeATRPeriod, RegimeMinATRPct, RegimeMaxATRPct // Circuit breakers and insights CircuitCooldownSec, NoConstraintsMode InsightsAutoReload, InsightsLiveFreshMinutes, InsightsStaleHours ``` ### Execution Pipeline 1. **Early Phase**: Market condition validation and news filtering 2. **8-Stage Gate Processing**: Signal refinement through unified gate system 3. **Risk Management**: Position sizing and portfolio risk assessment 4. **Execution**: Trade placement with full audit trail and telemetry ### Observability Features - **Event-Driven Logging**: All system events flow through `EventBus` with priority levels - **Real-time Metrics**: Gate success rates, processing times, and system health scoring - **Performance Tracking**: Automated threshold optimization based on historical success rates - **Cross-EA Compatibility**: Identical configuration and behavior between PaperEA and LiveEA ## System Capabilities ### PaperEA_v2 Core Features - **Real MT5 Execution**: Places real orders on demo accounts via `CTradeManager::ExecuteOrder()` (not simulation) - **CTradeManager**: Market/pending orders, trailing stops (fixed-points & ATR) - **23 Signal Generators**: Indicator-based registry via `StrategySignalGenerators.mqh` - **8-Stage Gates**: ConfigManager/EventBus/SystemMonitor unified architecture - **Optimization**: AdaptiveSignalOptimizer, PolicyUpdater, PositionReviewer, GateLearningSystem - **Data Export**: features.csv (CFeaturesKB), knowledge_base.csv (CKnowledgeBase), JSON logs (UnifiedTradeLogger) - Inputs (PaperEA): - Position and risk: `LotSize`, `MagicNumber`, `StopLossPips`, `TakeProfitPips`, `MaxOpenPositions` (0=unlimited) - Trailing defaults (used if a strategy doesn't set them): `TrailEnabled`, `TrailType=0(fixed)`, `TrailActivationPoints`, `TrailDistancePoints`, `TrailStepPoints` - Mode toggles: `NoConstraintsMode` (bool, default **true**) — bypasses many constraints for maximum data collection; critical safety checks (circuit breaker, memory) remain enforced - Logging: `KBDebugInit` (writes INIT line), `DebugTrailing` (reserved) - Modules: - **Position Manager** (see `Include/PositionManager.mqh`) — available behind `UsePositionManager`. Defaults: PaperEA=`true`, LiveEA=`false`. Current integration initializes the manager and supports caps/correlation hooks; advanced exits/brackets will be integrated next. ### MQL5 Compatibility Notes All code has been verified MQL5-compatible with the following syntax adjustments: | C++ Syntax | MQL5 Syntax | Files Updated | |------------|-------------|---------------| | `->` operator | `.` operator | PaperEA_v2.mq5, AdaptiveSignalOptimizer.mqh, CInsightGateBridge.mqh | | `&` references | Direct array access | CInsightGateBridge.mqh, CInsightsRealtime.mqh | | `IsTradeAllowed()` | Custom implementation | PaperEA_v2.mq5 (lines 4663-4694) | | Non-existent methods | Commented out | PaperEA_v2.mq5 (RecordSanitizationEvent, PerformBatchLearning) | | Implicit type casts | Explicit `(double)` casts | CSQLiteKnowledgeBase.mqh, PaperEA_v2.mq5 | See [MQL5_Migration_Notes.md](MQL5_Migration_Notes.md) for detailed migration documentation. ### Critical Runtime Fixes (February 2026) Recent tester log analysis identified and resolved critical runtime issues: | Issue | Root Cause | Fix Location | |-------|------------|--------------| | **V0.00 Volume** | Signal field mismatch: generators set `signal.sl`, gates read `signal.stop_loss` (0.0) | `EnhancedEfficientGateSystem.mqh` lines 1006-1071 | | **3+ Second Delays** | ShadowLogger reading 488MB file into memory for every write | `CShadowLogger.mqh` - direct append mode | | **Signal Optimization Failed** | Invalid SL/TP (0.0) caused position sizing to return 0 volume | Signal field fallback logic added | **Key Fix - Signal Field Alignment:** ```cpp // Fixed: Check both field names with fallback decision.final_sl = (signal.stop_loss > 0) ? signal.stop_loss : signal.sl; decision.final_tp = (signal.take_profit > 0) ? signal.take_profit : signal.tp; decision.final_volume = (signal.volume > 0) ? signal.volume : 0.1; ``` **Key Fix - ShadowLogger Efficiency:** ```cpp // BEFORE: Read entire file + append + write back (3000ms+) // AFTER: Direct append with FILE_WRITE|SEEK_END (<10ms) // Added: Memory buffer fallback, progressive backoff, skip locking in tester ``` ### Latest Fixes (February 15, 2026) | Issue | Root Cause | Fix Location | |-------|------------|--------------| | **No Sell Orders** | Overly restrictive MA crossover conditions | `PaperEA_v2.mq5` lines 3467-3508 | | **Position Count 0** | CPositionManager not synced with MT5 positions | `PaperEA_v2.mq5` lines 1791-1797 | | **Memory Leaks** | Double deletion of MasterController objects | `PaperEA_v2.mq5` lines 1830-1854 | | **Wrong Position Limit** | Counted all MT5 positions instead of EA's | `PaperEA_v2.mq5` lines 3085-3106 | | **Insight Bridge Stats 0** | Bridge never queried in trading flow | `PaperEA_v2.mq5` lines 4239-4250 | **Key Fix - Sell Signal Generation:** ```cpp // OLD (broken): if(fast_ma > slow_ma && fast_ma < current_price) // Buy - worked else if(fast_ma < slow_ma && fast_ma > current_price) // Sell - rarely triggered // NEW (fixed): if(fast_ma > slow_ma) // Buy when fast > slow (uptrend) else if(fast_ma < slow_ma) // Sell when fast < slow (downtrend) ``` **Key Fix - Position Sync:** ```cpp if(CheckPointer(g_position_manager) != POINTER_INVALID) { g_position_manager.SyncPositions(MagicNumber); LOG(StringFormat("[PositionManager] Synced with %d positions for magic=%d", g_position_manager.GetPositionCount(), MagicNumber)); } ``` See [RECENT_MODIFICATIONS.md](RECENT_MODIFICATIONS.md) for detailed ongoing changes. --- ### LiveEA Inputs (New) - **Policy fallback and gating**: - `UsePolicyGating`, `DefaultPolicyFallback`, `FallbackWhenNoPolicy`, `FallbackDemoOnly`. - Log reasons: `fallback_no_policy` (no slices loaded), `fallback_policy_miss` (slice not found). Both bypass exploration caps and use neutral scaling; demo-only unless `FallbackDemoOnly=false`. - **Insights auto-reload controls**: - `InsightsAutoReload`, `InsightsLiveFreshMinutes`, `InsightsReadyPollSec` (inputs present; wiring for automated reload is being expanded in LiveEA). - **Position management**: - `UsePositionManager` (default false) and `PMMaxOpenPositions` for portfolio caps; enables integration with `Include/PositionManager.mqh` where available. #### Policy scaling keys - LiveEA expects trailing scaling under the key `trail_scale`. - PaperEA’s `PolicyEngine` and `docs/PolicySchema.md` use `trail_atr_mult` for ATR-based trailing. Exporters may emit both keys for compatibility until the schema is unified. ## Where Files Are Written We target the MT5 Common Files area so Strategy Tester, Demo/Paper, and Live share the same outputs. - Typical path: `C:\Users\\AppData\Roaming\MetaQuotes\Terminal\Common\Files\DualEA\` - Alternative (some installs): `C:\ProgramData\MetaQuotes\Terminal\Common\Files\DualEA\` Files produced: - `knowledge_base.csv` (header created at init) - `knowledge_base_events.csv` - `features.csv` (per-trade feature rows for ML) - `explore_counts.csv` (weekly exploration usage) - `explore_counts_day.csv` (daily exploration usage) - `insights.json` (aggregated performance by strategy/symbol/timeframe) - `policy.json` (exported by trainer) and `policy.reload` (touch file to trigger hot-reload) ## Documentation - [Phase 3 Plan](docs/Phase3.md) - [Policy JSON Schema](docs/PolicySchema.md) - [Knowledge Base CSV Schemas](docs/KB-Schemas.md) - [Operations Guide](docs/Operations.md) ## Knowledge Base Schemas - `knowledge_base.csv` - Columns: `timestamp,symbol,type,entry_price,stop_loss,take_profit,close_price,profit,strategy_id` - `knowledge_base_events.csv` - Columns: `timestamp,strategy,retcode,deal,order` ## How To Build - Use the provided batch scripts: - PaperEA: open a terminal in `MQL5/Experts/Advisors/DualEA/PaperEA/` and run `build_paperea.bat` - LiveEA: open a terminal in `MQL5/Experts/Advisors/DualEA/LiveEA/` and run `build_liveea.bat` - Or compile from MetaEditor (`PaperEA.mq5` / `LiveEA.mq5`). ## How To Run (Strategy Tester) 1. Open Strategy Tester and select `PaperEA`. 2. On the Inputs tab, click Reset to load the latest defaults. 3. Adjust `LotSize`, `SL/TP`, and trailing inputs as needed. 4. Run a backtest; outputs will be in `Common\Files\DualEA\` and visible in the Journal. ## Trainer Workflow (Windows) - Requirements: Python 3, internet access (for pip + Yahoo enrichment). - Steps: 1) Open a terminal in `MQL5/Experts/DualEA/ML/`. 2) Run: `run_train_and_export.bat` - What it does: - Creates `.venv/`, installs `ML/requirements.txt`. - Runs `train.py` to produce `ML/artifacts/tf_model.keras`, `scaler.pkl`, `features.json`. - Runs `policy_export.py --min_conf 0.45` to write `Common\Files\DualEA\policy.json` with per-slice `p_win` and scaling fields: `sl_scale`, `tp_scale`, `trail_scale` (LiveEA) or `trail_atr_mult` (PaperEA). - Touches `Common\Files\DualEA\policy.reload`. - EA behavior: - `PaperEA` calls `CheckPolicyReload()` in both `OnTimer()` and `OnTick()`; when `policy.reload` exists, it reloads `policy.json` and logs `Policy gating: min_conf=..., slices=N`. - On trade execution, if policy is loaded, the EA applies per-slice scaling before sending the order. ### Rebuilding Insights (without rerunning trades) - Use the provided script to recompute `insights.json` from the current `features.csv`: 1) In MT5 Navigator → Scripts → run `InsightsRebuild`. 2) Check `Common\Files\DualEA\insights.json` and Journal for status. ## Troubleshooting - “No CSVs in MQL5/Files”: Expected. Tester and Live now write to `Common\Files\DualEA` using `FILE_COMMON`. - “Error 5004 opening file”: First‑run read attempts can fail if the file doesn’t exist; the constructor now creates the file and header without logging an error. - “Inputs not showing in Tester”: Click Inputs → Reset; MT5 caches previous inputs. --- ## PaperEA - Purpose: primary data-collection EA for backtests and demo/paper runs. Logs features, events, and trades to the shared Knowledge Base for ML and insights. - Execution model: - OnInit/OnTick drive the scan→gate→execute path; logs to KB on every decision and execution. - Policy reload via `DualEA/policy.reload` checked in `CheckPolicyReload()`; telemetry flush after scans. - Timer-based scanning per Phase 6 design may be enabled as parity with LiveEA (see Phase 6) where implemented. - Gating and exploration caps: - `NoConstraintsMode` (default **true**) bypasses many gates/caps for unrestricted exploration; critical safety checks (circuit breaker, memory guard, news filter) remain enforced. - Exploration caps persist in Common Files: `DualEA/explore_counts_day.csv`, `DualEA/explore_counts.csv`. - No‑slice‑only bypass: exploration only bypasses when a slice truly doesn’t exist; existing under‑threshold slices remain gated. - Reset by deleting the above CSVs in `Common\Files\DualEA`. - Policy integration and fallback: - Inputs: `UsePolicyGating`, `DefaultPolicyFallback`, `FallbackWhenNoPolicy`, `FallbackDemoOnly`. - When policy is loaded and slice exists, `ApplyPolicyGating()` checks confidence (per-slice scaling currently minimal in PaperEA; LiveEA has full scaling). - On fallback (no policy or slice missing), trades use neutral scaling, do not consume exploration quotas, and bypass caps (demo‑only by default). - Persistence paths (MT5 Common Files): - `knowledge_base.csv`, `knowledge_base_events.csv`, `features.csv`, `insights.json`, exploration CSVs under `Common\Files\DualEA`. - CI hooks (insights freshness + coverage): - Use `kb_check.bat` to rebuild and validate `insights.json` headlessly; fails on stale/empty slices and on missing required coverage. - Example: ```powershell kb_check.bat --build-insights --attempt-run-script --run-validate --fail-on-stale --fail-on-empty-slices --require-symbols=USDCNH --require-timeframes=60 --require-strategies=BollAverages,DonchianATRBreakout,RSI2BBReversion --fail-on-missing-required --show-report ``` ## Roadmap (Phased) This roadmap aligns with the implementation plan. For detailed Phase 3 guidance (docs, hygiene, scoring, roadmap), see: - `docs/Phase3.md` ### Action Framework — 3 Phases × 3 Cycles (Merged) - Source: `docs/DualEA_Action_Framework.md` (full details and templates) - Phase 1 — Codebase & Requirements Deep Dive - Cycle 1: Structural Audit (jailbreak permitted) - Inventory gating paths (strategy → policy → insights → execution) - Trace file I/O and timers: `CheckPolicyReload()`, `CheckInsightsReload()`, staleness checks - Identify insertion points: circuit breakers, session/news filters, PositionManager, correlation, vol sizing, regime - Deliverables: audit map + risk log - Cycle 2: Requirements Mapping - Spec one‑pagers per feature with inputs, data flow, telemetry, failure/rollback - Cycle 3: Risk & Gaps Closure - Threat model: file races, stale artifacts, partial reloads; decide LiveEA fail‑safe defaults - Deliverables: mitigations + rollback levers; updated lifecycle gates - Phase 2 — Design, Build, Validate - Cycle 1: Task Decomposition - Backlog with effort/risk/owner/sequence for FR‑01..FR‑10 - Cycle 2: Code + Peer Review - Definition of Ready: inputs defined, telemetry standardized, rollback behavior set - Guidelines: feature flags (`Use*`), shared includes under `Include/` - Cycle 3: QA + Fuzzing - Unit‑like stubs, deterministic sims, log assertions; fuzz missing files/reload storms/high‑tick - Phase 3 — Polish, Lockdown, Final Scoring - Cycle 1: Docs & architecture alignment (README + lifecycle + operator runbooks) - Cycle 2: Code hygiene & consistency (inputs/enums/log tags; dead‑code purge) - Cycle 3: Final scoring (correctness/safety/observability/perf) + next roadmap #### Action Backlog (Pre‑Implementation Specs) - FR‑01 Circuit Breakers — Inputs: `UseCircuitBreakers`, `DailyLossLimit`, `DailyDrawdownLimit`, `CooldownMinutes`; block entries, allow exits; telemetry `cb:*`; DoD: day rollover sims - FR‑02 Session/Window Filter — Inputs: `UseSessionFilter`, `SessionTZ`, `SessionWindows`; pre‑gate block; DoD: DST/tz edges - FR‑03 News Filter — Inputs: `UseNewsFilter`, `ImpactLevelMin`, `PreLockoutMin`, `PostLockoutMin`; offline‑safe fallback; DoD: replay test - FR‑04 Position Manager (v1) — Inputs: `UsePositionManager`, `ExitProfile`, `ClusterMinPts`, `PerSymbolMax`; centralized exits/scaling hooks; DoD: backtest diffs. (Core module implemented in `Include/PositionManager.mqh`; integration behind flag pending.) - FR‑05 Correlation Exposure Caps — Inputs: `UseCorrelationCaps`, `CorrLookbackDays`, `MaxGroupExposure`; cap grouped exposure; DoD: deterministic calc - FR‑06 Volatility Position Sizing — Inputs: `UseVolSizing`, `ATRPeriod`, `RiskPerTrade`; ATR‑adaptive lots; DoD: regime consistency, caps respected - FR‑07 Regime Detector Stub — Inputs: `UseRegime`, `RegimeMethod`; tag regime; optional gating modifier; DoD: stable tags - FR‑08 Promotion Gate & Evaluator — Inputs: min trades/hit‑rate/expectancy/DD/Sharpe; artifact: `Scripts/DualEA/AssessPromotion.mq5`; DoD: reproducible - FR‑09 Telemetry Standardization & Ops Views — Event schema/fields/severity; rotate/size bounds; optional ops notebooks - FR‑10 Performance — Event batching, log throttling, timer cadence review; DoD: CPU/mem profile under stress #### Control Gates (Before Coding) - Gate A: Specs complete (inputs, flow, telemetry, rollback) for FR‑01..FR‑10 - Gate B: Test plans defined; simulators/log assertions ready - Gate C: Security + fail‑safe review; LiveEA defaults conservative #### Ownership & Sequencing (Draft) - Wave 1 (risk first): FR‑01, FR‑02, FR‑08 - Wave 2 (exposure/positioning): FR‑04, FR‑05, FR‑06 - Wave 3 (context/perf): FR‑03, FR‑07, FR‑09, FR‑10 - Note: Features default‑off in LiveEA until validated in PaperEA ### Status Dashboard - Completed: - Phase 1: Data & Insights Foundation (insights builder, headless rebuild, validator, CI flags, Common Files outputs) - Phase 2: ML/LSTM Pipeline (trainer + policy export + batch runner; PaperEA policy hot‑reload integrated) - Phase 2a: PaperEA Execution & Telemetry (baseline complete; timer-scan parity tracked under Phase 6) - Phase 3 (core): LiveEA core loop with policy gating/fallbacks and scaling - `LiveEA/LiveEA.mq5`: policy loaded from file on init; `ApplyPolicyScaling()` applies SL/TP/trailing (trailing via `trail_scale`), fallback gating (`fallback_no_policy`, `fallback_policy_miss`, demo‑only by default), heartbeat with fallback flags - In Progress: - Phase 3: LiveEA hardening (risk gates, stricter caps, optional shadow‑mode, per‑minute de‑dup) - Phase 6: Low‑Latency Minutely Scanner & ML‑Enriched Orchestration - Phase 6: Low‑Latency Minutely Scanner & Orchestration (central `ScanStrategies`, minute de‑dup, parity with OnTick) - Phase 2a → P1C1 (ACTIVE): Structural Audit for PaperEA (gating/caps persistence, telemetry, KB writes, insights staleness, CI validators) - Phase 4/7/8: Risk/Telemetry/Adversarial hardening — partial primitives present - Ops/CI TODOs (remaining): - Add `kb_check.bat` for headless insights rebuild+validate and wire into CI (fail on stale/coverage). - Add `scripts/RunInsightsValidation.ps1` and `ScheduleInsightsValidation.ps1` for scheduled validation. - Optional CI trainer job: run `ML/run_train_and_export.bat` on schedule/data‑change; publish `policy.json` and touch `policy.reload`. - Operator runbook: KB rebuild/validate flows and artifact paths under `Common\\Files\\DualEA`. - Telemetry: concise summaries for insights rebuild/validation outcomes. - Not Implemented: - Phase 5, 9, 10, 11 ### Phase 1: Data & Insights Foundation - TODOs (hardening and ops): - CI integration: add `kb_check.bat` and wire `Scripts/ValidateInsights.mq5` to CI to fail on stale `insights.json`, empty/missing slices, and unmet required coverage (symbols/TFs/strategies). - Headless rebuild wrapper: provide a batch/PowerShell entry point to run `Scripts/InsightsRebuild.mq5` non‑interactively (for CI/scheduled tasks). - Schema versioning: version `insights.json` and add compatibility checks in `Include/StrategySelector.mqh`; document version in `docs/KB-Schemas.md`. - I/O hardening: ensure `FolderCreate("DualEA", FILE_COMMON)` is called by all writers; prefer robust readers (`FILE_TXT|FILE_ANSI`), skip malformed rows, and log/continue. - Validator enhancements: expand `ValidateInsights` to assert non‑empty required metrics per slice and configurable thresholds; surface a concise report. - Ops scheduling: optionally add `scripts/RunInsightsValidation.ps1` and `ScheduleInsightsValidation.ps1` to run validation on a cadence. ### Phase 2: ML/LSTM Pipeline - TODOs (ops/hardening): - CI trainer job: run `ML/run_train_and_export.bat` on schedule or data‑change; publish `policy.json` to Common Files and touch `policy.reload`. - Provenance & signing: include model hash, train window, metrics in `policy.json`; sign/hash for integrity; keep last‑known‑good for rollback. - Shadow eval & A/B: support dual policies in PaperEA (shadow mode) prior to promotion to LiveEA. - Calibration & thresholds: reliability diagrams, Brier, per‑slice min_conf calibration; document acceptance bands. - Monitoring: log SHAP/feature importance drift signals; alert on material drift. - Rollback guardrails: auto‑rollback to last‑known‑good on parse/plausibility failure during hot‑reload. Note (sequencing): core ML training/export and PaperEA policy load are implemented. The structured 3×3 audit for Phase 2 will begin after Phase 3 — Cycle 3. - Suggestions: - Use walk‑forward splits; track ROC‑AUC, Brier, Expected‑R; calibrate probabilities and thresholds per slice. - Export `policy.json` with provenance (model hash, train window, metrics); sign/hash for integrity. - Run A/B policies and shadow evaluation in PaperEA before promotion to LiveEA. - Log SHAP/feature importance to monitor drift and potential leakage. ### Phase 2a: PaperEA Execution & Telemetry - TODOs (remaining): - CI wiring: integrate `Scripts/ValidateInsights.mq5` into CI and add `kb_check.bat` to fail on stale `insights.json`, empty/missing slices, and missing required coverage. - Headless operations: add `scripts/RunInsightsValidation.ps1` and `ScheduleInsightsValidation.ps1` for scheduled rebuild/validation. - Ops docs: add a short operator runbook covering rebuild/validate flows and artifact locations in `Common\\Files\\DualEA`. - Explore caps ops: provide a lightweight reset helper and a smoke test that verifies daily/weekly counters persist and increment as expected. - Telemetry polish: emit concise summaries for insights rebuild/validation outcomes. - Status: - Baseline implemented (modular strategies, exploration caps/gating, `NoConstraintsMode`, policy hot‑reload/fallbacks, Common Files persistence). - Timer‑based scanning parity with LiveEA is tracked under Phase 6. ### Phase 3: LiveEA & Feedback Loop - Implement `LiveEA.mq5` with the same strategies but stricter gating (policy + risk limits). - LiveEA logs to the same KB; trainer merges Paper+Live data. - Feedback loop: Paper adapts based on Live outcomes via retrained policy. - TODOs (remaining): - LiveEA shadow‑mode: log candidate decisions; execute only top ML‑ranked passing min_conf and risk budget. - Tighter gates vs PaperEA: stricter min_conf, spread/news/session caps, lower exploration caps. - Enforce risk/circuit‑breakers: max daily loss, session drawdown, stricter spread/news/session caps. - One‑execution‑per‑slice‑per‑minute de‑dup; deterministic tie‑breakers. - Full timer‑scan parity (Phase 6): centralize ScanStrategies; consistent OnTick/Timer paths. - Policy hot‑reload guardrails with rollback to last‑known‑good on parse/plausibility failure. - Integrate `Include/PositionManager.mqh` behind `UsePositionManager`; route sizing/exits through it. - Prep hooks for Phase 6 parity: shared scanner entrypoints and per‑minute dedup state. #### Red‑Team Execution Plan (3×3) — Current focus - Phase 1: Codebase & Requirements Deep Dive - Cycle 1 Structural Audit for LiveEA - Cycle 2: Requirements Mapping to concrete code paths and artifacts; close gaps - Cycle 3: Risk & Gaps Closure; redesign fragile modules as needed - Phase 2: Design, Build, Validate - Cycle 1: Task decomposition for LiveEA hardening; define acceptance criteria - Cycle 2: Implement fixes; peer review and adversarial edge‑case tests - Cycle 3: QA + fuzzing of IO/races; enforce CI gates - Phase 3: Polish, Lockdown, Final Scoring - Cycle 1: Docs & architecture alignment (README + docs/Phase3.md) - Cycle 2: Code hygiene & consistency; refactors; dead‑code purge - Cycle 3: Final scoring + roadmap Next: Upon completing Phase 3 — Cycle 3 above, begin Phase 2 — Cycle 1 (ML/LSTM Pipeline) as the next 3×3 plan. ### Phase 4: Risk & Safety Systems ##### Phase 4 TODO checklist - [ ] Run Strategy Tester to trigger each Phase 4 gate and confirm risk4_* telemetry + margin_level reason #### Phase 4 Telemetry: risk4_* events and reason strings - `risk4_spread`: spread cap gating. - Shadow (NoConstraintsMode=true): `LogGatingShadow(strategy, symbol, tf, "risk4_spread", ok, reason, true)` - Enforced: `[RISK4] blocked on / reason=` and `LogGating(symbol, tf, strategy, "risk4_spread", allow, reason)` ### Phase 5: Dynamic Strategy/Indicator Selection - Status: In progress — merged into LiveEA: cooldown + auto re-enable + dynamic auto‑tuning with telemetry (`underperf_auto_disabled`, `p5_cooldown`, `p5_auto_reenabled`, `p5_auto_tune`). - New (LiveEA): Phase 5 telemetry completed for `p5_refresh`, `p5_rescore`, and `p5_selector_cfg`. - TODO (prioritized) 1. Selector wiring parity in both EAs (OnInit): thresholds, recency overlay, strict thresholds, and per‑symbol/timeframe strategy registration. - Acceptance: strategies register per symbol/TF; logs/telemetry confirm thresholds/recency overlays applied. 2. Correlation‑aware pruning within selector/gating to retain a diversified subset per symbol/timeframe. - Emit `p5_corr` telemetry; cap per symbol/TF. 3. Multi‑timeframe confirmations in selector/gating with inputs (e.g., `EnableMTFConfirmations`, `MTFConfirmTF`, `MTFConfirmMinScore`) and telemetry (`p5_mtf`). 4. Parameter stability tracking in selector; compute stability score and gate via (`P5_StabilityGateEnable`, `P5_StabilityWindowDays`, `P5_StabilityMaxStdR`) with telemetry (`p5_stability`). 5. Policy integration for subset selection/weighting from ML policy (beyond neutral scaling); document and gate safely. 6. Feature/telemetry export parity after exec in both EAs (ATR, spread, TF, trailing params, strategy features). 7. Telemetry consistency across both EAs: standardize remaining `p5_*` event keys and shadow logging under `NoConstraintsMode` (PaperEA parity). 8. Test plan: backtests (walk‑forward), forward/demo runs, and monitoring to validate selector and gating behavior. ### Phase 6: Low‑Latency Minutely Scanner & ML‑Enriched Orchestration - Status: Partial — OnTimer heartbeat/reload present; centralized `ScanStrategies` with minute de‑dup not yet implemented. - Guarantee both EAs "look" for trades at least every minute, independent of tick arrival. - Add inputs: `TimerScanEnabled` (bool, default `true`), `TimerScanSeconds` (int, default `60`). - `OnInit()`: configure `EventSetTimer(TimerScanSeconds)` when `TimerScanEnabled`. - `OnTimer()`: run a `ScanStrategies()` routine that performs the same Refresh → CheckSignal → gating (selector + insights + policy + caps) path as `OnTick()`. - Deduplicate within a minute per `symbol|timeframe|strategy` using a rolling `LastScanMinute` map to avoid duplicate triggers if ticks also arrive. - Preserve existing behavior: always `CheckPolicyReload()` and `Telemetry.Flush()` on timer. - Performance & reliability hardening - Pre‑create and reuse indicator handles for all registered strategies/timeframes to avoid reallocation overhead per scan. - Cache policy and insights in memory; throttle file I/O to timer ticks; batch telemetry writes. - Optional: `EventSetMillisecondTimer(250–1000ms)` for ultra‑low‑latency scanning in LiveEA; gate by CPU budget. - LiveEA enrichment path - Consume trained ML outputs for per‑slice `min_conf`, expected‑R, and dynamic sizing; apply via `ApplyPolicyScaling()`. - Maintain exploration caps and detailed `LogGating`/`LogGatingShadow` for full auditability. - Test & validation plan - Backtests: walk‑forward with OOS across 3–5y per symbol/TF, including realistic spread/slippage/commission; parameter stability and FDR controls. - Forward tests: parallel demo/real, M1 granularity logs, latency SLO (<250ms scan→gate→exec where broker allows), missed‑opportunity audits. - Monitoring: 60s heartbeat, exploration cap summaries, and per‑slice gating counters. - Suggestions: - Guard `OnTimer()` with a re‑entrancy flag to prevent overlapping scans; prefer non‑blocking work. - Expose `TimerScanSeconds` overrides (e.g., 30s) and optional `EventSetMillisecondTimer` for LiveEA with CPU budget guard. - Record scan→gate latency metrics; emit to telemetry for SLO tracking. - Pre‑warm indicator handles in `OnInit()`; refresh/rebuild on symbol/period change; cache policy/insights in memory. - Centralize gating in a reusable `EvaluateAndMaybeExecute()` path used by both `OnTick()` and timer scans. ### Phase 7: Monitoring & Telemetry - Emit telemetry CSV/JSON (tick latency, SL moves, trades/sec, error rates). - Optional lightweight dashboard (HTML/JS) or notebook to visualize metrics. - Suggestions: - Define SLOs: scan→gate latency, missed‑opportunity rate, per‑reason gating counts. - Alerts for policy/insights read failures and staleness; log rotation and retention policy. - Optional dashboard/notebook; per‑slice counters and trend lines for drift/anomaly detection. ### Phase 8: Adversarial/Jailbreak Hardening - Fuzz file I/O (empty/corrupt/locked `policy.json`/`insights.json`/CSV) and assert safe fallbacks, halts, or rollbacks. - Timing/race tests: low-tick periods, bar-boundary races, clock skew; verify de-dup and single-exec semantics. - Resource pressure: very large CSVs, slow disk; ensure `OnTick()` remains non-blocking, heavy I/O on timer. - Produce Q&A logs, expert rebuttals, and jailbreak traces mapped to files/modules per @/greep. - Suggestions: - Add `SafeMode` input to force conservative gating on anomalies; persist last‑known‑good `policy.json`/`insights.json` caches. - Create a fuzz harness (script/test) that mutates JSON/CSV and asserts expected EA behavior and logs. - Store jailbreak trace logs in `Common\Files\DualEA\jailbreak\` with timestamps and module references. - Automate adversarial tests in CI; fail the pipeline on missing fallbacks or unsafe behavior. ### Phase 9: MLOps & Continuous Training - Data/versioning (DVC/Git LFS), model registry, and feature/label drift detection with alerts. - Scheduled retraining and policy export with provenance (model hash, data window, metrics). - Canary deployment of `policy.json` and automatic rollback on degradation or plausibility failures. - Suggestions: - Define acceptance criteria (min ROC‑AUC/Brier, uplift vs baseline) before policy promotion to LiveEA. - Build reproducible training pipelines (seeded, environment‑pinned) and artifact signing. - Add drift detectors on features/labels; trigger retrain or quarantine when thresholds are exceeded. - Maintain a data catalog of `features.csv` schema versions and TTL/retention policies. ### Phase 10: Multi‑Symbol/TF Orchestration (Optional) - Option A: one EA per symbol/TF (simple, robust). Option B: single orchestrator scanning a configured portfolio. - Central registry of symbols/TFs; per-slice de‑dup and CPU budget/load shedding to maintain latency SLOs. - Consistent telemetry across all slices; portfolio‑level risk budget enforcement. - Suggestions: - For orchestrator mode: implement per‑slice schedule, backpressure, and fairness to avoid starving symbols. - Throttle scanning and degrade gracefully under CPU load; prioritize LiveEA executions. - Guard broker API calls; exponential backoff on transient errors; per‑symbol error budgets. - Keep robust chart‑per‑slice mode as default until orchestrator proves reliability. ### Phase 11: Performance & Resilience - Avoid heavy file I/O in `OnTick()`; defer to timer/batched writes; use `FILE_SHARE_*` and rotate logs. - Pre‑allocate buffers, reuse indicator handles; cap log verbosity on hot paths. - Watchdog for timer and safe‑mode fallbacks on parse errors (use last‑known‑good caches). - Suggestions: - Implement log rotation (daily/size‑based) and retention; compress archives. - Add a timer watchdog that re‑initializes the timer if missed deadlines are detected. - Use re‑entrancy guards around critical sections (order placement, persistence writes). - Ensure `OnDeinit()` flushes telemetry and persists counters atomically. --- ## Next Milestones - Add features.csv export and insights.json aggregation. - Provide Python ML trainer and batch launcher (writes policy.json). - Add `policy.json` loader in PaperEA and gating/scaling application. - Skeleton `LiveEA.mq5` with circuit breaker checks. ## LiveEA: PositionManager — Correlation Sizing + Dynamic Risk Caps This section documents the LiveEA wiring of `Include/PositionManager.mqh` for correlation‑aware sizing and dynamic risk caps. All features are behind `UsePositionManager` and new PM inputs. ### Inputs (LiveEA) - PositionManager switches - `UsePositionManager` (bool) - `PM_EnableCorrelationSizing` (bool, default true) - `PM_EnableAdaptiveSizing` (bool), `PM_MinSizeMult` (double), `PM_MaxSizeMult` (double) - `PM_ScalingProfile` (int: 0=Aggressive, 1=Moderate, 2=Conservative) - `PM_EnableVolatilityExit` (bool), `PM_VolatilityExitATRMult` (double) - Dynamic risk caps (optional) - `PM_EnableDynamicRiskCaps` (bool) - `PM_MaxDailyDDPct` (double), `PM_MaxPosRiskPct` (double), `PM_MaxPortfolioRiskPct` (double), `PM_RiskDecay` (double 0..1) - Correlation sizing floors - `PM_CorrMinMult` (double) — minimum fraction of base lots allowed after correlation dampening - `PM_CorrMinLots` (double) — absolute minimum lots floor after dampening ### Behavior - New entries: after policy scaling (`ApplyPolicyScaling`), LiveEA applies correlation‑adjusted sizing via `CPositionManager.CalculateCorrelationAdjustedVolume(symbol, base_lots)`. - Floors: `PM_CorrMinMult * base_lots` and `PM_CorrMinLots` are enforced to avoid over‑dampening. - Scale‑ins: when PositionManager proposes `vol_scaled`, LiveEA applies the same correlation dampening and floors before overriding `order.lots`. - Dynamic risk caps: configured in `OnInit()` via `CPositionManager.SetDynamicRisk(...)`. Internally caps additional size growth (implementation advisory, subject to future expansion). ### Telemetry & Logs - Events: `pm_corr_sizing`, `pm_corr_floor`, `pm_corr_scale_in`, `pm_corr_floor_scale_in` with correlation value and before/after lots. - Init log: `[PM] Initialized (...)` includes adaptive, profile, volatility exit, and dynamic risk params. ### Validation 1) Enable `UsePositionManager=true`, `PM_EnableCorrelationSizing=true`. 2) Open a correlated position (e.g., EURUSD) and then trade a related pair (e.g., GBPUSD). Expect reduced lots and `pm_corr_sizing` event. 3) Trigger a scale‑in via PositionManager; expect `pm_corr_scale_in` and floor events if dampening is severe. 4) Toggle `PM_CorrMinMult` / `PM_CorrMinLots` to observe floors applying (logs show before/after + floor values). ## License Copyright 2025, Windsurf Engineering. If you truly need low-latency sync later, consider: - Named pipes or local TCP with a lightweight Python service - A minimal REST loopback server Note: These add failure modes and deployment friction; file-based I/O is simpler and reliable for MT5. Prefer file-based until a concrete latency SLO requires otherwise. ## Appendix A: Red‑Team Artifacts (Q&A, Rebuttals, Jailbreak Traces) To operationalize the 3×3 red‑team process, store artifacts in MT5 Common Files for both Tester and Live to access. - Base path: `Common\\Files\\DualEA\\jailbreak\\` - Run layout: - `jailbreak\\runs\\YYYYMMDD_HHMMSS/` - `qna.md` — Q&A log for the session - `rebuttals.jsonl` — Expert rebuttals (JSONL) - `traces.jsonl` — Jailbreak traces (JSONL) - `summary.md` — Short session summary with outcomes and follow‑ups - `jailbreak\\latest/` — optional symlink/copy of most recent run for dashboards ### A.1 Q&A Log (Markdown) Minimal, structured template capturing prompts, answers, and references to code. ```markdown # Red‑Team Q&A — ## Q1: - Context: - Hypothesis: - Answer: - Evidence: - Outcome: pass | fail | needs‑followup ## Q2: ... ``` ### A.2 Expert Rebuttals (JSONL) One JSON per line with explicit links to files/modules and decisions. ```json {"id":"rb_0001","claim":"Exploration bypass triggers with existing slice","rebuttal":"Bypass is no‑slice‑only; existing under‑threshold slices are gated","evidence_files":["Experts/Advisors/DualEA/PaperEA/PaperEA.mq5"],"decision_paths":["Gate->Insights->ExploreCaps"],"status":"resolved","timestamp":"2025-08-17T00:00:00Z"} ``` Fields: - `id`: stable id - `claim`: red‑team claim - `rebuttal`: concise counterargument - `evidence_files`: array of repository paths - `decision_paths`: e.g., `Scan->Selector->Gate->Execute` - `status`: open | resolved | needs‑work - `timestamp`: ISO8601 ### A.3 Jailbreak Traces (JSONL) Record adversarial tests, input mutations, expected vs observed behavior, and severity. ```json {"ts":"2025-08-17T00:00:00Z","module":"PolicyLoader","file":"Experts/Advisors/DualEA/Include/StrategySelector.mqh","symbol":"EURUSD","timeframe":60,"case":"corrupt_policy_json","mutation":"truncated file","expected":"fallback to last‑known‑good policy with log and no crash","observed":"fallback engaged; neutral scaling applied","outcome":"safe","severity":"low","artifacts":["Common/Files/DualEA/policy.json","Common/Files/DualEA/policy.backup.json"],"notes":"Validated timer reload path and guardrails"} ``` Fields: - `ts`: timestamp - `module`, `file`: component and path under repo - `symbol`, `timeframe`: slice context when applicable - `case`, `mutation`: short names for cataloging - `expected`, `observed`: behaviors - `outcome`: safe | unsafe | inconclusive - `severity`: low | medium | high - `artifacts`: related files (Common Files paths allowed) - `notes`: free‑form ### A.4 Traceability Rules - Always reference concrete files/paths (e.g., `Experts/Advisors/DualEA/LiveEA/LiveEA.mq5`). - Map each finding to a decision path: `OnTick()->ScanStrategies()->Gating()->TradeManager.Execute()`. - Prefer JSONL for machine‑readable aggregation; keep Markdown summaries for humans. - Attach log snippets (Journal) and KB rows when relevant. ### A.5 CI Hooks - Copy the latest run into `jailbreak\\latest/` after each session. - Optional validator can assert that for each `case` seen in traces there is at least one `outcome=safe` or an open issue. - Include red‑team artifacts in reports alongside insights validation. ### A.6 Operational Notes - PaperEA and LiveEA do not read from `jailbreak/`; it is a write‑only audit area. - Keep PII/broker identifiers out of logs; sanitize before sharing. - Large artifacts (CSV/JSON) should be rotated/compressed if size grows beyond operational limits.