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

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

Типизированная шина событий на основе шаблона публикации и подписки в MQL5 заменяет глобальные переменные и прямые перекрестные ссылки. Благодаря абстрактному интерфейсу слушателя и таблице подписок, индексируемой значениями перечисления, генератор сигналов, менеджер ордеров и монитор просадки взаимодействуют только через шину, без общего состояния. В статье анализируются накладные расходы на диспетчеризацию, проверка указателей и риски рекурсивной публикации, что поможет вам разрабатывать советники с низкой связностью, удобные для тестирования.

Когда советник выходит за рамки одного блока торговой логики, разработчики часто прибегают к самому доступному механизму координации: глобальным переменным. Менеджеру рисков необходимо знать текущую просадку, поэтому на уровне файла появляется переменная типа double с именем g_current_drawdown. Генератор сигналов выдает сигнал, и менеджер ордеров получает уведомление через флаг g_signal_active типа bool. За несколько недель в советнике средней сложности накапливаются десятки таких "мостов" для передачи состояния, каждый из которых представляет собой прямую, невидимую зависимость между компонентами, изначально задуманными как независимые.

Структурное следствие такого подхода — не просто беспорядок, а связность на уровне поведения. Когда менеджер рисков считывает значение g_current_drawdown, он исходит из того, что нужный модуль записал его в нужное время в рамках нужного цикла обработки тика. Если модуль исполнения будет переработан так, чтобы обновлять это значение асинхронно, или если другой компонент также начнет записывать в эту переменную, поведение менеджера рисков незаметно изменится. На уровне языка соблюдение контракта не обеспечивается. Глобальная переменная — это канал доступа к общему изменяемому состоянию без контроля доступа, без гарантий типизации сверх тех, что дает примитивный тип, и без сведений о том, кто и когда сформировал значение.

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

Рисунок 1: Взаимозависимость компонентов в архитектуре трёхкомпонентного советника


Автор: Ushana Kevin Iorkumbul

Мне нравятся эти схемы, но зачем тут упоминать о глобальных переменных? Глобальные переменные обычно используются для сохранения состояния или взаимодействия между множеством различных программ на MQL5 — а не внутри одного автотрейдера, одного индикатора или какого-либо другого отдельного объекта. Если речь идет об одном из последних случаев, то вы используете переменные/объекты MQL5 с встроенной типовой безопасностью, что очевидно и продемонстрировано в статье. Действительно, сложная торговая система может состоять из множества программ, что обеспечивает многопоточное выполнение и требует какого-либо механизма синхронизации — и глобальные переменные позволяют это реализовать.