Рассмотрим пример создания простого индикатора. Его суть будет заключаться в вычислении и отображении середины последнего закрытого торгового дня в виде серии точек.
Для удобства создадим папку для пользовательских индикаторов, после чего в ней создадим класс LastDayMiddle.
Рис. 1. Создание нового индикатора.
Созданному классу в качестве базового зададим класс Aindicator и при помощи студии имплементируем его:
Рис. 2. Имплементация абстрактного класса.
Для того, чтобы OsEngine смог подгружать наш индикатор, необходимо добавить атрибут класса IndicatorAttribute и передать ему имя индикатора. После проделанных действий у вас должна получиться следующая заготовка:
Рис. 3. Заготовка под индикатор.
Метод OnStateChange вызывается единожды после создания объекта. В нем можно выполнить создание необходимых серий данных и параметров. Наш индикатор будет содержать одну серию данных. Давайте добавим приватное поле типа IndicatorDataSeries и дадим ему название _series. Далее инициализируем его, вызвав метод базового класса CreateSeries.
В данный метод необходимо передать следующие параметры:
Метод OnProcess вызывается программой каждый раз, когда обновляется источник данных. Соответственно в нем должна выполняться вся логика расчета значений индикатора. В качестве аргументов в метод передается серия свечей и индекс обрабатываемой в текущий момент свечи.
Здесь очень важно усвоить одну деталь. Если вам нужно получить свечу по какому-то индексу, ВСЕГДА используйте для этого значение параметра index. Закрепим эту информацию на визуальном примере. Так делать можно и нужно:
Рис. 4. Правильный способ обращения к коллекциям.
А вот так делать нельзя:
Рис. 5. Нерабочий способ обращения к коллекциям.
То же самое касается и обращения к своим сериям данных и сериям внутренних индикаторов.
Продолжим писать наш индикатор. Хоть мы и считаем среднюю цену последнего закрытого дня, это значение должно отображаться в качестве последних значений индикатора. Другими словами, если из робота обратиться к последнему значению индикатора, мы должны получить расчетное значение середины прошлого дня. Прежде чем перейти к логике расчета, рассмотрим переменные, которые нам понадобятся для вычислений:
Переходим к логике:
В метод OnStateChange также добавим вызов метода SetDefoltHighLow:
На этом процесс создания индикатора закончен, не нужно больше предпринимать никаких действий для того, чтобы терминал смог использовать наш индикатор.
Для того, чтобы добавить индикатор на график, нужно на области графика правой кнопкой мыши вызвать контекстное меню:
Рис. 6. Добавление индикатора на график.
Откроется новое окно, в котором нужно выполнить следующие действия:
Рис. 7. Окно создания индикатора.
Откроется новое окно, в котором содержатся все настройки индикатора. Если перейдем во вкладку «Визуал», увидим настройки единственной серии данных, которую создавали в коде. Здесь можно настроить цвет серии, тип отображения и видимость индикатора. С другими вкладками мы познакомимся в последующих статьях, сейчас же они будут пустыми.
Рис. 8. Окно настроек индикатора.
Нажав кнопку «Принять», мы наконец-то увидим наш индикатор на графике:
Рис. 9. Отображение индикатора на графике.
Синим цветом отображается наш индикатор, красным - наброски линий для сравнения.
Код данного индикатора можно скачать по ссылке.
Комментарии