//+------------------------------------------------------------------+ //| LifecycleAdapter.mqh | //| Copyright 2026, MetaQuotes Ltd. | //| www.mql5.com | //+------------------------------------------------------------------+ #ifndef REQUEST_LATENCY_LAB_LEGACY_LIFECYCLE_ADAPTER_MQH #define REQUEST_LATENCY_LAB_LEGACY_LIFECYCLE_ADAPTER_MQH //--- исходник статьи 1 подключается по абсолютному пути из соседнего проекта. //--- Относительный #include за границу Shared Project компилятором блокируется, //--- поэтому путь фиксирует расположение соседнего каталога mql5-execution-microstructure. #include "..\..\Dependencies\Article01\Experts\OrderLifecycle\TradeLifecycle.mqh" // снимок статьи 1 (п.1 аудита) #include "..\..\..\Include\RequestLatencyLab\Models.mqh" //+------------------------------------------------------------------+ //| Адаптер: единая точка использования кода TradeLifecycle. | //| Поздние события лаборатории работают через собственные модули; | //| CTradeLifecycle не управляет T6 новой лаборатории. | //+------------------------------------------------------------------+ class CLifecycleAdapter { public: //--- справочники исходника без изменения алгоритма static string RetcodeText(const uint retcode) { return(RetcodeName(retcode)); } static string TransactionShortName(const ENUM_TRADE_TRANSACTION_TYPE type) { return(ShortTypeName(type)); } static bool IsPending(const long order_type) { return(IsPendingType(order_type)); } //--- сужение ulong->uint запрещено: адаптер сохраняет ulong. static ulong OrderOfEvent(const TradeEvent &e) { return(e.order_ticket); } //--- Прежний IsComplete доступен только для диагностики и не //--- участвует в определении T6 лаборатории. static bool LegacyChainComplete(const CTradeLifecycle &lc) { return(lc.IsComplete()); } //--- Копирование события исходника в собственную структуру //--- лаборатории (без предположений о завершённости). static void AdaptEvent(const TradeEvent &source, LabEvent &target); }; //+------------------------------------------------------------------+ //| Внешние определения методов. | //+------------------------------------------------------------------+ void CLifecycleAdapter::AdaptEvent(const TradeEvent &source, LabEvent &target) { target.Zero(); target.kind = LAB_KIND_TRADE_TRANSACTION; target.local_time_us = source.local_time_us; target.request_id = source.request_id; target.order_ticket = source.order_ticket; target.deal_ticket = source.deal_ticket; target.position_ticket = source.position_id; target.transaction_type = ShortTypeName(source.type); target.payload_json = StringFormat( "{\"type\":\"%s\",\"price\":%.10g,\"volume\":%.10g,\"retcode\":%u,\"entry\":%d}", ShortTypeName(source.type), source.price, source.volume, source.retcode, (int)source.entry); } #endif // REQUEST_LATENCY_LAB_LEGACY_LIFECYCLE_ADAPTER_MQH //+------------------------------------------------------------------+