Ярослав Суков – Структура против Хаоса: Трендовый индикатор ZigZag (страница 3)
1. Запустите классический (перерисовывающийся) ZigZag на исторических данных.
2. Найдите все случаи, когда он перерисовал вершину (удалил старый пик и поставил новый выше).
3. Проанализируйте, какие паттерны (объем, свечной анализ, FVG) предшествовали такому перерисовыванию.
Для читателя, который хочет прямо сейчас применить знания:
1. Определите свой горизонт:
- Если держите позицию от 2 часов до 2 дней: возьмите `Depth = ATR(14) * 0.618` на H1.
- Если держите позицию от 10 минут до 2 часов: возьмите `Depth = 12 пунктов` на M15 для EURUSD.2.
Выберите тип ZigZag:
- Для ручного входа с подтверждением от FVG: используйте классический (перерисовывающийся), но только для анализа завершенных сессий.
- Для советника/робота: используйте non-repainting с `backstep = 3`.3.
Проверьте чувствительность:
Если количество вершин за 100 баров > 15 — вы слишком мелки.
Если < 3 — вы слишком крупны.4.
Интеграция с FVG: Ищите Fair Value Gaps только на сегментах между противоположными вершинами ZigZag.
Если FVG находится внутри звена импульса — он имеет высокую вероятность закрытия.
Если FVG находится в зоне перерисовки (вершина индикатора смещается) — игнорируйте его как ложный.
Итоги: (Для коучей и инженеров)
| Понятие | Метафора | Итог |
| `Depth` (минимальное движение) | Крупность сита для просеивания муки | Определяет, что для вас «шум», а что «тренд» |
| Перерисовка | Индикатор-хамелеон, меняющий цвет прошлого | Если вы человек — учитесь на перерисовке. Если вы алгоритм — избегайте её через `backstep` |
| Non-repainting | Фотография, сделанная с задержкой | Цена детерминизма — отставание на несколько баров. Приемлемая цена |
ГЛАВА 3. Математика и алгоритм: Как рождается скелет рынка
До сих пор мы говорили о ZigZag как о магическом фильтре. Теперь мы засучим рукава и разберем его алгоритмическую плоть.
Если вы не программист — не бойтесь. Я проведу вас через формулы так, что вы почувствуете логику каждой цифры.
Если вы программист — вы получите готовый псевдокод для имплементации.
Центральная истина главы: ZigZag — это не просто линии. Это дискретизация времени по ценовому признаку. Он превращает непрерывный поток тиков в конечный набор значимых событий.
В математической статистике экстремум — это точка, в которой функция достигает максимума или минимума на заданном интервале. В мире цен (дискретный временной ряд) экстремум — это бар, чей High выше, чем у `k` соседей слева и `k` соседей справа, при условии ценового отступа.
Формальное определение (строгое)
Пусть `P_high[i]` — максимальная цена бара `i`. Бар `i` является локальным максимумом для параметра `K` (радиус поиска, обычно `K = 2` или `K = 3`), если:
P_high[i] >= P_high[i-1], P_high[i-2], ..., P_high[i-K]
И
P_high[i] >= P_high[i+1], P_high[i+2], ..., P_high[i+K]
Однако этого недостаточно для ZigZag. Мы добавляем условие значимости: разница между этим кандидатом и предыдущим зафиксированным экстремумом должна быть не меньше заданного порога `Depth`.
Алгоритм пошагово (упрощенная логика, не перерисовывающаяся версия)
Вход: Ценовой ряд bars[0..N-1], параметры:
- depth (минимальное изменение цены в абсолютных единицах или процентах)
- backstep (количество баров для подтверждения)
Выход: Массив вершин ZZ (каждая вершина: индекс бара, цена, тип (High/Low))
Инициализация:
last_extremum = bars[0] // первый бар как начальная точка
last_type = (bars[0].high - bars[0].low > 0 ? 'high' : 'low') // условно
Для i от 1 до N-1:
// Поиск кандидата на High
если last_type == 'low' (мы ищем следующий High):
ищем бар j в интервале [i, min(i+backstep, N-1)] с максимальным High
если найденный High - last_extremum.price >= depth:
добавляем вершину (High) в массив
last_extremum = (High, j)
last_type = 'high'
i = j + 1 // смещаемся после найденной вершины
иначе:
// продолжаем поиск, расширяя окно до тех пор, пока не накопится движение
// (реализуется через скользящий максимум)
// Симметрично для Low
Бар | High | Low | Примечание
1 | 100 | 99 | Начало
2 | 102 | 101 |
3 | 105 | 104 | Кандидат в High (локальный пик)
4 | 104 | 103 |
5 | 103 | 102 |
6 | 107 | 106 | Новый кандидат — он выше 3, значит 3 отбрасывается