Перейти к содержанию

Жизненный цикл пользовательского индикатора

Структура примера кода

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

Image title

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

Image title

Чтобы вернуться к шаблонной версии, скопируйте код ниже.

 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
{
    [Indicator(AccessRights = AccessRights.None)]
    public class LifeCycleTest : Indicator
    {
        [Parameter(DefaultValue = "Hello world!")]
        public string Message { get; set; }

        [Output("Main")]
        public IndicatorDataSeries Result { get; set; }

        protected override void Initialize()
        {
            // To learn more about cTrader Algo visit our Help Center:
            // https://help.ctrader.com/ctrader-algo/


            Print(Message);
        }

        public override void Calculate(int index)
        {
            // Calculate value at specified index
            // Result[index] = 
        }
    }
}

На первый взгляд, структура кода включает только два метода: метод Initialize() и метод Calculate(). Нажмите Собрать, чтобы продолжить тестирование этого индикатора. Мы добавим дополнительный метод под названием OnDestroy() и объясним его назначение позже.

Событие инициализации

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

По умолчанию новый шаблон кода включает настройку параметра под названием Message со значением "Hello world!".

1
2
[Parameter(DefaultValue = "Hello world!")]
public string Message { get; set; }

В методе Initialize() есть строка кода для вывода этого сообщения в журнал.

1
Print(Message);

Чтобы продемонстрировать метод Initialize(), добавьте экземпляр индикатора, нажав на значок Плюс рядом со значком Собрать и выбрав инструмент. Если вы нажмете Еще в строке индикатора и выберете Добавить экземпляр, инструмент EURUSD с таймфреймом h1 будет добавлен автоматически.

Image title

Примечание

Добавление экземпляра в cTrader Algo — это то же самое, что прикрепление индикатора к графику в приложении Торговля.

Теперь откройте вкладку Журнал на панели Обзор сделок под графиком. Как видите, сообщение "Hello world" было выведено.

Image title

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

Image title

Расчет выходных данных индикатора

Метод Calculate() вызывается для каждого индекса исторических данных и при каждом входящем тике. Например, если на текущем графике 1000 баров, метод Calculate() будет вызван для индекса 0, 1, 2 и так далее, до максимального значения 999.

1
public override void Calculate(int index)

Метод Calculate() может вызываться несколько раз в секунду в периоды высокой волатильности или реже, когда рынок спокоен. Чтобы проверить, как это работает, вы можете добавить строку кода в тело метода Calculate() для вывода значения индекса, которое передается в метод для каждого нового тика данных. Не забывайте нажимать Собрать каждый раз после внесения изменений в окне редактора кода.

1
Print("Index: " + index);

Чтобы переключиться из окна редактора кода на график, нажмите на добавленный экземпляр индикатора. Если вы откроете вкладку Журнал на панели Обзор сделок, вы увидите значения, выведенные для каждого индекса, переданного в метод.

Image title

Метод OnDestroy()

Метод OnDestroy() вызывается, когда индикатор удаляется с графика и больше не нужен. Вам нужно будет реализовать этот метод, так как он не добавляется по умолчанию при создании нового индикатора.

1
2
3
4
protected override void OnDestroy()
        {
            base.OnDestroy();            
        }

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

Обзор

Таким образом, методы Initialize(), Calculate() и OnDestroy() иллюстрируют различные этапы жизненного цикла пользовательского индикатора. Настраивая пример кода в приложении Algo, вы можете свободно решать, как инициализировать переменные индикатора, рассчитывать выходные данные индикатора и выполнять задачи финализации.

Image title