Every trade-signal class the EA can construct. Each is a `CExpertSignalCustom` (rule-based)
or a `CExpertSignalAIBase` (neural), and each is gated by its own `Enable*` input in
`Variables/Inputs.mqh` — so this directory is the roster, not the running configuration.
`Signals.mqh` is the only file the EA includes; it pulls in the rest.
## What is here
### Neural votes — `CExpertSignalAIBase`
| File | Class | Role |
|---|---|---|
| `SignalPAI.mqh` | `CSignalPAI` | Dense MLP direction vote. |
| `SignalCONV.mqh` | `CSignalCONV` | Convolutional front end. |
| `SignalLSTM.mqh` | `CSignalLSTM` | Recurrent, sequence over the input window. |
| `SignalHYBRID.mqh` | `CSignalHYBRID` | Conv front end feeding an LSTM. |
| `SignalMETA.mqh` | `CSignalMETA` | **Not a voter.** A GATE — see below. |
Two or more enabled makes an ensemble; exactly one is a solo model. The roster is
chosen with `Use_MLP` / `Use_CONV` / `Use_LSTM` / `Use_CONVLSTM`, not with per-class
inputs, and it is reported by `EnabledNNSummary()`.
### Filters — `CExpertSignalCustom`
| File | Class | Role |
|---|---|---|
| `SignalNewsFilter.mqh` | `CSignalNewsFilter` | Blocks around calendar events, by impact and lookback. |
| `SignalSessionFilter.mqh` | `CSignalSessionFilter` | London / New York / Tokyo session gating. |
| `SignalRiskGuard.mqh` | `CSignalRiskGuard` | Takes no parameters: thresholds, anchors and state file all live on `g_riskBudget`, evaluated per tick rather than per bar. |
### `CSignalMETA` is routed, not voted
`AddFilter` inspects `IsVotingSignal()`, which is false for a meta head, so META is
adopted as a **gate** rather than a voter: it vetoes vote-cleared entries whose predicted
win probability is below cost-adjusted break-even. It never votes a direction, never
blocks an exit, and fails open loudly. It still receives indicators, ticks, panel commands
and traits, because the administrative walks cover the whole tree — it is simply absent
from every consumer of the voting list, and it is added last so no other filter's
`m_ignore`/`m_invert` bit index moves.
Its candidate corpus comes from `CMetaCorpus::LoadLargestOnDisk` (a tester-built DB).
The on-chart ladder sweep is still implemented (`BuildCorpusBySweep`) but has no wired
sources — see below.
## What was removed, and why it is not coming back
Deleting these is the only way to stop re-deriving the same negative result, so the
reasons are recorded here rather than in a commit nobody re-reads.