Создайте технический индикатор в cTrader
В этой статье описаны шаги по созданию пользовательских технических индикаторов, включая инструменты для алгоритмической торговли или ручных действий в cTrader.
Совет
Узнайте, как создавать технические индикаторы, посмотрев видео в пошаговом руководстве.
На вкладке Индикаторы приложения Algo нажмите кнопку Создать, чтобы открыть мастер создания алгоритма.
Введите имя для вашего индикатора, затем выберите язык программирования между C# и Python.
Выберите способ создания из:
-
С нуля — новый индикатор будет содержать только базовый шаблон.
-
Используя шаблон — вы сможете выбрать готовый алгоритм из списка шаблонов Python# или C#, охватывающих широкий спектр типов индикаторов, инструментов технического анализа и многое другое.
Примечание
Готовые алгоритмы уже содержат логику для расчетов и настраиваемые параметры. Такие индикаторы готовы к отображению на графиках после того, как вы сохраните и соберете их.
После того как вы нажмете Создать, откроется редактор кода, и вы сможете начать редактирование кода индикатора.
Отредактируйте код
В зависимости от выбранного способа создания, образец кода индикатора должен содержать один или несколько из следующих элементов:
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 27 28 | |
Атрибут Indicator вместе с его необязательными свойствами, такими как TimeZone и AccessRights, предшествует объявлению класса индикатора (SimpleIndicator).
Эти методы включены в каждый индикатор по умолчанию:
- Метод
Initialize()вызывается один раз при запуске вашего индикатора. Обычно он используется для настройки переменных, вложенных индикаторов и серий, которые должны быть готовы с самого начала. - Метод
Calculate()вызывается автоматически на каждом историческом баре и в режиме реального времени на каждом новом тике. Здесь вы реализуете формулу индикатора и определяете, как рассчитываются и отображаются результаты.
Атрибут [Output()] указывает значения, которые производит ваш индикатор, и то, как они отображаются на графике. Вы можете настроить имя и стиль каждого результата, например, задав цвет его линии.
Методы Initialize() и Calculate() составляют основу каждого пользовательского индикатора и никогда не должны быть опущены. Вы можете добавлять свои собственные методы для расширения функциональности, точно так же, как при написании кода сиБота. Чтобы узнать больше об алгоритмах, начните с руководства Основы C# и изучите примеры кода индикаторов.
Примечание
Справочники включают все классы, события, методы, переменные и т. д. для создания алгоритмов в cTrader, а полные примеры алгоритмов и шаблоны доступны в репозитории GitHub.
Примените полученные знания для редактирования кода индикатора и адаптации его к вашим потребностям.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Класс SimpleIndicator определяет пользовательский индикатор в Python.
Эти методы включены в каждый индикатор по умолчанию:
- Метод
initialize(self)вызывается один раз при запуске вашего индикатора. Обычно он используется для инициализации переменных, вложенных индикаторов и серий, которые должны быть готовы с самого начала. - Метод
calculate(self, index)вызывается автоматически на каждом историческом баре и в режиме реального времени на каждом новом тике. Здесь вы реализуете формулу индикатора и определяете, как рассчитываются и отображаются результаты.
Методы initialize(self) и calculate(self, index) составляют основу каждого пользовательского индикатора и никогда не должны быть опущены. Вы также можете добавить свои собственные вспомогательные методы внутри класса для расширения функциональности, точно так же, как при написании кода сиБота. Чтобы узнать больше об алгоритмах, начните с Основ Python и изучите примеры кода индикаторов.
Примените полученные знания для редактирования кода индикатора и адаптации его к вашим потребностям.
Сохраните и соберите
Сохраните свой код, нажав кнопку Сохранить в верхней части редактора кода, или используйте сочетание клавиш Ctrl+S.
Прежде чем вы сможете использовать свой индикатор, необходимо проверить его код, выполнив сборку проекта индикатора. Нажмите кнопку Собрать в верхней части редактора кода или нажмите Ctrl+B.
Сохраните свой код, нажав значок Сохранить в верхней части редактора кода, или используйте сочетание клавиш Cmd+S.
Прежде чем вы сможете использовать свой индикатор, необходимо проверить его код, выполнив сборку проекта индикатора. Нажмите значок Собрать в верхней части редактора кода или нажмите Cmd+B.
Когда сборка завершается успешно, вы видите подтверждающее сообщение в Результате сборки. Если сборка не удалась, вместо этого появляется сводка всех обнаруженных ошибок.
Если в коде есть изменения с момента последней сборки, рядом со значком Собрать появляется звездочка. В этом случае следует выполнить сборку индикатора снова, прежде чем добавлять его экземпляр на какой-либо график.
Чтобы использовать или отобразить индикатор на графике, добавьте экземпляр индикатора, или вы можете продолжить изменение кода индикатора, как описано в разделах.
Использование арифметики NaN
Индикаторы выполняют вычисления для вывода определенных визуальных элементов, и важно, чтобы ваш код правильно обрабатывал граничные случаи и граничные условия во время этих вычислений.
Рассмотрим следующий фрагмент из индикатора, который выводит детрендированный ценовой осциллятор:
1 2 3 4 5 6 7 8 9 10 11 | |
Приведенный выше код определяет общие правила вычислений, но опускает граничные условия. Например, если Periods установлен на 10, а index находится в диапазоне 0–9, вычисление вернет NaN (Not a Number). Эта проблема возникает из-за того, что индикатор не может вычислить значения для столбчатого графика с отрицательным индексом.
Чтобы решить эту проблему, вы можете добавить условие, как показано ниже:
1 2 3 4 5 6 7 | |
Код самой простой скользящей средней также должен проверять, что index >= Periods. Если вы используете вложенный индикатор, например другой тип скользящей средней, условие будет отличаться с учетом дополнительных вычислений.
Хотя вы можете определить явные граничные условия, C# предлагает удобный способ избежать этих проблем с помощью арифметики NaN. В частности, тип данных double полностью поддерживает вычисления NaN. Например:
1 2 3 4 5 | |
Однако, когда любой операнд в вычислении является NaN, результат также будет NaN. Поскольку пользовательские индикаторы cTrader работают с типом DataSeries, если вы попытаетесь получить доступ к элементу DataSeries с отрицательным индексом, он вернет NaN, и значение не будет отображено на торговом графике. Такое поведение позволяет индикатору продолжать работу без выброса исключений. В большинстве случаев вы можете спокойно игнорировать граничные условия и сосредоточиться только на общей логике вычислений.
Добавление явных проверок
Хотя арифметика NaN упрощает обработку граничных условий, некоторые случаи все же требуют явных проверок NaN. Рекурсивные индикаторы являются распространенным примером. Рекурсивный индикатор вычисляет свое текущее значение на основе ранее вычисленного значения.
Рассмотрим следующую реализацию экспоненциальной скользящей средней:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Когда индикатор вычисляет первый период, начальное значение должно быть явно установлено в тип, отличный от NaN. В противном случае все последующие вычисления будут возвращать NaN, что сделает индикатор бесполезным.
В приведенном выше коде это обрабатывается методом double.IsNaN(previousValue). Оператор == не может использоваться для этой проверки (previousValue == double.NaN), поскольку любое сравнение NaN с другим значением, включая само себя, всегда возвращает false.
Когда вы будете удовлетворены кодом индикатора, соберите его, а затем используйте, добавив экземпляр на график.
Связанные статьи
