Измерение задержки

В S# задержка (latency) регистрации и отмены заявок измеряется через менеджер LatencyManager. Менеджер определяет, сколько времени проходит между отправкой заявки и получением подтверждения от биржи.

Интерфейс ILatencyManager

Интерфейс ILatencyManager определяет базовый контракт:

  • LatencyRegistration — суммарная задержка регистрации по всем заявкам (TimeSpan).
  • LatencyCancellation — суммарная задержка отмены по всем заявкам (TimeSpan).
  • Reset() — сброс состояния менеджера.
  • ProcessMessage(Message) — обработка сообщения; возвращает задержку для данной операции или null.

Принцип работы

Менеджер задержки работает по схеме "запрос — ответ":

1. Регистрация заявки

При получении OrderRegisterMessage менеджер сохраняет пару (TransactionId, LocalTime) — момент отправки заявки.

2. Отмена заявки

При получении OrderCancelMessage менеджер сохраняет пару (TransactionId, LocalTime) — момент отправки отмены.

3. Замена заявки

При получении OrderReplaceMessage менеджер регистрирует и отмену (старой заявки), и регистрацию (новой заявки) одновременно.

4. Подтверждение

При получении ExecutionMessage с информацией о заявке (не в состоянии Pending и не Failed) менеджер вычисляет задержку:

Latency = ExecutionMessage.LocalTime - StoredLocalTime

Результат добавляется к LatencyRegistration или LatencyCancellation в зависимости от типа операции.

Состояние: ILatencyManagerState

Интерфейс ILatencyManagerState хранит внутреннее состояние менеджера:

  • Ожидающие регистрации: AddRegistration(transactionId, localTime) / TryGetAndRemoveRegistration(transactionId, out localTime)
  • Ожидающие отмены: AddCancellation(transactionId, localTime) / TryGetAndRemoveCancellation(transactionId, out localTime)
  • Накопленные задержки: LatencyRegistration, LatencyCancellation
  • Методы добавления: AddLatencyRegistration(TimeSpan), AddLatencyCancellation(TimeSpan)

Реализация по умолчанию — LatencyManagerState.

Обработка ошибок

Если заявка завершается с ошибкой (OrderState == Failed), задержка не учитывается — запись просто удаляется из хранилища состояния.

Интеграция через адаптер

Класс LatencyMessageAdapter оборачивает внутренний адаптер и автоматически измеряет задержку для всех операций с заявками.

Интеграция со стратегией

Стратегия (Strategy) предоставляет свойство Latency для отслеживания задержки.

Пример использования

// Создание менеджера с хранилищем состояния
var manager = new LatencyManager(new LatencyManagerState());

// Обработка регистрации заявки (запоминание времени отправки)
manager.ProcessMessage(orderRegisterMsg);

// Обработка подтверждения (расчёт задержки)
TimeSpan? latency = manager.ProcessMessage(executionMsg);
if (latency != null)
{
    Console.WriteLine($"Задержка: {latency.Value.TotalMilliseconds} мс");
}

// Суммарные задержки
Console.WriteLine($"Задержка регистрации: {manager.LatencyRegistration.TotalMilliseconds} мс");
Console.WriteLine($"Задержка отмены: {manager.LatencyCancellation.TotalMilliseconds} мс");

Сброс состояния

Метод Reset() очищает все ожидающие записи и обнуляет накопленные задержки:

manager.Reset();