Жизненный цикл пользовательского индикатора
Структура примера кода
Эта статья проведет вас через структуру кода и объяснит логику событий и жизненного цикла индикатора cTrader. Чтобы получить доступ к пользовательским индикаторам, откройте вкладку Локальные в приложении Algo.

В качестве примера вы можете создать новый индикатор с именем "LifeCycle Test" со следующим примером кода, доступным в окне редактора кода.

Чтобы вернуться к шаблонной версии, скопируйте код ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
На первый взгляд, структура кода включает только два метода: метод Initialize() и метод Calculate(). Нажмите Собрать, чтобы продолжить тестирование этого индикатора. Мы добавим дополнительный метод под названием OnDestroy() и объясним его назначение позже.
Событие инициализации
Когда индикатор cTrader впервые прикрепляется к графику или когда пользователь изменяет какие-либо настройки параметров, экземпляр индикатора пересоздается и вызывается метод Initialize(). Он используется для инициализации любых переменных, которые вы планируете использовать в своем индикаторе. Вы также можете определить и ссылаться на дополнительные индикаторы, чтобы создать единый индикатор, используя формулы из других индикаторов.
По умолчанию новый шаблон кода включает настройку параметра под названием Message со значением "Hello world!".
1 2 | |
В методе Initialize() есть строка кода для вывода этого сообщения в журнал.
1 | |
Чтобы продемонстрировать метод Initialize(), добавьте экземпляр индикатора, нажав на значок Плюс рядом со значком Собрать и выбрав инструмент. Если вы нажмете Еще в строке индикатора и выберете Добавить экземпляр, инструмент EURUSD с таймфреймом h1 будет добавлен автоматически.

Примечание
Добавление экземпляра в cTrader Algo — это то же самое, что прикрепление индикатора к графику в приложении Торговля.
Теперь откройте вкладку Журнал на панели Обзор сделок под графиком. Как видите, сообщение "Hello world" было выведено.

Каждый раз, когда индикатор впервые добавляется на график или когда изменяется параметр, график обновляется и метод Initialize() вызывается снова. Введите другое сообщение в разделе Параметры, чтобы увидеть, как соответствующим образом обновится запись в журнале.

Расчет выходных данных индикатора
Метод Calculate() вызывается для каждого индекса исторических данных и при каждом входящем тике. Например, если на текущем графике 1000 баров, метод Calculate() будет вызван для индекса 0, 1, 2 и так далее, до максимального значения 999.
1 | |
Метод Calculate() может вызываться несколько раз в секунду в периоды высокой волатильности или реже, когда рынок спокоен. Чтобы проверить, как это работает, вы можете добавить строку кода в тело метода Calculate() для вывода значения индекса, которое передается в метод для каждого нового тика данных. Не забывайте нажимать Собрать каждый раз после внесения изменений в окне редактора кода.
1 | |
Чтобы переключиться из окна редактора кода на график, нажмите на добавленный экземпляр индикатора. Если вы откроете вкладку Журнал на панели Обзор сделок, вы увидите значения, выведенные для каждого индекса, переданного в метод.

Метод OnDestroy()
Метод OnDestroy() вызывается, когда индикатор удаляется с графика и больше не нужен. Вам нужно будет реализовать этот метод, так как он не добавляется по умолчанию при создании нового индикатора.
1 2 3 4 | |
Этот метод полезен для программистов, так как позволяет им освобождать неуправляемые ресурсы и выполнять задачи финализации. Он помогает предотвратить утечки памяти и гарантирует, что индикатор не сохраняет ресурсы после удаления. Примеры включают закрытие соединений с внешними источниками данных, освобождение больших объектов данных и другие операции, освобождающие память.
Обзор
Таким образом, методы Initialize(), Calculate() и OnDestroy() иллюстрируют различные этапы жизненного цикла пользовательского индикатора. Настраивая пример кода в приложении Algo, вы можете свободно решать, как инициализировать переменные индикатора, рассчитывать выходные данные индикатора и выполнять задачи финализации.
