Эта статья объясняет как можно создать библиотеку технических индикаторов для программы Wealth-Lab.
Такая библиотека содержит скомпилированные индикаторы, которые интегрированы в программу Wealth-Lab и ведут себя точно также, как и индикаторы, которые поставляются вместе с программой.
Созданные индикаторы появляются в собственной папке в списке индикаторов прямо в программе Wealth-Lab. Вы сможете схватить мышкой и перетащить любой из индикаторов, которые находятся в данной папке, прямо на график.
Также Вы без проблем сможете использовать эти индикаторы в мастере стратегий.
Оригинал статьи находится на блоге «Финансовая лаборатория». Здесь дам краткий анонс этой статьи:
Что такое библиотека индикаторов
В программе Wealth-Lab каждый отдельный индикатор реализован как класс, который наследуется от базового класса DataSeries.
Класс DataSeries представляет собой массив, в каждой ячейке которого содержится число типа double (числа с цифрами после запятой), каждая ячейка данного массива связана с массивом, содержащим дату и время.
Конструктор класса
Ряд данных DataSeries может быть создан с помощью одного из двух конструкторов.
Если Вы строите индикатор, который будет использовать только единичный ряд данных (к примеру, для расчета скользящей средней), выбирайте конструктор, который использует в качестве параметра переменную типа DataSeries.
Пример конструктора, который использует переменную типа DataSeries:
public SMA(DataSeries ds, int period, string description)
: base(ds, description)
Если для расчета Вашего индикатора потребуется информация о ценах OHLC либо об объемах (например Вы собираетесь строить индикатор типа Стохастика), либо любую другую комбинацию, используйте конструктор, в качестве параметра в котором используется переменная типа Bars.
Пример конструктора, который использует переменную типа Bars:
public StochD(Bars bars, int period, int smooth, string description)
: base(bars, description)
Рассчитываем значения индикатора
Значения индикатору нужно присвоить прямо в конструкторе. Первоначально каждая ячейка в ряде данных, содержащем значения индикатора заполняется нулями. Используйте свойство Count для того чтобы определить — сколько значений индикатора нужно рассчитать и сколько значений нужно присвоить.
Используйте индексный метода доступа (this[]) для того, чтобы присвоить значения каждой ячейке индикатора как только эти значения будут рассчитаны. Для доступа к конкретному значению ряда данных, который является источником, используйте номер конкретного бара, заключив его в квадратные скобки ([]).
Для доступа к полям класса Bars, используйте его свойства Open, High, Low, Close и Value. Эти поля сами являются объектами типа DataSeries (ряды данных).
Приведенный код является примером того, как рассчитывается индикатор простой скользящей средней (SMA).
Код примера на C# (кликните чтобы посмотреть)
Контроль первого бара, отображаемого на графике
Вы можете спрятать первоначальные значения Вашего индикатора. Для того, чтобы достичь этого, присвойте свойству FirstValidValue значение номера первого бара, который должен быть отображен на графике.
Статический метод Series ()
Статичный метод Series это именно тот метод, код которого будет выполняться программой Wealth-Lab для создания конкретного экземляра класса индикатора.
Этот код будет выполнятся и тогда, когда Вы бросаете индикатор на график цены с помощью мышки. Метод Series имеет точно такие же параметры, что и конструктор класса индикатора, за исключением параметра «description».
Внутри метода Series создается экземпляр Вашего индикатора, при этом используется служебное слово «new», сразу после этого Вы сразу получаете доступ к данному экземпляру.
Выполните следующие шаги, создавая статичный метод Series:
1. Создайте текстовое описание индикатора, используя при этом текстовый параметр конструктора «description».
2. Посмотрите — не существует ли уже индикатор с точно таким же описанием в памяти компьютера (в кэше) — об этом будет упомянуто чуть позже.
3. Если в кэше уже есть индикатор с соответствующим описанием, то нужно возвратить экземпляр закешированного индикатора.
4. Если же такой индикатор еще не рассчитывался и отсутствует в кэше, то
• нужно создать экземпляр индикатора, использовав при этом оператор «new» а также все параметры (включая описание), которые упоминались ранее в пункте 1.
• сохраняем экземпляр индикатора в кэш (как это сделать — смотрите ниже).
• возвращаем ссылку на экземпляр индикатора.
Ниже приведен код примера для метода Series, который рассчитывает индикатор простой скользящей средней (SMA).
Код примера на C# (кликните чтобы посмотреть)
Создание уникального описания индикатора
Первым шагом при реализации статического метода для создания индикатора является создание текстового описания («Description»), которое уникальным образом идентифицирует этот индикатор.
Это описание формируется из названия индикатора («name»), сразу за которым следуют параметры индикатора (конечно, если такие существуют), заключенные в круглые скобки. Между параметрами индикатора должны стоять запятые.
Обратите внимание на то, что при создании описания индикатора также используется свойство «Description» того ряда данных (DataSeries), который является параметром для нашего индикатора. Именно это обеспечивает уникальность текстового описания нашего индикатора.
К примеру, если индикатор использует для своего построения цену закрытия и период 20, то свойство «description» нашего индикатора будет выглядеть так:
SMA(Close,20)
Извлечение существующего экземпляра индикатора из кэша
У объектов класса DataSeries (ряды данных) и Bars (совокупность свечей) есть свойство, которое называется «Cache». Это свойство является «справочником». Несмотря на то, что работа с кэшем не является обязательной, Вы обязательно должны понять и применять в программировании механизм кеширования. Это нужно сделать для того, чтобы исключить создание множества совершенно одинаковых копий Вашего индикатора с аналогичными параметрами.
Метод Series() четко определяет уже созданный и находящуийся в кэше индикатор. Это достигается благодаря использованию метода ContainsKey() объекта типа Dictonary.
Текстовое описание индикатора всегда является ключом, т.е. уникальной записью точно идентифицирующей данный индикатор с данными параметрами.
Если в кеше уже есть соответствующий индикатор, то метод Series() вынимает этот индикатор из кеша и затем забрасывает его назад к индикаторам соответствующего типа. Кэш хранит все индикаторы как объекты типа DataSeries, поэтому Вам нужно перед возвращением объекта в кэш привести его к нужному типу данных.
Создание нового экземпляра индикатора
Если индикатор не найден в кэше, то метод Series() создает экземпляр данного индикатора используя при это конструктор. Для вызова конструктора используется оператор new.
Ваш индикатор должен иметь публичный конструктор, который использует точно такие же параметры, что и метод Series(), но дополнительно в конструкторе должен быть еще один параметр типа string который представляет собой описание, которое обязательно должно присутствовать в индикаторе. Использование описания индикатора в конструкторе в качестве дополнительного параметра преследует две цели:
1. Обеспечивается использование аналогичных текстовых строк как в кэше, так и в свойстве «Description» создаваемого индикатора.
2. Наличие такого параметра делает возможным использование оператора new для создание экземпляра класса создаваемого индикатора и предоставляют созданным таким образом экземплярам собственное описание. Здесь следует заметить, что индикаторы, созданные с помощью оператора new не участвуют в механизме кеширования.
Как только метод Series() создает экземпляр индикатора, он сразу же помещает этот экземпляр в кэш и отдает экземпляр данного индикатора в точку вызова метода.
Создание класса IndicatorHelper
Для того, чтобы иметь возможность использовать созданный Вами индикатор непосредственно в программе Wealth-Lab, Вам необходимо создать специальный класс Helper, который описывает созданный Вами индикатор.
Класс Helper является объектом, который наследуется от базового класса IndicatorHelper, описание которого Вы найдете чуть ниже. Вы можете создать класс Helper в том же самом пространстве имен, где Вы создаете и основной класс индикатора.
Свойства базового класса IndicatorHelper:
Все свойства базового класса IndicatorHelper можно посмотреть
перейдя по ссылке к оригинальной статье.
Разработка статического метода Value()
Разработка такого метода является не обязательной. Вы можете это сделать по желанию. Многие индикаторы позволяют работать с методом Value(). Этот статический метод Value() позволяет классу Вашего индикатора просчитать и возвратить в точку вызова метода Value() значение «на лету» для определенного номера бара. При этом не происходит создания нового экземпляра индикатора.
Этот способ расчета соответствует режиму простой калькуляции, который применялся в предыдущей версии Wealth-Lab.
Если Вы примете решение поддержать это соглашение, то создавайте этот метод таким образом, чтобы он использовал точно такие же параметры, что и конструктор класса Вашего индикатора плюс еще один дополнительный параметр, который указывает номер соответствующего бара, для которого нужно просчитать значение индикатора.
Ниже приведен пример создания статического метода для индикатора, рассчитывающего простую скользящую среднюю.
Код примера на C# (кликните чтобы посмотреть)
Использование индикаторов в коде WealthScript
Торговая система использует индикаторы в основном с использованием статического метода Series().
Пример:
Код примера на C# (кликните чтобы посмотреть)
Опытные пользователи могут использовать оператор new для создания экземпляра класса с помощью конструктора, попутно создавая и описание индикатора указывая его как параметр конструктора.
Пример:
Код примера на C# (кликните чтобы посмотреть)
Создание собственного логотипа для библиотеки индикаторов
В программе Wealth-Lab созданная Вами библиотека индикаторов отображается как новая на панели со списком индикаторов.
Индикаторы в Вашей библиотеке отображаются внизу папки, содержащей индикаторы после щелчка мышью по этой папке. По умолчанию, программа Wealth-Lab отображает папку, содержащую индикаторы с помощью стандартной иконки открытия/закрытия папки.
Вы можете поменять этот рисунок, использующийся для отображения папки на свой собственный рисунок.
Для осуществления такой задумки — добавьте изображение в сборку Вашей библиотеки индикаторов.
Убедитесь, что в Visual Studio свойств данного рисунка «Действие при построении» имеет значение «Внедренный ресурс».
Обратите внимание также на то, что:
• название рисунка должно быть «glyph.bmp»
• размер рисунка должен быть 16x16 pixels
• в качестве заднего фона нужно использовать цвет «Fuchsia».
Пример создания индикатора простой скользящей средней
Представленный
в качестве примера код содержит полную реализацию класса индикатора простой скользящей средней (SMA) и ассоциированным с ним класса Helper.