В КУРСЕ?

Разбираемся в теме

MQL5: почему одинаковая функция не работает одинаково в советнике и индикаторе?

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

Сначала выберите роль программы

Для советника событие новой котировки обрабатывается функцией OnTick. Оно относится к инструменту графика, к которому советник прикреплён. В пользовательском индикаторе такая функция не получает соответствующее событие только потому, что её добавили в текст программы. Индикатор использует OnCalculate для обработки изменений ценовых данных. Для скриптов предусмотрен обработчик OnStart, связанный с запуском. Он также используется в сервисах, поэтому название функции само по себе не означает исключительно скрипт. Важно смотреть на тип программы и её назначение. В учебном примере разовое формирование сообщения в журнале и регулярный пересчёт отображаемых значений являются разными задачами, даже если внутри используется похожая арифметика.

Вызов обработчика не равен каждому внешнему изменению

События советника обрабатываются последовательно. Если событие новой котировки уже находится в очереди или обрабатывается, ещё одно такое событие не добавляется в очередь этой программы. Поэтому счётчик вызовов OnTick нельзя без оговорок считать полным счётчиком всех поступивших котировок. Время выполнения обработчика имеет значение для понимания наблюдений. У индикатора есть своя логика повторного расчёта. Параметр prev_calculated содержит значение, возвращённое предыдущим вызовом OnCalculate. Он помогает организовать обработку данных, но не заменяет проверки состояния истории и необходимых участков пересчёта. Если программа рисует линию, полезно отдельно понимать, откуда взяты данные, что рассчитано сейчас и какие значения уже сохранены.

Разделяйте получение, расчёт и действие

В учебной архитектуре удобно выделить три смысловых этапа: получить сведения, вычислить результат и решить, что с ним делать. Отображение числа или запись сообщения в журнал не равны торговой операции. Такая граница делает проверку программы понятнее: можно сначала изучить расчёт без внешних действий. Отключение автоматической торговли также не означает остановку всей работы советника. События новой котировки могут продолжать обрабатываться; запрет касается отправки торговых запросов советником. Поэтому важно точно формулировать, что именно отключено или проверено. Успешная компиляция, вызов функции и правильный расчёт являются разными результатами. Ни один из них сам по себе не подтверждает прибыльность алгоритма или его пригодность для использования с деньгами.

Попробуйте на практике

Составьте схему обработки событий на бумаге. Не запускайте торговых операций, не вводите учётные данные и не изменяйте настройки реального терминала.

  1. Придумайте три учебные задачи: разово записать сообщение, пересчитывать отображаемое значение и наблюдать события новой котировки. Для каждой выберите подходящую роль программы.
  2. Соотнесите задачи с обработчиками OnStart, OnCalculate и OnTick. Подпишите, какие сведения нужны каждому действию и что является результатом.
  3. Нарисуйте очередь, в которой OnTick ещё выполняется, когда приходит новая котировка. Отметьте, почему число вызовов не обязано совпасть с числом внешних событий.
  4. Разделите каждую задачу на получение данных, расчёт и вывод. Убедитесь, что учебный вывод ограничен описанием или журналом и не содержит торговых запросов.

Как проверить результат. Схема верна, если обработчики связаны с подходящими типами программ, ограничения очереди учтены, а расчёт не назван торговым результатом.

Частые вопросы

Если добавить OnTick в индикатор, он начнёт работать как советник?

Нет. Наличие функции в тексте не меняет тип программы и набор событий, которые ей передаёт среда. Нужно выбирать архитектуру под задачу.

Достаточно ли отсутствия ошибок компиляции?

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

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов