# Expert/ Directory Documentation ## Market-submission compliance (article 2555) Every runtime check from [The Checks a Trading Robot Must Pass Before Publication in the Market](https://www.mql5.com/en/articles/2555) is implemented in `System/TradeChecks.mqh` (free functions, `TC*` prefix) and applied by the classes in this folder. Where each rule lives: | # | Rule | Implemented in | |---|------|----------------| | 1 | Catch/fix errors via the tester | Development practice; every rejection below logs a throttled reason | | 2 | Insufficient funds | `TCCheckMoneyForTrade` / `TCFitVolumeToFreeMargin`, applied by `CExpertMoneyCustom::ValidateLotForTrade` | | 3 | Invalid volumes | `TCCheckVolumeValue` / `TCNormalizeVolume`, same call site | | 4 | Pending-order count limit | `TCIsNewOrderAllowed`, checked in `CExpertSignalCustom::OpenParams` and again in `CExpertCustom::OpenLong/OpenShort` | | 5 | Per-symbol lot limit | `TCSymbolVolumeAllowed` / `TCApplySymbolVolumeLimit` | | 6 | `SYMBOL_TRADE_STOPS_LEVEL` | `TCCheckStops` / `TCAdjustStops` / `TCCheckPendingPrice`, applied when the setup is shaped and again immediately before the order is sent | | 7 | `SYMBOL_TRADE_FREEZE_LEVEL` | `TCFreezeOkForPosition` / `TCFreezeOkForOrder`, gating close, reverse, trailing, order modify and order delete in `CExpertCustom` | | 8 | Insufficient quote history | `TCHasEnoughHistory`, in `CExpertCustom::Refresh` and `CExpertSignalCustom::OpenParams` | | 9 | Array out of range | `TCIndexOk`, plus the existing index guards (`iLowest`/`iHighest` return values, `Direction()`'s bounded loops) | | 10 | Zero divide | `TCSafeDivide`, plus explicit zero-denominator guards on every volume-step / loss division | | 11 | Modification with no changes | `TCPositionModifyIsMeaningful` / `TCOrderModifyIsMeaningful`, in the `TrailingStop*` / `TrailingOrder*` overrides | | 12 | No DLL imports | Build-time: `WARRIOR_MARKET_BUILD` compiles out the `#import` blocks in `AI/NeuronDirectML.mqh` | | 13 | No external `iCustom` | Build-time: `#resource` block in `Warrior_EA.mq5` + `WARRIOR_CI()` in `Variables/IndicatorResources.mqh` | | 14 | Invalid function parameters | `TCSymbolIsTradeable`, plus the existing `ValidationSettings()` range checks | | 15 | Access violation | No runtime check exists by definition; the NULL-pointer and index guards above are what prevent it | | 16 | CPU / memory consumption | `TCWarnIfSlow` on each `OnTick` pass (`EXPERT_TICK_BUDGET_US`) and `TCWarnIfMemoryAbove` on each timer pass (`EXPERT_MEMORY_SOFT_LIMIT_MB`) | All rejections report through `TCLog()`, which throttles per condition so a state that persists for many ticks writes one journal line per minute instead of thousands. ## Class hierarchy ``` CExpert -> CExpertCustom (event dispatch, order lifecycle, article-2555 gates) CExpertMoney -> CExpertMoneyCustom (volume correction, margin fitting) CExpertSignal -> CExpertSignalCustom -> CExpertSignalAIBase -> CSignalPAI/CONV/LSTM/HYBRID ``` ## ExpertCustom.mqh Base expert. Virtual handlers for `OnTick` / `OnTimer` / `OnChartEvent`, trading-object setup, series refresh, and the freeze/stops-level gates applied immediately before every send, modify and delete. ## ExpertMoneyCustom.mqh - `CheckAndCorrectVolumeValue` — clamps volume to the broker's min/max/step and describes each correction. - `CheckAndAdjustMoneyForTrade` — reduces lots to fit free margin rather than failing the order outright. - `ValidateLotForTrade` — the single gate for rules 2/3/5/14, with throttled logging. ## ExpertSignalCustom.mqh Shared non-AI signal machinery: database-backed signal tracking, pattern weighting, `OpenParams()` (which shapes SL/TP and applies the min-R:R rejection), and the filter collection. `SL_Mode`/`TP_Mode` live here — note they define the AI **training target** as well as the order, since the triple-barrier label is built from them. There is **no duplicate-trade detection.** Three methods that implied otherwise were declared but never defined or called, and were removed in 2026-07. Do not assume the guard exists. ## ExpertSignalAIBase.mqh The AI signal base class. The **declaration** lives here; the method bodies are split by responsibility into `Expert/AIBase/` and included at the bottom of the file, after the declaration. Include them nowhere else. | `Expert/AIBase/` | holds | |---|---| | `Training.mqh` | era loop, plateau ladder, checkpoint selection, auto-deploy | | `Topology.mqh` | network bootstrap, derived shape, conv/LSTM/batch-norm stages | | `Features.mqh` | indicator creation, per-bar input feature vector | | `ChartUI.mqh` | arrows, arrow persistence, status panel, cleanup | | `Lifecycle.mqh` | ctor/dtor, the vote API, tick + chart-event dispatch, config lock | | `Persistence.mqh` | `.stats` / `.cfg` sidecars, CPU-inference validation | | `OnlineLearning.mqh` | live continual learning, EMA shadow, OOS simulator | | `Labels.mqh` | triple-barrier labels, async label-cache prebuild | | `AutoTune.mqh` | indicator auto-tuner | | `Inference.mqh` | softmax, prior calibration, class priors | The topology is **derived**, not configured — width, taper, depth, conv filters and LSTM hidden size all come from the data shape. See `Topology.mqh` and `Variables/Inputs.mqh` for which inputs were removed and why.