Этот индикатор «Arrow» предназначен для отображения на графике сигналов покупки и продажи в виде стрелок. Он написан для MetaTrader 4 (MQL4) и оптимизирован под таймфрейм M5, но может использоваться и на других периодах. Основная идея — адаптивный расчёт индикатора Williams Percent Range (WPR) с динамически изменяемым периодом в зависимости от рыночной волатильности, а затем фильтрация сигналов с помощью условий «будущего пересечения», трендовых фильтров и защиты от ложных срабатываний.
Общая логика работы
Индикатор выполняет два последовательных прохода по историческим барам:
Первый проход – вычисление нормализованного значения WPR (называемого normWPR) для каждого бара. При этом период WPR не фиксирован, а меняется в зависимости от двух заранее определённых условий (CondA и CondB), которые оценивают силу движения цены относительно ATR.
Второй проход – непосредственно генерация сигналов на продажу (Sell) и покупку (Buy) на основе уровней normWPR, проверки будущего выхода из зоны, трендовых фильтров (ADX + EMA), опционального мультитаймфреймового подтверждения и ограничения частоты сигналов.
Входные параметры и их влияние
Основные настройки:
MaxBars = 500 – максимальное количество баров для расчёта (ограничивает нагрузку).
BasePeriod = 0 – сдвиг уровней перекупленности/перепроданности.
Итоговые уровни:
levelLow = 35 - BasePeriod, levelHigh = 65 + BasePeriod.
При 0 получаем классические 35 (низ) и 65 (верх). Отрицательный BasePeriod сужает диапазон, положительный – расширяет.
ATRPeriod = 14 – период индикатора ATR (средний истинный диапазон) для оценки волатильности.
Условия адаптации периода WPR
CondAMultiplier = 1.8 – множитель ATR для условия A. Условие A считается выполненным, если на интервале от текущего бара до CondALookback (включительно) модуль разницы между ценой открытия текущего бара и закрытия следующего бара >= CondAMultiplier * ATR.
CondBMultiplier = 3.5 – множитель ATR для условия B.
Условие B выполняется, если на интервале до CondBLookback модуль разницы между ценой закрытия через 3 бара и ценой закрытия текущего бара >= CondBMultiplier * ATR.
CondALookback = 5, CondBLookback = 4 – окна поиска этих условий.
WPRDefault = 14 – базовый период WPR.
WPRCondAWeight = -3 – изменение периода при условии A (уменьшает на 3).
WPRCondBWeight = -2 – изменение периода при условии B (уменьшает на 2).
MinWPRPeriod = 4, MaxWPRPeriod = 20 – ограничения на итоговый период WPR.
Смысл:
Если рынок проявляет сильные движения (CondA или CondB), индикатор уменьшает период WPR, делая его более чувствительным к текущим изменениям. При отсутствии условий период остаётся базовым (14). Это позволяет адаптироваться к волатильности: на спокойном рынке WPR сглажен, на активном – реагирует быстрее.
Фильтр тренда
UseTrendFilter = true – включает/выключает фильтр.
ADXPeriod = 14, ADXThreshold = 18.0 – индикатор ADX. Сигнал разрешается только если ADX > 18 (тренд достаточно сильный).
MAPeriod = 50, MAType = 1 (EMA) – скользящая средняя для определения направления тренда:
Тренд вниз (trendDown), если Close[i] < EMA[i]
Тренд вверх (trendUp), если Close[i] > EMA[i]
Условие «будущего пересечения»
MaxFutureBars = 12 – горизонт поиска (на сколько баров вперёд смотреть).
FutureExitStrength = 3.0 – запас прочности при выходе из зоны.
Логика:
Сигнал генерируется не в момент попадания WPR в зону перекупленности/перепроданности, а когда ожидается, что в ближайшем будущем (не более чем через MaxFutureBars) значение normWPR выйдет за противоположную границу с запасом. При этом все промежуточные бары должны оставаться внутри диапазона [levelLow, levelHigh]. Это отсекает ложные сигналы, когда цена просто «коснулась» зоны и сразу вернулась.
Уровни установки стрелок
StopATRMult = 1.5 – множитель ATR для отступа стрелки от экстремума.
StopLookback = 3 – количество баров для поиска локального минимума/максимума.
Цена стрелки:
Для SELL: Low[lowestIdx] - StopATRMult * ATR (стрелка рисуется ниже минимума)
Для BUY: High[highestIdx] + StopATRMult * ATR (стрелка выше максимума)
Мультитаймфреймовое подтверждение (отключено по умолчанию)
UseMTFConfirm = false – если включить, то сигнал должен совпадать с трендом на старшем таймфрейме (HigherTimeframe = 30 минут).
MTF_EMAPeriod = 50, MTF_ADXPeriod = 14, MTF_ADXThreshold = 18.0 – параметры ADX и EMA для старшего ТФ.
Защита от частых сигналов
MinBarsBetweenSignals = 1 – минимальное количество баров между однотипными сигналами. Значение 1 означает, что сигнал может быть на каждом баре (кроме подряд идущих на одном и том же индексе).
4. Отображение
Стрелки рисуются непосредственно на ценовом графике (окно чарта).
Устаревшие стрелки скрываются с помощью функции SetIndexDrawBegin.
Резюме
Индикатор сочетает:
- Адаптивный WPR с переменным периодом (реагирует на всплески волатильности);
- Идею «ожидания выхода из зоны» для отсечения ложных сигналов;
- Трендовые фильтры (ADX + EMA) с возможностью отключения;
- Опциональное подтверждение со старшего таймфрейма;
- Защиту от частых сигналов (почти отключённую – MinBarsBetweenSignals=1).
Он может давать частые сигналы на M5. Однако из-за адаптивного WPR и поиска будущего пересечения он склонен задерживать сигналы до тех пор, пока не возникнет уверенность, что цена действительно покинет экстремальную зону. Это увеличивает надёжность, но может снижать оперативность входа.