mql5-execution-microstructu.../Include/RequestLatencyLab/Legacy/LifecycleAdapter.mqh

54 lines
No EOL
3.7 KiB
MQL5

//+------------------------------------------------------------------+
//| 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
//+------------------------------------------------------------------+