Свечи: простой индикатор волатильности для Forex
Расстояние от максимума до минимума — самая честная оценка волатильности из доступных на графике. Ей не нужны параметры, и она ничего не скрывает. Именно поэтому разобраться стоит с неё, а не с ATR.
Волатильность — это не направление. Она показывает, какой путь цена проходит за единицу времени, а от этого зависит, насколько широким должен быть стоп, каким может быть объём и есть ли у стратегии вообще пространство для работы.
Сырой диапазон против ATR
Сырой диапазон свечи — это High - Low. Average True Range добавляет две вещи: усреднение по N барам и учёт гэпов через максимум из трёх расстояний — текущий диапазон, от прошлого закрытия до текущего максимума и от прошлого закрытия до текущего минимума.
На форексе поправка на гэпы значит куда меньше, чем на акциях: рынок торгуется непрерывно с вечера воскресенья до вечера пятницы. Единственное место, где она существенна, — выходные, и там существенна сильно.
| Сырой диапазон | ATR | |
|---|---|---|
| Параметры | Нет | Период (обычно 14) |
| Реакция на один бар | Мгновенная | Размыта усреднением |
| Учёт гэпов | Нет | Да |
| Для чего годится | Увидеть, что только что произошло | Объём и стопы |
Минимальный индикатор диапазона
Он рисует диапазон каждого бара гистограммой и раскрашивает её по тому, превышает ли бар недавнее среднее. В этом сравнении и есть вся ценность: абсолютное число пунктов без контекста ничего не значит.
// CandleRange.mq4 — диапазон бара в сравнении с собственным средним
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrSteelBlue
#property indicator_color2 clrIndianRed
input int AvgPeriod = 20;
double normal[], elevated[];
int OnInit()
{
SetIndexBuffer(0, normal); SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2);
SetIndexBuffer(1, elevated); SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 2);
IndicatorShortName("Range(" + IntegerToString(AvgPeriod) + ")");
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total, const int prev_calculated,
const datetime &time[], const double &open[],
const double &high[], const double &low[],
const double &close[], const long &tick_volume[],
const long &volume[], const int &spread[])
{
int start = MathMax(prev_calculated - 1, AvgPeriod);
for(int i = start; i < rates_total; i++)
{
int bar = rates_total - 1 - i; // индекс серии
double range = (high[i] - low[i]) / Point;
double sum = 0;
for(int k = 1; k <= AvgPeriod; k++)
sum += (high[i-k] - low[i-k]) / Point;
double avg = sum / AvgPeriod;
normal[bar] = (range <= avg) ? range : EMPTY_VALUE;
elevated[bar] = (range > avg) ? range : EMPTY_VALUE;
}
return(rates_total);
}
Нормировка, чтобы числа сравнивались
Сорок пунктов на USDJPY и сорок на EURCHF — разные вещи, как и сорок в августе против сорока в октябре. Разделите текущий диапазон на среднее, и получите безразмерное отношение, сравнимое между парами и периодами.
- Отношение ниже 0.7 — сжатие. Пробойные стратегии здесь режут на части, диапазонные работают хорошо.
- Около 1.0 — обычные условия, какими бы обычные ни были для инструмента.
- Выше 2.0 — что-то случилось. Обычно новости. Стопы, рассчитанные на нормальные условия, вот-вот потеряют смысл.
Расчёт объёма позиции
Стандартное применение — инверсия: рискуем фиксированной суммой, волатильность задаёт расстояние до стопа, а расстояние задаёт объём. Так сумма риска остаётся постоянной, пока рынок меняется под вами.
// объём из фиксированного риска и стопа по волатильности
double riskMoney = AccountBalance() * 0.01; // 1% от баланса
double atrPips = iATR(NULL, 0, 14, 1) / Point;
double stopPips = atrPips * 1.5; // стоп = 1.5 x ATR
double pipValue = MarketInfo(Symbol(), MODE_TICKVALUE);
double lots = riskMoney / (stopPips * pipValue);
lots = MathFloor(lots / MarketInfo(Symbol(), MODE_LOTSTEP))
* MarketInfo(Symbol(), MODE_LOTSTEP);
Обратите внимание на 1 последним аргументом iATR — это закрытый бар. С нулём читается формирующийся бар, диапазон которого растёт на глазах, и объём позиции начинает зависеть от того, в какую секунду вы нажали кнопку.
Структура сессий видна сразу
Постройте средний диапазон по часам суток, и форма рынка проявится сама: тихая азиатская сессия, расширение на открытии Лондона, максимальные диапазоны в перекрытии Лондона и Нью-Йорка, спад после.
Это самый дешёвый полезный фильтр в трейдинге. Пробойная система на азиатском диапазоне и пробойная система на открытии Лондона — не одна и та же система, даже если код идентичен.
Где заканчивается честность
Диапазон сообщает о том, что уже произошло. Прогностического содержания в нём нет: за сжатием рано или поздно следует расширение, но «рано или поздно» — это не сделка. Относитесь к нему как к измерительному прибору для расчёта объёма и фильтрации, а не как к генератору сигналов.