Symbol resolution is now deterministic and fail-closed: an exact catalogue name wins, a broker prefix/suffix variant is accepted only when the inferred convention is verified and exactly one eligible FX instrument remains, and every other outcome is reported as EMPTY, NOT_FOUND, AMBIGUOUS or INELIGIBLE instead of silently choosing the shortest match. Eligibility rejects non-FX calculation modes, invalid volume constraints and unusable tick data.
A single centralised scheduler now walks every managed symbol from both OnTick and OnTimer, so a multi-symbol portfolio no longer depends on ticks arriving on the attached chart. The duplicate-entry guard, the account risk gate and the direction-permission gate are shared by both event paths.
BarsCalculated() can remain -1 for indicator handles created inside the strategy tester, which previously left every symbol permanently 'not ready' and blocked all signals. Handles are now created once during initialisation and readiness is validated by the actual CopyBuffer results in the signal engine.