Недавно нелёгкая заставила собирать индикатор Average True Range для робота. Тривиальная штука вроде. Ничего сложного. А затянулось всё на целый день.
Дело в том что найденные мной методы расчёта, в Российском сегменте интернета, сплошь строили Average True Range на Простой скользящей средней. Кухни особо не заморачивались с правдивостью описания, а просто скопипастили друг у друга неправильную формулу из MetaTrader. В то время как в Квик, Велс Лаб ATR рассчитывается по экспоненциальной средней, с хитрой формулой.
Это запись о том, как рассчитать индикатор Average True Range взаправду. Может кому-то пригодиться…
Average True Range — средний истинный диапазон. Мерило волатильности от Уэллса Уайлдера, которое он описал в книге ‘Новые концепции технических торговых систем’.
Расчёт индикатора состоит из двух фаз:
- Поиск значений истинного диапазона
- Сглаживание этих значений при помощи экспоненциальной средней.
Истинный диапазон рассчитывается на каждом шаге как максимум из следующих трёх значений:
- разница между текущим максимумом и текущим минимумом (High — Low);
- абсолютное значение разницы текущего максимума и предыдущего закрытия (High — Close-1);
- абсолютное значение разницы текущего минимума и предыдущего закрытия (Low — Close-1).
Суть этого этапа, найти разброс значений цены, учитывая возможный гэп, который мог образоваться при переходе к последней свече.
В си шарп, формирование массива значений истинного диапазона у меня получилось вот так:
decimal[] tR = new decimal[candles.Lenght];
for (int i = 1; i < candles.Lenght; i++)
{
tR[i] = Math.Max(candles[i].HighPrice, candles[i — 1].ClosePrice) —
Math.Min(candles[i].LowPrice, candles[i — 1].ClosePrice);
}
Далее, сглаживаем значения истинного диапазона экспоненциальной средней.
Формула:
EMA[k] = EMA[k-1] + (1/n) · (P[k] — EMA[k-1]),
где:
n — период средней
k — текущий индекс ряда
EMA[k] — экспоненциальное скользящее среднее на момент k
P —ряд, по которому считается средняя
Выделенное жирным курсивом (1/n) из этой формулы является не стандартным участком для экспоненциальной средней. Обычно это (2/(n-1)). И не спрашивайте, после какого раза меняя формулу я это обнаружил. Но в Квик и ВелсЛаб ATR рассчитывается именно так.
При этом первое значение EMA считается как обычное скользящее среднее.
В случае если n = 4, вот так:
EMA[k] = (P[k] + P[k-1] + P[k-2] + P[k-3])/ 4;
Всё.
а (2/(n*2)) это не то же самое что и 1/n?
действительно. Убрал лишние операции. Спасибо