Создание индикатора внутри OsEngine.

Создание индикатора внутри OsEngine.

Рассмотрим пример создания простого индикатора. Его суть будет заключаться в вычислении и отображении середины последнего закрытого торгового дня в виде серии точек.

Для удобства создадим папку для пользовательских индикаторов, после чего в ней создадим класс LastDayMiddle.

Рис. 1. Создание нового индикатора.

Созданному классу в качестве базового зададим класс Aindicator и при помощи студии имплементируем его:

 Рис. 2. Имплементация абстрактного класса.

Для того, чтобы OsEngine смог подгружать наш индикатор, необходимо добавить атрибут класса IndicatorAttribute и передать ему имя индикатора. После проделанных действий у вас должна получиться следующая заготовка:

 Рис. 3. Заготовка под индикатор.

Метод OnStateChange вызывается единожды после создания объекта. В нем можно выполнить создание необходимых серий данных и параметров. Наш индикатор будет содержать одну серию данных. Давайте добавим приватное поле типа IndicatorDataSeries и дадим ему название _series. Далее инициализируем его, вызвав метод базового класса CreateSeries. 

В данный метод необходимо передать следующие параметры:

  1. name – уникальное в рамках индикатора имя для серии. Оно будет отображаться в окне настроек, с которым мы познакомимся позже;
  2. color – цвет серии данных, в который она будет окрашена на графике;
  3. chartPaintType – способ отображения серии на графике. Линия, столбчатая диаграмма или серия точек;
  4. isPaint - флаг указывает, нужно ли отображать данный индикатор на графике;

Метод OnProcess вызывается программой каждый раз, когда обновляется источник данных. Соответственно в нем должна выполняться вся логика расчета значений индикатора. В качестве аргументов в метод передается серия свечей и индекс обрабатываемой в текущий момент свечи. 

Важное отступление.

Здесь очень важно усвоить одну деталь. Если вам нужно получить свечу по какому-то индексу, ВСЕГДА используйте для этого значение параметра index. Закрепим эту информацию на визуальном примере. Так делать можно и нужно:

 Рис. 4. Правильный способ обращения к коллекциям.

А вот так делать нельзя:

Рис. 5. Нерабочий способ обращения к коллекциям.

То же самое касается и обращения к своим сериям данных и сериям внутренних индикаторов.

Реализация логики вычисления значений индикатора.

Продолжим писать наш индикатор. Хоть мы и считаем среднюю цену последнего закрытого дня, это значение должно отображаться в качестве последних значений индикатора. Другими словами, если из робота обратиться к последнему значению индикатора, мы должны получить расчетное значение середины прошлого дня. Прежде чем перейти к логике расчета, рассмотрим переменные, которые нам понадобятся для вычислений:

  1. Хранит достигнутый максимум текущего дня.
  2. Хранит достигнутый минимум текущего дня.
  3. Хранит значение середины прошлого закрытого дня.
  4. Время последней обработанной свечи.

Переходим к логике:

  1. Если индекс обрабатываемой свечи меньше двух, мы выходим из метода.
  2. Сохраняем ссылки на последнюю и предпоследнюю обрабатываемые свечи.
  3. Сравниваем время открытия последней свечи с временем последней обработанной свечи, если оно меньше, это говорит о том, что запустился процесс перерасчета индикатора. Нужно сбросить значения глобальных переменных. Для этого _dayMid задаем ноль и вызываем метод SetDefoltHighLow.
  4. Сравниваем дни последней и предпоследней свечей. Если они отличаются, это говорит о том, что начался новый день, и нам нужно установить новое значение для середины прошлого дня. Для этого мы складываем максимум и минимум предыдущего дня и делим пополам, затем вызываем метод SetDefoltHighLow.
  5. Сохраняем новый максимум текущего дня, если он обновился.
  6. Сохраняем новый минимум текущего дня, если он обновился.
  7. Устанавливаем середину прошлого дня в качестве последнего значения серии данных индикатора. Обратите внимание, что для обращения к последнему значению используется все тот же передаваемый в метод индекс.
  8. Обновляем время обработки последней свечи.
  9. Метод SetDefoltHighLow устанавливает нужные нам значения для переменных _high и _low. Минимальное значение типа decimal для максимума и максимальное значение типа decimal для минимума. Это нужно для того, чтобы первая свеча в рамках нового дня могла установить переменным свои хай и лой соответственно.

В метод OnStateChange также добавим вызов метода SetDefoltHighLow:

На этом процесс создания индикатора закончен, не нужно больше предпринимать никаких действий для того, чтобы терминал смог использовать наш индикатор.

Добавление индикатора на график.

Для того, чтобы добавить индикатор на график, нужно на области графика правой кнопкой мыши вызвать контекстное меню:

Рис. 6. Добавление индикатора на график.

Откроется новое окно, в котором нужно выполнить следующие действия:


Рис. 7. Окно создания индикатора.

  1. Перейти во вкладку «Скрипты».
  2. Найти и выбрать наш индикатор.
  3. Выбрать область «Prime».
  4. Нажать кнопку «Принять».

Откроется новое окно, в котором содержатся все настройки индикатора. Если перейдем во вкладку «Визуал», увидим настройки единственной серии данных, которую создавали в коде. Здесь можно настроить цвет серии, тип отображения и видимость индикатора. С другими вкладками мы познакомимся в последующих статьях, сейчас же они будут пустыми.


 Рис. 8. Окно настроек индикатора.

Нажав кнопку «Принять», мы наконец-то увидим наш индикатор на графике:

Рис. 9. Отображение индикатора на графике.

Синим цветом отображается наш индикатор, красным - наброски линий для сравнения.

  1. Максимум за день.
  2. Минимум за день.
  3. Визуально отличимая середина.
  4. Линия индикатора, отражающая середину прошлого дня.

Код данного индикатора можно скачать по ссылке.

13:51
480
FAQ

Комментарии

Нет комментариев. Ваш будет первым!