Алгоритм – это описание действий и условий, выполняемых в Вашей программе. Разберем составление алгоритма на примере построения индикатора ATR (см. рис.246).
Рис. 246. Индиктор ATR.
В спраке TRANSAQ ищем информацию об этом индикаторе.
Индикатор ATR (Average True Range)
Формула:
ATR = EMA(TR, N)
EMA — экспоненциальная скользящая средняя
Формула выглядит следующим образом:
EMA = Рс * К + EMAв * (1 — К), где К = 2/n — 1, n — период усреднения, Рс — цена сегодня, EMAв — значение EMA вчера.
N — период индикатора
TR = max{H — L, H — C(-1), C(-1) — L}
С — закрытие периода,
L — минимальная цена периода
H — максимальная цена периода
———————————————————————————
ATR оценивает абсолютную волатильность бумаги в виде среднего диапазона движения цены за бар с учетом закрытия предыдущего бара. Чаще всего ATR используется для определения уровня, на котором выставляется стоп-лосс. Например, текущее значение ATR 20 рублей, а за последний месяц ATR достигал величины 30 рублей. Это значит, что в среднем бумага движется на 20 рублей, но есть вероятность резкого движения и на 30 рублей. Следовательно, 30 рублей можно использоваться как величину максимального движения против трейдера, после которого следует закрыть позицию.
Теперь составим алгоритм расчета значений индикатора для каждой свечи, а далее рассмотрим сам код листинга.
Алгоритм индикатора ATR.
- В языке прораммирования переменная это конструкция языка, хранящая числовое значение, которое может изменяться. Введем переменную периода усреднения. Назвем ее «period». Зададим ей значение period = 27. Тип данной переменной «extern», т.е. она будет отражаться в настройках индикатора.
- Введем новую переменную «tr» для расчет параметра TR для нашего индикатора. Рассчитаем TR = max{H — L, H — C(-1), C(-1) — L}, т.е. равен максимальному значению из трех параметров: разница между максимумом и минимумом следующей (правой) свечи, разница между максимумом следующей свечи и ценой закрытия первой (левой) свечи, разница между ценой закрытия первой свечи и минимумом следующей свечи. В переменную tr запишем масимальное из этих трех значений.
- После расчета параметра TR в функции INIT мы можем отрисовать первую линию нашего индикатора. Для этого присвоим нужное значение нужному значению массива значений линий: line[0][1] = tr. Эта запись означает, что мы помещаем значение переменной TR в первую точку первой лннии. Первая точка находится под первой свечкой.
- Основа любого индикатора — это функция calc(), которая содержит формулу для расчёта индикатора. Результат работы индикатора отображается на графике путём присвоения значений массиву line[]. Первая свеча это самая левая на графике, последняя самая правая. Функция CALC пробегает все свечи, отображенные в окне слева направо.
- В функции INIT мы должны будем указать число свечей для которых не вызывается функция CALC. Это делается с помощью функции setInitCandles(2), т.е. мы задаем 2 свечи.
- На практике индикаторов, использующих значения только текущей свечи, практически не существует. Почти все индикаторы рассчитываются с использованием как минимум некоторой истории, а часто – и с использованием предыдущих своих окончательных и промежуточных значений. Для ссылки на значение за границами текущей свечки к используемому параметру свечи (high, low, close, volume и т.д.) необходимо добавить его сдвиг относительно текущей свечи в квадратных скобках.
- В дополнение к calc() мы определим еще одну функцию init(). Эта функция, если она определена пользователем, вызывается один раз перед тем как TRANSAQ начнет вызывать calc() для каждой свечки. Она оказывается полезной для выполнения подготовительных действий перед расчетом индикатора, и в частности для определения свечек, для которых не нужно вызывать calc(). Все значения индикатора, которые не были явно заданы пользователем считаются равными нулю.
- Смысл используемой функции setInitCandles(2) прозрачен — она указывает на начальное количество свечек, для которых не надо рассчитывать индикатор с помощью функции calc(). Причины для использования этой функции могут быть различными — необходимость функции calc() некоторого количества истории, необходимость задать начальное значение по отличной от calc() формуле, и другие возможные причины, которые будут рассмотрены в последующих разделах. Надо заметить, что при ссылке на параметры свечей внутри функции init() предполагается, что мы вызываем ее для самой первой свечки. Выражение line[0] = close; подставит close первой свечки для графика. Так же как и с любыми параметрами свечей, в функции init() можно ссылаться не только на текущую свечу, но и на свечи с некоторым сдвигом относительно текущей. Здесь проявляется различие между функциями calc() и init(). Так как функция init() вызывается относительно самой первой свечи, сдвиг параметров относительно нее не может быть отрицательным — это приведет к обращению к недоступным данным.
- Функция calc будет вызвана в момент отрисовки текущей свечки. Значит нам надо в данной функции записать действия по отрисовке дальнейших кусочков линий нашего индикатора.
- В функции CALC снова рассчитываем значение переменной tr как максимум из трех значений. Теперь мы берем максимум и минимум для текущей для цикла calc свечи, а цену закрытия для предыдущей свечи, для чего зададим индекс смещения -1, т.е. close[-1].
- Зададим новую переменную alpha = 2 / (period + 1). Укажем ее тип var, т.е. обычная переменная.
- В массив точек линии 1 для текущей счечки которую сейчас обрабатывает функция calc ведем новое значение line[0] = alpha * tr + (1 — alpha) * line[0][-1]. line[0][-1] – это значение предыдущей точки нашей линии под предыдущей свечой.
Собственно, далее создаем код нашей программы.