Сначала выберите роль программы
Для советника событие новой котировки обрабатывается функцией OnTick. Оно относится к инструменту графика, к которому советник прикреплён. В пользовательском индикаторе такая функция не получает соответствующее событие только потому, что её добавили в текст программы. Индикатор использует OnCalculate для обработки изменений ценовых данных. Для скриптов предусмотрен обработчик OnStart, связанный с запуском. Он также используется в сервисах, поэтому название функции само по себе не означает исключительно скрипт. Важно смотреть на тип программы и её назначение. В учебном примере разовое формирование сообщения в журнале и регулярный пересчёт отображаемых значений являются разными задачами, даже если внутри используется похожая арифметика.
Вызов обработчика не равен каждому внешнему изменению
События советника обрабатываются последовательно. Если событие новой котировки уже находится в очереди или обрабатывается, ещё одно такое событие не добавляется в очередь этой программы. Поэтому счётчик вызовов OnTick нельзя без оговорок считать полным счётчиком всех поступивших котировок. Время выполнения обработчика имеет значение для понимания наблюдений. У индикатора есть своя логика повторного расчёта. Параметр prev_calculated содержит значение, возвращённое предыдущим вызовом OnCalculate. Он помогает организовать обработку данных, но не заменяет проверки состояния истории и необходимых участков пересчёта. Если программа рисует линию, полезно отдельно понимать, откуда взяты данные, что рассчитано сейчас и какие значения уже сохранены.
Разделяйте получение, расчёт и действие
В учебной архитектуре удобно выделить три смысловых этапа: получить сведения, вычислить результат и решить, что с ним делать. Отображение числа или запись сообщения в журнал не равны торговой операции. Такая граница делает проверку программы понятнее: можно сначала изучить расчёт без внешних действий. Отключение автоматической торговли также не означает остановку всей работы советника. События новой котировки могут продолжать обрабатываться; запрет касается отправки торговых запросов советником. Поэтому важно точно формулировать, что именно отключено или проверено. Успешная компиляция, вызов функции и правильный расчёт являются разными результатами. Ни один из них сам по себе не подтверждает прибыльность алгоритма или его пригодность для использования с деньгами.
Попробуйте на практике
Составьте схему обработки событий на бумаге. Не запускайте торговых операций, не вводите учётные данные и не изменяйте настройки реального терминала.
- Придумайте три учебные задачи: разово записать сообщение, пересчитывать отображаемое значение и наблюдать события новой котировки. Для каждой выберите подходящую роль программы.
- Соотнесите задачи с обработчиками OnStart, OnCalculate и OnTick. Подпишите, какие сведения нужны каждому действию и что является результатом.
- Нарисуйте очередь, в которой OnTick ещё выполняется, когда приходит новая котировка. Отметьте, почему число вызовов не обязано совпасть с числом внешних событий.
- Разделите каждую задачу на получение данных, расчёт и вывод. Убедитесь, что учебный вывод ограничен описанием или журналом и не содержит торговых запросов.
Как проверить результат. Схема верна, если обработчики связаны с подходящими типами программ, ограничения очереди учтены, а расчёт не назван торговым результатом.
Частые вопросы
Если добавить OnTick в индикатор, он начнёт работать как советник?
Нет. Наличие функции в тексте не меняет тип программы и набор событий, которые ей передаёт среда. Нужно выбирать архитектуру под задачу.
Достаточно ли отсутствия ошибок компиляции?
Нет. Компиляция проверяет одну сторону корректности. Отдельно нужно понимать события, входные данные, повторные вызовы и ожидаемый результат. Проверка на учебных данных также не доказывает будущего дохода.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.