Warrior_EA/Enumerations/InputEnums.mqh
AnimateDread 444909d0a3 feat: S2 meta-labeling head - binary trade-quality model over the classic-candidate corpus
The NN now has a target that is not per-bar direction (closed, best-of-999
p=1.0000): P(win | this journaled candidate, at the EA's own SL/TP, net of
cost). One net for all 52 pattern-sides, AIType=AI_META.

- NetForward.mqh: the host-side softmax+CE gradient generalized total==3 ->
  2||3 on both backprop paths; a 2-class softmax IS a logistic head, and no
  compute backend changes.
- SignalMETA.mqh (new): corpus loaded read-only from the LARGEST signal DB on
  disk (decoupled from the config fingerprint that burned four S1 runs); the
  GMT->server offset is measured PER ROW against entryPrice vs bar open
  (DST-immune, histogram logged); a window-span regime filter drops the
  pre-2017 daily-backfill rows; 31-feature setup descriptor appended at the
  input (26 one-hot + side + tanh netVote + SL/TP ATR + spread/ATR).
- Training.mqh: candidate-queued pass 1, binary-target pass 2, per-candidate
  calibration (2.5) and OOS (3) walks. Counter mapping win->Buy / loss->Sell
  lets checkpoint selection, the edge floor, the plateau ladder and the
  family-wise deploy gate run UNCHANGED: precision reads as win rate among
  traded candidates, chance as the base win rate, recalls as sensitivity/
  specificity. Era-end META line: coverage x (p - break-even) vs the null.
- Labels are the side-conditional triple-barrier win caches - never the DB's
  stop-and-reverse outcome. Logit adjustment deliberately skipped (~40% base
  rate). Live inference + online learning guarded off until S3.
- Fingerprint: conditional |TGT:META1; State\META\ folder + 2-output filename
  slot keep meta models fully separate from direction models.

Compiles clean (0 errors, 0 warnings). S2 run = attach a chart with
AIType=AI_META; S3 wires the votes via the per-side hooks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 06:52:31 -04:00

513 lines
23 KiB
MQL5

//+------------------------------------------------------------------+
//| CustomEnums.mqh |
//| AnimateDread |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "AnimateDread"
#property link "https://www.mql5.com"
//--- Weight-update optimizer. This is really an AI\Network.mqh library type; a guarded duplicate is
//--- kept here so Variables\Inputs.mqh (which uses it for the TrainingOptimizer input) can be included
//--- before the AI headers - putting the EA's own inputs at the top of the Inputs tab. Keep in sync
//--- with AI\Network.mqh's copy; the shared WARRIOR_ENUM_OPTIMIZATION_DEFINED guard prevents a
//--- duplicate definition whichever header is parsed first.
#ifndef WARRIOR_ENUM_OPTIMIZATION_DEFINED
#define WARRIOR_ENUM_OPTIMIZATION_DEFINED
//--- A third DFA entry was removed 2026-07-28 - see AI\Network.mqh's copy for the full rationale (it was
//--- a deterministic index-parity sign flip on the gradient, i.e. ascent on half of every weight tensor,
//--- not Direct Feedback Alignment). SGD/ADAM keep ordinals 0/1: they feed the weights-filename
//--- fingerprint and must never be renumbered.
enum ENUM_OPTIMIZATION
{
SGD, // SGD + Momentum (heavy-ball, simpler, needs more eras)
ADAM // Adam (adaptive step, faster convergence, can overfit)
};
#endif
//--- Logical, commonly-used Moving Average / RSI periods only - keeps the Classic Signals inputs (and
//--- the AutoTuneIndicators search space over them, see ADIndicatorTuner.mqh) from being set/perturbed
//--- to an arbitrary, non-standard period.
enum MA_PERIOD_PRESETS
{
MA_PERIOD_5 = 5, // 5
MA_PERIOD_8 = 8, // 8
MA_PERIOD_9 = 9, // 9
MA_PERIOD_10 = 10, // 10
MA_PERIOD_13 = 13, // 13
MA_PERIOD_20 = 20, // 20
MA_PERIOD_21 = 21, // 21
MA_PERIOD_50 = 50, // 50
MA_PERIOD_100 = 100, // 100
MA_PERIOD_200 = 200, // 200
};
//--- Unified moving-average TYPE, spanning the advanced/institutional MAs AND the standard methods, all
//--- served by the one CustomIndicators\ADMovingAverage.mq5. VALUES ARE THE INDICATOR'S OWN InpType codes
//--- and MUST stay in sync with it: 0..4 (ALMA/DEMA/ZLEMA/T3/Kalman) are the original codes, unchanged for
//--- cross-platform parity with the SQX build; 5..8 (SMA/EMA/SMMA/LWMA) were added on top. Drives both the
//--- classic MA vote (Signals\SignalMA.mqh) and the NN MA input feature, and is auto-tuner-searchable.
enum MA_TYPE_PRESETS
{
MA_TYPE_ALMA = 0, // ALMA (Arnaud Legoux)
MA_TYPE_DEMA = 1, // DEMA (double exponential)
MA_TYPE_ZLEMA = 2, // ZLEMA (zero-lag)
MA_TYPE_T3 = 3, // T3 (Tillson)
MA_TYPE_KALMAN = 4, // Kalman filter
MA_TYPE_SMA = 5, // SMA (simple)
MA_TYPE_EMA = 6, // EMA (exponential)
MA_TYPE_SMMA = 7, // SMMA (smoothed)
MA_TYPE_LWMA = 8, // LWMA (linear weighted)
};
enum RSI_PERIOD_PRESETS
{
RSI_PERIOD_2 = 2, // 2
RSI_PERIOD_5 = 5, // 5
RSI_PERIOD_7 = 7, // 7
RSI_PERIOD_9 = 9, // 9
RSI_PERIOD_14 = 14, // 14 (classic)
RSI_PERIOD_21 = 21, // 21
RSI_PERIOD_25 = 25, // 25
};
//--- MACD periods (Signals\SignalMACD.mqh classic vote + the MACD input feature). The preset SETS are
//--- deliberately chosen so that EVERY fast/slow combination satisfies CSignalMACD::ValidationSettings()'s
//--- "slow must exceed fast" rule - the fast list tops out at 15, the slow list starts at 17. A trader
//--- picking two legal-looking values from the dropdowns can therefore never produce a combination that
//--- fails init, and the auto-tuner (ADIndicatorTuner::PerturbRandom) can perturb either one in isolation
//--- without having to know the other's current value.
enum MACD_FAST_PRESETS
{
MACD_FAST_5 = 5, // 5
MACD_FAST_8 = 8, // 8
MACD_FAST_12 = 12, // 12 (classic)
MACD_FAST_15 = 15, // 15
};
enum MACD_SLOW_PRESETS
{
MACD_SLOW_17 = 17, // 17
MACD_SLOW_21 = 21, // 21
MACD_SLOW_26 = 26, // 26 (classic)
MACD_SLOW_34 = 34, // 34
MACD_SLOW_50 = 50, // 50
};
enum MACD_SIGNAL_PRESETS
{
MACD_SIGNAL_5 = 5, // 5
MACD_SIGNAL_7 = 7, // 7
MACD_SIGNAL_9 = 9, // 9 (classic)
MACD_SIGNAL_12 = 12, // 12
};
//--- Ichimoku periods (Signals\SignalIchimoku.mqh classic vote + the Ichimoku input feature). Same
//--- all-combinations-are-legal design as the MACD presets above, against
//--- CSignalIchimoku::ValidationSettings()'s "Tenkan < Kijun < Senkou B" rule: Tenkan tops out at 20,
//--- Kijun spans 22-40, Senkou B starts at 44. The classic 9/26/52 triple is in the middle of each.
enum ICHIMOKU_TENKAN_PRESETS
{
ICHI_TENKAN_7 = 7, // 7
ICHI_TENKAN_9 = 9, // 9 (classic)
ICHI_TENKAN_12 = 12, // 12
ICHI_TENKAN_20 = 20, // 20
};
enum ICHIMOKU_KIJUN_PRESETS
{
ICHI_KIJUN_22 = 22, // 22
ICHI_KIJUN_26 = 26, // 26 (classic)
ICHI_KIJUN_30 = 30, // 30
ICHI_KIJUN_40 = 40, // 40
};
enum ICHIMOKU_SENKOU_PRESETS
{
ICHI_SENKOU_44 = 44, // 44
ICHI_SENKOU_52 = 52, // 52 (classic)
ICHI_SENKOU_60 = 60, // 60
ICHI_SENKOU_120 = 120, // 120
};
//--- custom enumerations for certain settings, minimizes overfitting
enum IND_PERIODS_PRESETS
{
PERIOD_5 = 5, // 5 Periods
PERIOD_10 = 10, // 10 Periods
PERIOD_14 = 14, // 14 Periods (classic)
PERIOD_20 = 20, // 20 Periods
PERIOD_30 = 30, // 30 Periods
PERIOD_50 = 50, // 50 Periods
PERIOD_100 = 100, // 100 Periods
PERIOD_200 = 200, // 200 Periods
};
enum TRAINING_YEARS_PRESET
{
YEARS_1 = 1, // 1 year
YEARS_2 = 2, // 2 years
YEARS_5 = 5, // 5 years
YEARS_10 = 10, // 10 years
YEARS_20 = 20, // 20 years
};
//--- Stop-loss sizing mode. The ATR_* presets place the SL a fixed multiple of ATR FROM THE ENTRY
//--- PRICE. SL_INTELLIGENT uses the same entry anchor but tightens the distance as live AI/DB
//--- confidence rises (see CExpertSignalCustom::OpenParams()'s AI_SL_TIGHTEN_FACTOR) - a
//--- high-conviction setup gets a tighter stop, a marginal one keeps the full ATR cushion. Negative
//--- sentinel so it can never be mistaken for a literal ATR multiple.
//--- SWING-ANCHORED STOPS WERE REMOVED 2026-07-31. Both the ATR presets ("N ATR beyond the swing") and
//--- SL_PREV_SWING ("exactly at the swing") keyed the stop to the recent swing high/low, which makes
//--- the risk on a trade a function of how far away the last swing happens to sit rather than of
//--- current volatility: a shallow pullback produced a stop tight enough to be taken out by noise on a
//--- setup that then ran to target. Anchoring to the entry makes risk exactly N*ATR by construction,
//--- which is also what kept the old minimum-reward:risk rejection satisfiable without depending on
//--- swing geometry. That filter is gone (2026-08-09); the coupling is still the right shape.
//--- The "(classic)" marker on the shipped default follows the same convention as every period preset
//--- below. It matters more here than anywhere else in this file: since the 2026-08-01 triple-barrier
//--- relabel, SL_Mode and TP_Mode DEFINE THE TRAINING LABELS, so they are in the weights-filename
//--- fingerprint and changing either one re-keys the model and starts a fresh retrain. A user needs to
//--- be able to see which pair the shipped model was actually trained on.
enum STOP_LOSS_MODE
{
SL_INTELLIGENT = -1, // Intelligent (AI-confidence scaled)
SL_ATR_x1 = 1, // ATR * 1 from entry
SL_ATR_x2 = 2, // ATR * 2 from entry
SL_ATR_x3 = 3, // ATR * 3 from entry
};
//--- Take-profit sizing mode. The ATR_* presets set the TP a fixed multiple of ATR FROM THE ENTRY
//--- PRICE (no longer derived from the reward:risk ratio - that ratio was a pure
//--- rejection filter). TP_INTELLIGENT scales the target UP with confidence (lets high-conviction
//--- winners run further). Negative sentinel as above.
//--- TP_PREV_SWING REMOVED 2026-07-31 alongside the swing-anchored stops: targeting the opposite swing
//--- caps the reward at whatever structure happens to be overhead, which on a trending signal exits
//--- well before the move is done and, paired with a swing-anchored stop, made the realised
//--- reward:risk a property of the chart's geometry rather than of the setup.
enum TAKE_PROFIT_MODE
{
TP_INTELLIGENT = -1, // Intelligent (AI-confidence scaled)
TP_ATR_x1 = 1, // ATR * 1 from entry
TP_ATR_x2 = 2, // ATR * 2 from entry
TP_ATR_x3 = 3, // ATR * 3 from entry
TP_ATR_x4 = 4, // ATR * 4 from entry
TP_ATR_x6 = 6, // ATR * 6 from entry
TP_ATR_x8 = 8, // ATR * 8 from entry
TP_ATR_x10 = 10, // ATR * 10 from entry
};
//--- RISK_REWARD_RATIO removed 2026-08-09 along with its only consumer, the Min_Risk_Reward_Ratio
//--- input. Deleted rather than left dangling: a live enum with no input behind it is exactly the shape
//--- of the 2026-07 incident where a saved .set kept feeding a deleted option's ordinal back in and
//--- trained ~250 eras on the wrong target (MT5 does not validate saved enum inputs). See
//--- Variables\Inputs.mqh for why the ratio itself had to go.
enum MONEY_RISK_PERCENT_PRESET
{
RISK_PCT_1 = 1, // 1
RISK_PCT_2 = 2, // 2
RISK_PCT_3 = 3, // 3
RISK_PCT_4 = 4, // 4
RISK_PCT_5 = 5, // 5
};
enum BARS_EXPIRATION
{
BARS_X1 = 1, // 1 Candle
BARS_X2 = 2, // 2 Candles
BARS_X3 = 3, // 3 Candles
BARS_X5 = 5, // 5 Candles
BARS_X10 = 10, // 10 Candles
BARS_X20 = 20, // 20 Candles
};
//--- Entry order placement. All ATR offsets are measured from the CURRENT price (bid/ask), NOT the
//--- swing - this is the deliberate change for stability. Sign picks the side, magnitude is the ATR
//--- multiple:
//--- MARKET - fill immediately at market.
//--- LIMIT_*xATR - pending LIMIT that many ATR on the favorable side of bid/ask (buy below /
//--- sell above): wait for a pullback into a better price.
//--- STOP_*xATR - pending STOP that many ATR on the breakout side of bid/ask (buy above /
//--- sell below): enter on continuation.
//--- ENTRY_PREV_SWING - pending order anchored at the recent swing (buy at the lookback swing low /
//--- sell at the swing high) - the one swing-anchored option kept as a choice.
//--- ENTRY_INTELLIGENT - AI-confidence-scaled LIMIT pullback from bid/ask: a deep pullback when
//--- confidence is low, collapsing to a market fill as confidence -> 1 (grab
//--- high-conviction setups, demand a better price on marginal ones).
//--- Non-MARKET results that clear the broker's stop-level distance become a pending order that
//--- auto-expires after Signal_Expiration bars; anything closer just fills at market
//--- (CExpertTrade::Buy/Sell handle the market-vs-limit-vs-stop routing off this price natively).
enum ENTRY_MULTIPLIER
{
ENTRY_INTELLIGENT = -100, // Intelligent (AI-confidence scaled limit pullback)
//ENTRY_PREV_SWING = -101, // Pending at previous swing low (buy) / swing high (sell)
LIMIT_3xATR = -3, // Limit 3x ATR from bid/ask
LIMIT_2xATR = -2, // Limit 2x ATR from bid/ask
LIMIT_1xATR = -1, // Limit 1x ATR from bid/ask
MARKET = 0, // Market order
STOP_1xATR = 1, // Stop 1x ATR from bid/ask
STOP_2xATR = 2, // Stop 2x ATR from bid/ask
STOP_3xATR = 3, // Stop 3x ATR from bid/ask
};
enum TRAILING_STRATEGY
{
TRAILING_STRATEGY_NONE, // No Trailing Stop Strategy
TRAILING_STRATEGY_ATR_x1, // ATR * 1 Trailing Strategy
TRAILING_STRATEGY_ATR_x2, // ATR * 2 Trailing Strategy
TRAILING_STRATEGY_ATR_x3, // ATR * 3 Trailing Strategy
//--- Confidence-adaptive ATR trail: widens toward TRAIL_ATR_MAX_MULT when live AI confidence still
//--- backs the position (lets winners run), tightens toward TRAIL_ATR_MIN_MULT as that confidence
//--- weakens or flips against it (locks profit). See Trailing\TrailingIntelligent.mqh.
TRAILING_STRATEGY_INTELLIGENT, // Intelligent (AI-confidence adaptive ATR) Trailing Strategy
};
enum MONEY_MANAGEMENT_STRATEGY
{
FIXED_RISK, // Fixed risk Percent of Account
INTELLIGENT, // Intelligent lot size
FIXED_LOT, // Fixed lot size
};
enum CLOSE_HOUR_OF_DAY
{
CLOSE_HOUR_DISABLED = -1, // Disabled
CH_0 = 0, // 00Hxx
CH_1 = 1, // 1Hxx
CH_2 = 2, // 2Hxx
CH_3 = 3, // 3Hxx
CH_4 = 4, // 4Hxx
CH_5 = 5, // 5Hxx
CH_6 = 6, // 6Hxx
CH_7 = 7, // 7Hxx
CH_8 = 8, // 8Hxx
CH_9 = 9, // 9Hxx
CH_10 = 10, // 10Hxx
CH_11 = 11, // 11Hxx
CH_12 = 12, // 12Hxx
CH_13 = 13, // 13Hxx
CH_14 = 14, // 14Hxx
CH_15 = 15, // 15Hxx
CH_16 = 16, // 16Hxx
CH_17 = 17, // 17Hxx
CH_18 = 18, // 18Hxx
CH_19 = 19, // 19Hxx
CH_20 = 20, // 20Hxx
CH_21 = 21, // 21Hxx
CH_22 = 22, // 22Hxx
CH_23 = 23, // 23Hxx
};
enum CLOSE_MINUTE_OF_HOUR
{
CLOSE_MINUTE_DISABLED = -1,// Disabled
CM_0 = 0, // xxH00
CM_5 = 5, // xxH05
CM_10 = 10, // xxH10
CM_15 = 15, // xxH15
CM_20 = 20, // xxH20
CM_25 = 25, // xxH25
CM_30 = 30, // xxH30
CM_35 = 35, // xxH35
CM_40 = 40, // xxH40
CM_45 = 45, // xxH45
CM_50 = 50, // xxH50
CM_55 = 55, // xxH55
CM_60 = 60, // xxH60
};
enum CLOSE_DAY_OF_WEEK
{
CLOSE_DAY_DISABLED = -1, // Disabled
CLOSE_MONDAY = 1, // Monday
CLOSE_TUESDAY = 2, // Tuesday
CLOSE_WEDNESDAY = 3, // Wednesday
CLOSE_THURSDAY = 4, // Thursday
CLOSE_FRIDAY = 5, // Friday
CLOSE_EVERYDAY, // Every Day
};
enum NF_LOOKBACK_PRESETS
{
NF_DISABLED = -1, // Disabled
M5 = 5, // 5 Minutes
M15 = 15, // 15 Minutes
M30 = 30, // 30 Minutes
M45 = 45, // 45 Minutes
M60 = 60, // 1 Hour
M120 = 120, // 2 Hours
M240 = 240, // 4 Hours
};
enum NF_IMPACT_PRESETS
{
HOLIDAYS = 0, //Holidays
LOW = 1, // Low Impact News
MEDIUM = 2, // Medium Impact News
HIGH = 3, // High Impact News
};
enum TRADING_DIRECTION
{
BOTH, // Allow both long and short trades
LONG_ONLY, // Allow only long (buy) trades
SHORT_ONLY // Allow only short (sell) trades
};
enum PERCENTAGE_PRESETS
{
PCT_10 = 10, // 10%
PCT_20 = 20, // 20%
PCT_30 = 30, // 30%
PCT_40 = 40, // 40%
PCT_50 = 50, // 50%
PCT_60 = 60, // 60%
PCT_70 = 70, // 70%
PCT_80 = 80, // 80%
PCT_90 = 90, // 90%
PCT_100 = 100, // 100%
};
//--- Min_Vote_Close's own scale. Separate from PERCENTAGE_PRESETS above purely so the Disabled entry is
//--- offered ONLY where it means something - it would be nonsense on Min_Vote_Open or MinRecall, which
//--- share that enum.
//--- DISABLED is 101 rather than a flag or a negative sentinel because 101 is unreachable on BOTH scales
//--- this one input drives, with no special-case branch anywhere:
//--- - the rule-based path compares it against an AVERAGE of pattern weights, which cannot exceed 100
//--- (CExpertSignalCustom::CheckClosePosition -> m_threshold_close);
//--- - the AI early-exit path compares Min_Vote_Close/100.0 = 1.01 against a softmax confidence
//--- magnitude, which cannot exceed 1.0 (same function, m_ai_exit_threshold).
//--- So selecting Disabled switches off vote-driven closing entirely - positions then leave only via
//--- stop-loss, take-profit, trailing, or the scheduled close-all - and it does so by arithmetic rather
//--- than by an extra boolean anyone has to keep in sync.
enum VOTE_CLOSE_PRESETS
{
VOTE_CLOSE_10 = 10, // 10%
VOTE_CLOSE_20 = 20, // 20%
VOTE_CLOSE_30 = 30, // 30%
VOTE_CLOSE_40 = 40, // 40%
VOTE_CLOSE_50 = 50, // 50%
VOTE_CLOSE_60 = 60, // 60%
VOTE_CLOSE_70 = 70, // 70%
VOTE_CLOSE_80 = 80, // 80%
VOTE_CLOSE_90 = 90, // 90%
VOTE_CLOSE_100 = 100, // 100%
VOTE_CLOSE_DISABLED = 101, // Disabled (exit only via SL/TP/trailing)
};
//--- Strength (tau) of the post-hoc logit adjustment / prior correction applied to the AI's 3-class
//--- decision at inference (see AdjustedSignalFromSoftmax in ExpertSignalAIBase.mqh). The network is
//--- trained on class-balance-oversampled data, so its raw softmax over-calls the rare Buy/Sell classes;
//--- re-weighting each class by its measured true base rate (prior^tau) pulls the decision back toward the
//--- real distribution. 0 = Off (raw argmax, may over-call), 100 = full Bayesian calibration to the true
//--- base rate. Stored as a percent; divided by 100 to get tau.
enum LOGIT_PRIOR_STRENGTH_PRESETS
{
LOGIT_PRIOR_OFF = 0, // Off (raw argmax - may over-call Buy/Sell)
LOGIT_PRIOR_25 = 25, // 25% (light correction)
LOGIT_PRIOR_50 = 50, // 50% (moderate)
LOGIT_PRIOR_75 = 75, // 75% (strong)
LOGIT_PRIOR_100 = 100, // 100% (full calibration to true base rate)
};
//--- FIRST_LAYER_NEURONS removed 2026-07-29. The first dense layer dominates the parameter count -
//--- it is (inputWidth+1) x width - so its only defensible value is a function of the input width and
//--- the amount of in-sample data, neither of which the user can see when picking from a dropdown. It
//--- is now derived: see CExpertSignalAIBase::ComputeFirstLayerWidth().
//--- Architecture-aware dense-topology presets are now folded directly into AI_CHOICE so the UI shows
//--- one coherent selector instead of separate AI and topology choices. The dense taper that follows each
//--- architecture-specific front-end is chosen by the selected preset itself.
//--- LSTM's own recurrent hidden-unit count - previously silently piggybacked on HiddenLayersCount
//--- (an unrelated dense-taper-depth setting), which meant it could never be tuned independently and
//--- defaulted to a value (4) nobody actually chose on purpose. Decoupled into its own input.
enum LSTM_HIDDEN_SIZE_PRESET
{
LSTM_HIDDEN_8 = 8, // 8 Units
LSTM_HIDDEN_16 = 16, // 16 Units
LSTM_HIDDEN_32 = 32, // 32 Units
LSTM_HIDDEN_64 = 64, // 64 Units
LSTM_HIDDEN_128 = 128, // 128 Units
};
//--- CONV's own output-filter count for its convolutional layer - previously silently piggybacked on
//--- HiddenLayersCount too (same bug class as LstmHiddenSize above), defaulting to a bottleneck of 4
//--- filters/bar. Decoupled into its own input.
enum CONV_FILTER_COUNT_PRESET
{
CONV_FILTERS_8 = 8, // 8 Filters
CONV_FILTERS_16 = 16, // 16 Filters
CONV_FILTERS_32 = 32, // 32 Filters
CONV_FILTERS_64 = 64, // 64 Filters
CONV_FILTERS_128 = 128, // 128 Filters
};
//--- Shared pooling shape for the Conv front-end used by both CONV and HYBRID. Keeping this
//--- separate from ConvFilterCount lets the filter-bank width and the downsampling span be tuned
//--- independently, instead of smuggling one into the other.
//--- CONV_POOL_WINDOW_PRESET / CONV_POOL_STEP_PRESET removed 2026-07-29 along with the pooling
//--- stage itself - their "N Bars" labels described time-axis pooling the implementation could
//--- never perform. See AddConvStage() in Expert\ExpertSignalAIBase.mqh.
enum MIN_NEURONS_COUNT
{
MIN_NEURONS_10 = 10, // Min. 10 Neurons per layer
MIN_NEURONS_20 = 20, // Min. 20 Neurons per layer
MIN_NEURONS_30 = 30, // Min. 30 Neurons per layer
MIN_NEURONS_40 = 40, // Min. 40 Neurons per layer
MIN_NEURONS_50 = 50, // Min. 50 Neurons per layer
};
// Value IS the reduction percentage applied per hidden layer (retention = 100-value), consumed
// via BuildFreshTopology()'s n = n*((100-value)*0.01) taper - e.g. RF_70 keeps 30% of the previous
// layer's neurons, i.e. a genuine 70% reduction per layer, matching the label at face value.
enum NEURONS_REDUCTION_FACTOR
{
RF_10 = 10, // 10 % Neurons Reduction Per Layer
RF_20 = 20, // 20 % Neurons Reduction Per Layer
RF_30 = 30, // 30 % Neurons Reduction Per Layer
RF_40 = 40, // 40 % Neurons Reduction Per Layer
RF_50 = 50, // 50 % Neurons Reduction Per Layer
RF_60 = 60, // 60 % Neurons Reduction Per Layer
RF_70 = 70, // 70 % Neurons Reduction Per Layer
RF_80 = 80, // 80 % Neurons Reduction Per Layer
RF_90 = 90, // 90 % Neurons Reduction Per Layer
};
enum OUTPUT_NEURONS_COUNT
{
OUTPUT_REGRESSION = 1, // Regression Algorithm
OUTPUT_CLASSIFICATION = 3, // Classification Algorithm
};
//--- 2026-07-30: the dense-DEPTH suffix is gone from every entry. Depth is now derived alongside the
//--- width and the taper it has to be consistent with (ComputeHiddenLayerCount) - asking a user to pick
//--- "3 layers" while the code derives the width those layers taper between is asking them to make half
//--- a decision with no way to see the other half. This selector now chooses only the thing that is
//--- genuinely a modelling CHOICE: which front-end reads the input sequence.
enum AI_CHOICE
{
AI_NONE = 0, // Disabled (classic signals only)
AI_MLP = 1, // MLP (dense only)
AI_CONV = 2, // CONV (convolutional front-end)
AI_LSTM = 3, // LSTM (recurrent front-end)
AI_HYBRID = 4, // HYBRID (convolutional + recurrent)
AI_META = 5, // META (trade-quality head over classic candidates - trains, no votes yet)
};
// Confidence used to scale SL/TP, gate early AI exits, and (Intelligent MM) scale lot size.
// AI confidence comes from the signal filter's live prediction (0..1); DB confidence comes
// from the historical time-based win rate of the currently traded patterns (0..1). Blended
// averages both, so a pattern is only sized up when both the model and its track record agree.
enum CONFIDENCE_SOURCE
{
CONF_AI = 0, // AI signal confidence only
CONF_DB = 1, // Database win-rate confidence only
CONF_BLENDED = 2, // Average of AI and database confidence
};
// How many bars to wait, after a candidate ZigZag reversal bar, before trusting the real ADZigZag
// indicator's verdict on it as a training label - see CExpertSignalAIBase's m_swingConfirmationBars
// declaration comment. A ZigZag's most recent 1-3 legs can still repaint as new bars arrive, so this
// must be generous enough to let a leg fully settle (bumped from the old fractal-based system's
// default of 20 to 100 for exactly that reason). A value of 0 is clamped up to a 1-bar minimum
// internally, never used to mean "no delay".
enum SWING_CONFIRMATION_PRESET
{
SC_10 = 10, // 10 Bars
SC_20 = 20, // 20 Bars
SC_30 = 30, // 30 Bars
SC_50 = 50, // 50 Bars
SC_100 = 100, // 100 Bars
SC_200 = 200, // 200 Bars
};
enum MAX_ERAS_PRESET
{
ME_100 = 100, // 100 Eras
ME_200 = 200, // 200 Eras
ME_300 = 300, // 300 Eras
ME_500 = 500, // 500 Eras
ME_1000 = 1000, // 1000 Eras
};
//--- percentage of the study period held back as out-of-sample data never trained on;
//--- value is the OOS share, in-sample share is the remainder (e.g. OOS_30 -> 70% IS / 30% OOS)
enum OOS_SPLIT_PRESET
{
OOS_10 = 10, // 90% IS / 10% OOS
OOS_20 = 20, // 80% IS / 20% OOS
OOS_30 = 30, // 70% IS / 30% OOS
OOS_40 = 40, // 60% IS / 40% OOS
OOS_50 = 50, // 50% IS / 50% OOS
};
//--- RISK_LIMIT_PCT_PRESET REMOVED 2026-08-02. It backed MaxDailyLossPct/MaxDrawdownPct as a dropdown
//--- of eight fixed percentages, which no funded-account programme is obliged to match - 4.5% or 3.75%
//--- were unreachable. Both inputs are now free-entry doubles (Variables\Inputs.mqh) validated at init.
//--- Note for anyone reinstating an enum input here: MT5 does NOT validate a saved enum value against
//--- the current enum, so a .set file holding a deleted member loads as a silent out-of-range int - the
//--- failure mode that trained four topologies on the wrong barrier (project memory: stale enum wrong
//--- target). Changing these two to doubles removes that exposure rather than renaming it.
//+------------------------------------------------------------------+