mql5-execution-microstructu.../Docs/DependencyChanges.md

5.7 KiB

DependencyChanges

Зафиксированные изменения для переиспользуемого кода статьи 1 (ТЗ §2.2/§2.3).

Источники (исходные каталоги статьи 1 не изменялись):

  • ..\mql5-execution-microstructure\Experts\LifecycleBenchmark\LifecycleBenchmark.mq5
  • ..\mql5-execution-microstructure\Experts\OrderLifecycle\OrderLifecycleRecorder.mq5
  • ..\mql5-execution-microstructure\Experts\OrderLifecycle\TradeLifecycle.mqh

Контрольные суммы исходных файлов совпадают с ТЗ:

Файл SHA-256
LifecycleBenchmark.mq5 430abc7d254c7f18c8db4f48f1a44be48a0c5cf338bd16aa4d621ffd4654a8d9
OrderLifecycleRecorder.mq5 27463190954b5200444781ba4a49bb167c210087ad511a39616cfc807b69ea84
TradeLifecycle.mqh 0b3d409a1da0fa05bad541944b9922ca6beeb26a2920836d408efdaf930bce30

1. BenchmarkStatistics.mqh (из LifecycleBenchmark.mq5, строки 211–255)

  • Исходные функции MinValue/MaxValue/AvgValue/Percentile сохранены как LegacyMinValue/LegacyMaxValue/LegacyAvgValue/LegacyPercentile без изменения алгоритма (линейная интерполяция, p в 0..100) — для проверки согласованности.
  • Адаптированные версии LabMinValue/LabMaxValue/LabAvgValue/LabPercentile/LabStdDev:
    • возвращают false при пустой выборке (значение не выдумывается);
    • p проверяется в [0,100];
    • stddev — выборочное (n−1), для n=1 возвращает false (пустое).
  • Причина: ТЗ требует проверок границ, выделения памяти и пустой выборки, при этом «пустой массив и ошибки не превращаются в ноль».

2. TradeRequestTools.mqh (из OrderLifecycleRecorder.mq5)

  • LabNormalizePrice — исходный алгоритм (SYMBOL_DIGITS) без изменений.
  • LabNormalizeVolume — исходная математика (диапазон/шаг/округление), но выход за диапазон теперь возвращает false вместо тихой подгонки (ТЗ §2.4).
  • SelectFilling(symbol, is_pending) — для отложенных ордеров закреплён RETURN (ТЗ §2.4); для рыночных — исходное поведение.
  • LabBuildRequest(plan, rules, quote, request, error) — замена исходного BuildRequest(symbol,type,volume,...): параметры передаются явно, вместо Inp*/EXT*; цена покупки/продажи из котировки, лимитные ордера с отступом D; продажа/покупка округление в сторону рынка; удалено безусловное PrintFormat из измеряемого пути.
  • LabPreCheck — обёртка OrderCheck без печати результата.
  • VolumeToUnits — перевод объёма в целые шаги с допуском 1e-7 (ТЗ §6.4).
  • Сознательно НЕ перенесено: автоповторы (ScheduleRetry), прежние сроки ожидания, безусловное подробное журналирование.

3. LifecycleAdapter.mqh (TradeLifecycle.mqh по ссылке)

  • TradeLifecycle.mqh подключается по абсолютному пути из соседнего проекта: ...MQL5\Shared Projects\mql5-execution-microstructure\Experts\OrderLifecycle\ TradeLifecycle.mqh — снимки не копируются, исходные байты не изменены.
  • Адаптер использует: RetcodeName, ShortTypeName, IsPendingType, структуры TradeEvent/PendingRequest.
  • Не перенесено: сужение ulong sequence -> uint, старая очистка позиций, IsComplete не устанавливает T6 лаборатории (доступен как диагностика LegacyChainComplete).
  • AdaptEvent — конвертация TradeEvent в LabEvent журнала для диагностики.
  • Учтена версия CTradeLifecycle с m_chain_start и EventInLastChain (ТЗ §2.2).

Проверяющие тесты

  • Tests/RequestLatencyTests.mq5: STAT-02 (равенство c [0,10,20,30]), STAT-01 (пустой/[5]), PLAN-01 (Park–Miller seed=1), CSV-01/02, MARKET-04/05, DEAL-01, DATA-03, CORR-05.
  • Согласованность процентилей с исходным алгоритмом на допустимых входах проверяется равенством LabPercentile и legacy-формулы на контрольных наборах (тот же код интерполяции).
  • Отсутствие исходных обработчиков событий и глобального состояния: Legacy-модули не содержат OnInit/OnTick/OnTradeTransaction и глобальных переменных EXT_*/Inp*.

Ограничения

  • used_module_sha256 в dependencies.lock.json заполняются при первой фиксации модулей в репозитории.
  • Исходные каталоги статьи 1 не изменялись; сборка требует наличия соседнего каталога mql5-execution-microstructure (абсолютный #include в LifecycleAdapter.mqh); обновление зависимости — отдельное изменение с новым lock-файлом и повторными тестами.