Обсуждение статьи "Отложенная загрузка хендлов индикаторов в MQL5: Менеджер ресурсов для мультитаймфреймовых советников"

Опубликована статья Отложенная загрузка хендлов индикаторов в MQL5: Менеджер ресурсов для мультитаймфреймовых советников:

Мультитаймфреймовые торговые советники, которые инициализируют все хэндлы индикаторов в OnInit(), несут фиксированные затраты на запуск, даже если большинство хэндлов никогда не используется. CIndicatorCache использует отложенную загрузку с поиском по составному ключу, методы получения/освобождения AcquireHandle() и ReleaseHandle() с подсчетом ссылок и детерминированный метод FlushAll() для полной очистки кэша. Хэндлы создаются при первом запросе и повторно используются на последующих тиках, что сокращает задержку при запуске, позволяет избежать повторного выделения памяти в куче и предотвращает утечки ресурсов терминала благодаря централизованному владению ресурсами.

Мультитаймфреймовому торговому советнику (EA), торгующему на 10 символах и четырех таймфреймах с использованием пяти индикаторов для каждой комбинации, для полного охвата требуется 200 хэндлов индикаторов. Как правило, разработчики инициализируют все хэндлы в функции OnInit(). До того как функция OnInit() завершит работу, терминал подключается к каждому источнику ценовых данных, проверяет наличие данных, выделяет буферы для индикаторов и регистрирует хэндлы. Этот процесс приводит к задержке инициализации. Эта задержка увеличивается при холодном запуске терминала или при синхронизации устаревших исторических данных.

Кроме того, многие из этих хэндлов редко используются одновременно. В каждый конкретный момент стратегия может генерировать активные сигналы лишь по небольшой части отслеживаемых ею символов. Остальные неактивные хэндлы занимают память и слоты для хэндлов, не принося пользы в текущем сеансе.

Статическая инициализация также увеличивает затраты на сопровождение кода. Если требования к индикаторам изменятся, разработчикам придется вручную обновить код создания хэндлов в функции OnInit(). Пропущенные или забытые хэндлы приводят к ненужному расходу ресурсов во время выполнения, при этом компилятор этого не обнаруживает.

Паттерн управления ресурсами с отложенной загрузкой устраняет эти недостатки с помощью трех основных механизмов:

  • Инициализация по требованию: хэндлы индикаторов создаются только при первом запросе во время выполнения. Таким образом, затраты на инициализацию возникают не для потенциальных сценариев использования, а только для фактически задействованных.
  • Подсчет ссылок: идентичные конфигурации индикаторов используются совместно. Например, если два отдельных торговых модуля запрашивают индикатор «средний истинный диапазон (ATR)» с одинаковыми параметрами для одного и того же символа и таймфрейма, менеджер создает хэндл один раз и отслеживает число его активных потребителей.
  • Централизованное управление ресурсами: освобождение ресурсов сосредоточено в одном месте. Вместо того чтобы поддерживать обширный список явных вызовов IndicatorRelease() в OnDeinit(), советник вызывает единственный метод очистки кэша ресурсов.

Алгоритм принятия решений в кэше


Автор: Ushana Kevin Iorkumbul

Всё это вам не понадобится: платформа изначально и автоматически поддерживает подсчёт ссылок и очистку ресурсов (для дескрипторов индикаторов, оставшихся без ссылок после вызова `deinit`).