| Filename | Latest commit message | Latest commit date |
|---|---|---|
1. THE POOL FIX WAS LANDING ON A TOPOLOGY THAT COULD NOT SEE IT. ComputeFirstLayerWidth budgets against EstimatedInSampleBars, which counts this chart's own bars PLUS the training pool. On a COLD fleet start every chart derives and pins its topology BEFORE any chart has published a pool file - measured on the 18:13 start, model creation at 18:13:21 against a first publish at 18:13:48. All six sized as if training alone, wrote that into .cfg, and adopted it back on every later start even with the pool full. SP500 ran a first layer floored to 16 while adopting 30229 peer rows. Adopt-don't-compare exists to protect weights shaped by those sizes. It was also running for a model with NO .nnw, where there is nothing to protect and the .cfg is just a record of one unlucky moment. The four derived sizes are now re-measured when no weights exist. Safe on all three counts that matter: free (nothing to discard), cannot loop (once weights exist the .cfg is authoritative again), and cannot fragment the pool - the derived width is NOT in BuildModelFingerprint, which keys only on the FEATURE layout. Verified: field 2 of the fingerprint is LEGACY_HISTORY_BARS_SLOT, not the first-layer width. TO TAKE EFFECT the weights must be wiped while the TrainPool is KEPT - the census has to be non-empty at derivation time. A full wipe empties the pool and reproduces the original condition exactly. 2. THE KEEP-SCREEN LATCHED ON AN UNDERPOWERED SAMPLE. MI_MIN_SAMPLES is a floor for "can this be computed", and it was being used as the bar for "is this answer final". The screen fired on the first era clearing 200 rows and latched, measuring at 202-773 samples where a warm chart gives ~2065. Columns kept then tracked SAMPLE SIZE rather than information - EURUSD kept 0 of 49 at n=202, SP500 kept 15 at n=773, and the ordering across all six charts was very nearly monotone in n. A thin sample is still measured and printed, but it no longer closes the question: below MI_GOOD_SAMPLE_FRACTION of the target the result is labelled underpowered and a later era supersedes it, bounded by the same attempt budget. An underpowered screen that latches is worse than one that waits, because it looks like a result. Build tag -> fleet-pool-v2. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
| .. | ||
| AIBase | ||
| Chart | ||
| ConfigLock | ||
| Features | ||
| Labeling | ||
| OnlineLearning | ||
| Persistence | ||
| Topology | ||
| Training | ||
| ADIndicatorTuner.mqh | ||
| ExpertCustom.mqh | ||
| ExpertMoneyCustom.mqh | ||
| ExpertSignalAIBase.mqh | ||
| ExpertSignalCustom.mqh | ||
| README.md | ||
Expert/ Directory Documentation
Market-submission compliance (article 2555)
Every runtime check from
The Checks a Trading Robot Must Pass Before Publication in the Market
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.