Обсуждение статьи "Создание типобезопасной шины событий в MQL5: Снижение связности компонентов советника без глобальных переменных"
Мне нравятся эти схемы, но зачем тут упоминать о глобальных переменных? Глобальные переменные обычно используются для сохранения состояния или взаимодействия между множеством различных программ на MQL5 — а не внутри одного автотрейдера, одного индикатора или какого-либо другого отдельного объекта. Если речь идет об одном из последних случаев, то вы используете переменные/объекты MQL5 с встроенной типовой безопасностью, что очевидно и продемонстрировано в статье. Действительно, сложная торговая система может состоять из множества программ, что обеспечивает многопоточное выполнение и требует какого-либо механизма синхронизации — и глобальные переменные позволяют это реализовать.
Опубликована статья Создание типобезопасной шины событий в MQL5: Снижение связности компонентов советника без глобальных переменных:
Когда советник выходит за рамки одного блока торговой логики, разработчики часто прибегают к самому доступному механизму координации: глобальным переменным. Менеджеру рисков необходимо знать текущую просадку, поэтому на уровне файла появляется переменная типа double с именем g_current_drawdown. Генератор сигналов выдает сигнал, и менеджер ордеров получает уведомление через флаг g_signal_active типа bool. За несколько недель в советнике средней сложности накапливаются десятки таких "мостов" для передачи состояния, каждый из которых представляет собой прямую, невидимую зависимость между компонентами, изначально задуманными как независимые.
Структурное следствие такого подхода — не просто беспорядок, а связность на уровне поведения. Когда менеджер рисков считывает значение g_current_drawdown, он исходит из того, что нужный модуль записал его в нужное время в рамках нужного цикла обработки тика. Если модуль исполнения будет переработан так, чтобы обновлять это значение асинхронно, или если другой компонент также начнет записывать в эту переменную, поведение менеджера рисков незаметно изменится. На уровне языка соблюдение контракта не обеспечивается. Глобальная переменная — это канал доступа к общему изменяемому состоянию без контроля доступа, без гарантий типизации сверх тех, что дает примитивный тип, и без сведений о том, кто и когда сформировал значение.
Рассмотрим реалистичную архитектуру, состоящую из трёх компонентов: генератора сигналов, менеджера ордеров и монитора просадки. В упрощённой архитектуре на основе глобальных переменных связи между ними выглядят так:
Автор: Ushana Kevin Iorkumbul