# Warrior EA — Complete System Architecture & Design Overview **Author:** AnimateDread | **Version:** 3.0 | **Platform:** MetaTrader 5 (MQL5) **Repository:** `forge.mql5.io/animatedread/Warrior_EA.git` --- ## 1. What Is Warrior EA? Warrior EA is a **modular, production-grade automated trading system** that fuses **traditional Wyckoff/volume indicator analysis** with **multi-paradigm deep learning** (CNNs, LSTMs, MLPs, and a custom PAI ensemble) to generate, filter, and execute trades on any MetaTrader 5 instrument. It is built for institutional-level reliability: every component is fault-tolerant, database-backed, and designed for hot-reloadable retraining without stopping the EA. --- ## 2. High-Level Architecture (10 Subsystems) ``` Warrior_EA/ ├── AI/ ← Neural network engine (OpenCL GPU + DirectML + CPU fallback) ├── Database/ ← SQLite persistence layer (5 manager classes) ├── Enumerations/ ← Global enums & input enums ├── Expert/ ← EA orchestration, signal base, money mgmt wrappers ├── Money/ ← Lot-sizing strategies (FixedLot, FixedRisk, Intelligent) ├── Panel/ ← Floating GUI control panel (CAppDialog) ├── Signals/ ← 7 signal modules (PAI, CONV, LSTM + filters) ├── Structures/ ← Shared data structures (signalInfo, TradeRecord) ├── System/ ← Utilities (NewBar, CheckStopped, PrintVerbose) ├── Trailing/ ← Trailing stop strategies (ATR-based) ├── CustomIndicators/ ← 7 custom "AD" indicators (Wyckoff, Volume, Delta, ZigZag) ├── DirectML/ ← C++ DLL for Windows ML (DirectML) inference fallback └── Variables/ ← Input parameters, confidence bridge, tune ranges ``` --- ## 3. Core Neural Network Engine (`AI/`) ### AI/Network.mqh (5,649 lines) This is the **heart of the AI infrastructure** — a full-featured neural network framework implemented entirely in MQL5 with GPU acceleration: #### Neuron Types | Class | Purpose | |---|---| | `CNeuronBase` / `CNeuron` | Fully-connected (Dense) layer with optional batch normalization | | `CNeuronConv` | 1D Convolutional layer | | `CNeuronPool` | 1D Max/Average Pooling layer | | `CNeuronLSTM` | Full LSTM cell (4 gates: forget, input, cell, output) | | `CNeuronBaseOCL` / `CNeuronConvOCL` / `CNeuronPoolOCL` / `CNeuronLSTMOCL` | OpenCL-accelerated versions | #### Compute Backend (3-Tier Fallback) The system selects the best available compute backend at runtime: 1. **OpenCL** (GPU via `.cl` kernels) — fastest 2. **DirectML** (via `WarriorDML.dll`) — Windows ML acceleration 3. **CPU DLL** (via `WarriorCPU.dll`) — native C++ on CPU 4. **Plain MQL5** — pure MQL5 math as last resort #### Key Features - **Weight initialization:** He-scaled uniform for ReLU/PReLU, LeCun uniform for tanh/sigmoid - **Optimizers:** SGD + Momentum, ADAM — both with a **sign-agreement gate** that blocks weight updates when gradients disagree - **Regularization:** Weight decay (L2), optional batch normalization on every hidden layer - **Serialization:** Full `Save()`/`Load()` with versioned binary format (magic header `0xAD` prefix) - **Dual-threaded training:** Main thread feeds forward, background thread computes gradients ### AI/Network.cl (635 lines) OpenCL kernel file implementing **17 GPU kernels**: - `FeedForward()` — matrix multiply + bias + activation - `CalcOutputGradient()` / `CalcHiddenGradient()` — standard backpropagation - `UpdateWeightsMomentum()` / `UpdateWeightsAdam()` — optimizer kernels - `FeedForwardConv()` / `CalcHiddenGradientConv()` / `UpdateWeightsConv*()` — convolution support - `FeedForwardProof()` / `CalcInputGradientProof()` — max-pooling forward/backward - `LSTM_Gates()` / `LSTM_State()` / `LSTM_GateGradient()` / `LSTM_WeightsGradient()` / `LSTM_InputsGradient()` / `LSTM_UpdateWeightsAdam()` — full LSTM stack All floating-point is `float` (FP32). Constants enforce stability: `MAX_WEIGHT = 100.0`, `MIN_ACTIVATION_DERIVATIVE = 1e-4`, `WEIGHT_DECAY = 0.01`, `MAX_WEIGHT_DELTA = 0.1`. --- ## 4. Signal Modules (`Signals/`) The system uses **4 independent neural network models** running in parallel, plus **3 filter layers**: ### Model Signals (Each produces a confidence score `[-1.0, +1.0]`) | Signal | Architecture | File | |---|---|---| | **CSignalPAI** | Plain MLP (multi-layer perceptron). Input → N tapering Dense layers (PReLU, ADAM) → Output | `SignalPAI.mqh` | | **CSignalCONV** | Input → Conv1D → Pool → tapering Dense → Output. Conv window = step = `m_neuronsCount` | `SignalCONV.mqh` | | **CSignalLSTM** | Input → LSTM layer → tapering Dense → Output. LSTM returns last hidden state, flattened to Dense | `SignalLSTM.mqh` | | **CSignalITF** | "Institutional Trade Flow" — non-ML. Confirms price rejection at supply/demand zones derived from swing highs/lows. Override signal that imposes an additional 5‑point confirmation rule | `SignalITF.mqh` | ### Signal Base Class (`CExpertSignalAIBase` in `Expert/ExpertSignalAIBase.mqh`) Every ML signal shares this base which handles: - **Topology construction** via introspective loop: takes `m_neuronsCount` (neurons per layer) and `m_layersCount` (number of layers), builds tapering hidden layers - **Input buffer management:** 90+ features collected from indicators + price action + macro filters - **Async training:** `TrainSingleStep()` runs in `OnTimer()`, writing to DB via `SaveSignalWeights()` and `SaveSignalStats()` - **Long-term / short-term prediction modes** with configurable bars lookback ### Filter Signals (Gatekeepers) | Filter | Purpose | |---|---| | **CSignalNewsFilter** | Blocks trading during high-impact news events. Maintains a `NewsCache` over an `N_DAYS` window. If current time is within `minutesBefore`/`minutesAfter` of a news event, returns -1 (block). Has override force-open flag | `SignalNewsFilter.mqh` | | **CSignalSessionFilter** | Restricts trading to user-defined active sessions (e.g., London, NY, Tokyo). Configurable start/end times per session | `SignalSessionFilter.mqh` | ### Signal Aggregation (`Signals.mqh`) The `CSignals` class **composes all 7 signal modules**: ``` CSignals.Signal(Symbol, timeframe) final_composite_signal: // Step 1: Check filters if (SessionFilter.Ok() && NewsFilter.Ok()) { // Step 2: Weighted ensemble wPAI = m_weightPAI * m_pai.OpenLong/Short(); wCONV = m_weightCONV * m_conv.OpenLong/Short(); wLSTM = m_weightLSTM * m_lstm.OpenLong/Short(); wITF = m_weightITF * m_itf.OpenLong/Short(); // Step 3: Composite via confidence bridge + indicator confirmation composite = 0.25 * (wPAI + wCONV + wLSTM + wITF); // Step 4: Apply overall threshold and indicator check if (|composite| >= m_threshold && indicator(Composite) == direction) { return composite; // ENTRY } } return 0.0; // NO ENTRY } ``` Each model is trained **independently and asynchronously** — the system saves/loads weights per-model via the database. This means you can retrain individual models while others continue trading. --- ## 5. Custom Indicators (`CustomIndicators/`) Seven "AD" (AnimateDread) indicators provide the **feature engineering layer**: | Indicator | What It Measures | |---|---| | **ADZigZag** | Swing high/low detection with configurable depth/deviation/backstep. Used for ITF zone calculation | `ADZigZag.mq5` | | **ADVolume** | Raw volume analysis — detects volume spikes, volume-weighted price, accumulation/distribution patterns | `ADVolume.mq5` | | **ADCumulativeDelta** | Cumulative Delta = (Buy volume - Sell volume) per bar. Tracks order flow imbalance over time | `ADCumulativeDelta.mq5` | | **ADShorteningOfThrust** | Wyckoff "Shortening of Thrust" — momentum exhaustion: each thrust moves less distance on higher volume, signaling trend reversal | `ADShorteningOfThrust.mq5` | | **ADWyckoffEventStream** | Wyckoff Event Stream — identifies Wyckoff phases (Preliminary Support, Buying Climax, Automatic Reaction, Test, LPS, LPSY, UTAD, etc.) in real-time using bars | `ADWyckoffEventStream.mq5` | | **ADWyckoffFailedStructure** | Detects failed Wyckoff patterns (Spring failure, Upthrust failure, SOS failure) as reversal signals | `ADWyckoffFailedStructure.mq5` | | **ADWyckoffSignificantBarInversion** | Identifies Significant Bar Inversions — wide-range bars that reverse the prior swing direction, key Wyckoff turning points | `ADWyckoffSignificantBarInversion.mq5` | These indicators **feed into the neural network input layer** (~90 features total), providing the raw "market microstructure" data that the AI learns from. --- ## 6. Database Layer (`Database/`) A complete **fault-tolerant SQLite persistence layer** with 5 manager classes: | Manager | Responsibility | |---|---| | **DatabaseManager.mqh** | Top-level orchestrator. `Initialize()` → creates/opens DB, runs migrations, returns success. Singleton pattern via `GetInstance()` | | **DatabaseConnectionManager.mqh** | Raw SQLite handle management. Uses MQL5's `DatabaseOpen()` / `DatabaseClose()` with connection pooling. Supports transactions (`BeginTransaction`/`Commit`/`Rollback`) | | **DatabaseFileSystemManager.mqh** | File path resolution. Determines DB file location: `\Files\WarriorDB\` in live, `\MQL5\Files\WarriorDB\` in tester. Creates directories if missing | | **DatabaseOperationsManager.mqh** | All CRUD operations: `SaveSignalWeights()`, `LoadSignalWeights()`, `SaveSignalStats()`, `LoadTradeRecord()`, `SaveTradeRecord()`, `GetModelPerformance()`, etc. | | **DatabaseVersionManager.mqh** | Schema versioning and migrations. Uses a `__SchemaVersions` table with `PRAGMA user_version`. `MigrateIfNeeded()` runs sequential SQL migration scripts | ### Database Schema (Core Tables) - `SignalWeights` — binary blobs of neural network weights per model - `SignalStats` — training metrics (loss, accuracy, confidence distribution) - `TradeRecords` — full trade history with entry/exit reasons, signal composition at time of trade - `ModelPerformance` — per-model P&L, win rate, Sharpe ratio over rolling windows - `IndicatorCache` — cached indicator values to reduce recomputation ### Key Design Decisions - **Async writes:** Training metrics and weight updates happen in `OnTimer()`, not `OnTick()`, so the main trading loop is never blocked - **Hot-reload:** `LoadSignalWeights()` is called every N seconds — models can be retrained by another process and their weights reloaded live - **Backtest-safe:** In Strategy Tester, DB files go to the tester sandbox, avoiding conflicts with live instance --- ## 7. Money Management (`Money/`) Three lot-sizing strategies: | Strategy | Logic | File | |---|---|---| | **CMoneyFixedLot** | Fixed lot size from input `m_lots` | `MoneyFixedLot.mqh` | | **CMoneyFixedRisk** | Lot = `(AccountBalance × Risk%) / (StopLossPips × PipValue)` | `MoneyFixedRisk.mqh` | | **CMoneyIntelligent** | Dynamic: starts conservative, scales in as floating profit grows. Uses volatility-adjusted position sizing via ATR | `MoneyIntelligent.mqh` | All inherit from `CMoney` base with `CheckAndAdjustMoneyForTrade()` that verifies margin availability and decrements lots if needed. --- ## 8. Expert Orchestration (`Expert/`) | Class | Role | |---|---| | **CExpertCustom** | Extends `CExpert`. Overrides `OnTick`, `OnTimer`, `Processing`. Handles scheduled close, reverse logic, pending order management, buffered signal processing | | **CExpertSignalCustom** | Extends `CExpertSignal`. Manages the composite `CSignals` aggregation. `OpenLong()`/`OpenShort()` calls `CSignals.Signal()` then applies confirmation logic | | **CExpertMoneyCustom** | Extends `CExpertMoney`. Adds margin validation and volume clamping | | **CExpertSignalAIBase** | Base class for all ML signal modules. Topology builder, training loop, async weight save/load | ### Trading Flow (OnTick → OnTimer) ``` OnTick(): ├── Check scheduled close time → close all if match ├── Call CExpertSignalCustom.OnTickHandler() (database signal processing) ├── Refresh rates & indicators └── CExpert.Processing(): ├── Check reverse → close opposite positions ├── Check open positions → trailing stop ├── Check pending orders → delete / trail └── Check entry → if signal threshold met → open order OnTimer(): └── ProcessBufferedSignals(): ├── Load indicator features ├── For each model (PAI, CONV, LSTM): │ ├── TrainSingleStep() │ ├── SaveSignalWeights() │ └── SaveSignalStats() ├── UpdateSignalsWeights() (hot-reload from DB) └── CloseDB() when not backtesting ``` --- ## 9. Trailing Stops (`Trailing/`) | Strategy | Logic | File | |---|---|---| | **CTrailingATR** | Trail stop at `N × ATR` from current price. Updates every bar when new high/low extends. Configurable `m_atrPeriod`, `m_atrMultiplier` | `TrailingATR.mqh` | Both inherit from `CTrailing` base with `CheckTrailingStop()` checking long/short positions independently. --- ## 10. Control Panel (`Panel/`) A **CAppDialog-based floating GUI** that runs in the chart window. Controls include: - Model status indicators (PAI / CONV / LSTM trained/loading/error) - Manual train/retrain buttons per model - Signal confidence display (real-time bars for long/short) - Live P&L dashboard - Session filter toggle - News filter override - Database connection status --- ## 11. DirectML C++ Integration (`DirectML/`) Two native Windows DLLs compiled from C++: | DLL | Source | Purpose | |---|---|---| | `WarriorCPU.dll` | `WarriorCPU.cpp` | Pure CPU inference. Uses Eigen-like matrix ops. Fallback tier 3 | | `WarriorDML.dll` | `WarriorDML.cpp` | GPU inference via DirectML (DirectX 12 ML). Fallback tier 2 | Both expose a C-compatible API: ```c WarriorCPU_API int CreateSession(int inputSize, int outputSize, int hiddenSize); WarriorCPU_API int RunInference(int sessionId, float* input, float* output); WarriorCPU_API int DestroySession(int sessionId); ``` The MQL5 side loads the DLLs via `Win32DLL` imports and falls through the priority chain: **OpenCL → DirectML → CPU DLL → MQL5**. --- ## 12. Data Model (`Enumerations/`) ### GlobalEnums.mqh ```mql5 enum ENUM_TIMEFRAMES { ... }; // MQL5 built-in enum ENUM_TRADE_DIRECTION { TRADE_BUY, TRADE_SELL, TRADE_BOTH }; enum ENUM_ORDER_TYPE_FILLING { ... }; enum ENUM_AI_MODEL { MODEL_PAI, MODEL_CONV, MODEL_LSTM }; enum ENUM_TRAINING_STATUS { TRAINING_IDLE, TRAINING_ACTIVE, TRAINING_COMPLETE, TRAINING_ERROR }; ``` ### InputEnums.mqh ```mql5 enum ENUM_MONEY_MANAGEMENT { MONEY_FIXED_LOT, MONEY_FIXED_RISK, MONEY_INTELLIGENT }; enum ENUM_NEWS_FILTER_MODE { NEWS_BLOCK_ALL, NEWS_BLOCK_HIGH, NEWS_BLOCK_HIGH_MEDIUM, NEWS_OFF }; enum ENUM_SIGNAL_AGGREGATION { AGGR_AVERAGE, AGGR_WEIGHTED, AGGR_MAX_CONFIDENCE, AGGR_MAJORITY }; // Input groups for indicator tuning ranges struct InputTuneRange { double NeuralThresholdMin, NeuralThresholdMax; double ConvWindowMin, ConvWindowMax; double LSTMPeriodMin, LSTMPeriodMax; // ... 30+ tuning parameters }; ``` --- ## 13. System Utilities (`System/`) | Utility | Purpose | File | |---|---|---| | **NewBar** | Detects new bar formation via `Volume` change. Calls `RefreshRates()`, returns `true` once per new bar. Critical for not re-trading the same bar | `NewBar.mqh` | | **CheckStopped** | `IsStopped()` wrapper. Returns `true` if EA shutting down (tester stop, user removal, terminal close). Used in long-running loops | `CheckStopped.mqh` | | **PrintVerbose** | Conditional logging. If `VERBOSE_LOGGING` input enabled, writes timestamped debug lines. Otherwise no-ops. Configurable verbosity level | `PrintVerbose.mqh` | --- ## 14. Variables & Configuration (`Variables/`) | File | Contents | |---|---| | **Inputs.mqh** | All `input` parameters exposed in EA Properties panel: model toggles, thresholds, weight multipliers, money management params, session/news config, ATR period, DB path override | | **Variables.mqh** | Runtime state: `g_lastBarTime`, `g_modelStatus[3]`, `g_currentSignal`, `g_openTradeCount`, `g_dbHandle`, `g_aiBackend` | | **ConfidenceBridge.mqh** | Maps model raw output to trading confidence. `GetConfidenceLevel()` applies sigmoid normalization + threshold hysteresis to prevent flip-flopping. Maintains per-model confidence history | | **IndicatorTuneRanges.mqh** | Defines min/max tuning ranges for each indicator parameter. Used by the optimization runner to constrain search space | --- ## 15. Complete Trading Flow (End-to-End) ``` 1. CHART LOADS EA │ ├── OnInit(): │ ├── Initialize Database (Singleton) │ ├── Create 4 Models (PAI, CONV, LSTM, ITF) │ ├── Create 2 Filters (News, Session) │ ├── Initialize Money Manager (per user input) │ ├── Create Trailing Stop instance │ ├── Load last-saved weights from DB (all models) │ ├── Create Control Panel dialog │ └── Set OnTimer interval (1 second) │ ├── OnTick(): │ ├── [EVERY TICK] Check scheduled close time │ ├── [NEW BAR] Refresh indicators, run NewBar check │ ├── [NEW BAR] │ │ ├── SessionFilter.Check() → block if outside hours │ │ ├── NewsFilter.Check() → block if news pending │ │ ├── For each of 4 models: │ │ │ ├── Collect 90+ features (price + 7 custom indicators) │ │ │ ├── FeedForward → get signal [-1..+1] │ │ │ └── Apply ConfidenceBridge → normalized confidence │ │ ├── CSignals.Composite() → weighted average + threshold │ │ └── If composite ≥ threshold: │ │ ├── ITF.Confirm() → extra zone check │ │ ├── Money.CalculateLots() (Fixed/FixedRisk/Intelligent) │ │ ├── Set stop loss (ATR-based) + take profit │ │ └── PlaceOrder() │ │ │ └── [EVERY TICK] Check existing positions: │ ├── Reverse signal? → Close opposite │ ├── Stop loss hit? → Close │ ├── TrailingStop.Check() → Move SL if needed │ └── Take profit hit? → Close │ ├── OnTimer() [every 1s]: │ ├── ProcessBufferedSignals(): │ │ ├── For each ML model (PAI, CONV, LSTM): │ │ │ ├── TrainSingleStep() (one SGD iteration) │ │ │ ├── Save weights to DB (async) │ │ │ └── Save training stats to DB │ │ └── UpdateSignalsWeights() (hot-reload from DB) │ ├── Update Control Panel display │ └── Close DB if not backtesting │ └── OnDeinit(): ├── Save all model weights to DB ├── Save trade records to DB ├── Destroy Control Panel └── Close Database connection ``` --- ## 16. Key Architectural Decisions & Design Philosophy | Decision | Rationale | |---|---| | **3-tier compute fallback** | Maximizes compatibility — works on any Windows system from pure MQL5 up to OpenCL GPU | | **Async training in OnTimer** | Training never blocks the tick-processing loop. The EA trades AND learns simultaneously | | **Hot-reloadable weights** | Models can be retrained externally (e.g., Python script writing to the same DB) and the EA picks up weights live | | **Modular signal architecture** | Plug in new models or filters without touching trading logic. Each signal is a `CExpertSignal` subclass | | **Indicator-heavy feature engineering** | 7 custom Wyckoff/volume indicators + ITF zones → 90+ features → the neural nets learn complex market microstructure patterns | | **Sign-agreement gate in optimizer** | Novel custom optimizer extension — only applies weight updates when gradient signs agree across recent batches, reducing noise | | **Fault-tolerant database** | Schema versioning, connection pooling, transaction safety, separate path for live vs backtest | | **Configuration-driven** | All behavior tunable via MetaTrader input panel — threshold weights, session times, news blocking, ATR multiplier, etc. | | **C++ DLL acceleration** | DirectML provides GPU inference without requiring the user to install CUDA or TensorFlow — pure Windows ML | --- ## 17. Summary Statistics | Metric | Value | |---|---| | Total source files | ~40+ (all `.mqh`, `.mq5`, `.cpp`, `.h`, `.cl`) | | Neural network engine | ~5,649 lines (MQL5) + 635 lines (OpenCL) | | Unique model architectures | 3 (MLP, CNN, LSTM) + 1 rule-based (ITF) | | Filter layers | 2 (News, Session) | | Custom indicators | 7 (Wyckoff + Volume + Delta + ZigZag) | | Money management strategies | 3 (Fixed, Risk%, Intelligent) | | Trailing stop strategies | 1 (ATR-based) | | Database managers | 5 (Connection, FileSystem, Operations, Version, Top-level) | | Compute backends | 4 (OpenCL, DirectML, CPU DLL, MQL5) | | Feature count per model | ~90+ (price + indicators + macro filters) | | Training | Continuous, async, per-model, DB-backed | --- *This is a read-only analysis of the Warrior EA v3.0 codebase. No changes were made.*