ZigZag, ZZ
Основная идея стратегии - словить как можно раньше сильное трендовое движение рынка и удерживать позицию на протяжении тренда. Сделка открывается в момент пробоя заранее построенных уровней по прошлым максимумам/минимумам цен.
В основе лежит логика, похожая на индикатор ZigZag:
● Когда рынок начинает разворачиваться вверх, фиксируется локальный минимум
● Когда разворачивается вниз — локальный максимум
Эти точки становятся ориентирами. Из них формируются уровни, которые рынок должен пробить, чтобы подтвердить движение.
Реверсивная (flip long ↔ short)
Позиция всегда открыта и переворачивается из short в long. (Если не используются модификаторы стратегии - они описаны ниже в блоке «Параметры и модификаторы»)
⚠️ Стратегия генерирует убыточные сделки когда рынок в боковике и во время V-образных разворотов.
Рабочий тип ордера: Рыночный Стоп ордер (На некоторых биржах может еще называться как Условный или Триггерный)
● Зеленым цветом обозначено где устанавливается условный ордер на покупку. Пробой последнего значимого максимума.
● Красным на продажу. Цена пробивает последний минимум.
После запуска стратегии если нет позиции и цена находится между уровней то будут установлены 1 ордер на открытие long позиции и 1 на short. Если цена не между уровней или есть открытая позиция то будет установлен 1 ордер.
Если открыта позиция то по стратегии должен быть только 1 ордер. По умолчанию размер этого ордера будет = размер позиции * 2. Чтобы перевернуть позицию (закрыть и открыть новую на такой же размер)
Strategy Trend Zig Zag и ZZ - в чем разница
Strategy Trend Zig Zag (zigzag, выбрана по умолчанию при создании бота) - простой вариант с минимумом настроек, аналог скрипта «Простая трендовая стратегия» в TradingView.
Уровни строятся так же, как в ZZ2, позиция переворачивается стоп-ордерами. Модификаторы и фильтры из блока «Параметры и модификаторы» в нем не используются.
length- глубина поиска разворота (по умолчанию 5)detection- длина сглаживающей EMA (по умолчанию 3)
ZZ (zz) - полная версия: два типа уровней (ZZ2 и ZZ6) и все модификаторы, фильтры и настройки размера позиции, описанные ниже.
Типы уровней: ZZ2 и ZZ6
ZZ2 (по умолчанию) - уровни строятся по точкам разворота сглаженной цены. Подробно алгоритм разобран в блоке «Для любознательных».
depth - глубина поиска разворота (по умолчанию 5)
detection, detection_type, detection_source - длина, тип (по умолчанию EMA) и источник цены сглаживающей линии, по развороту которой определяются точки
rsi_len, rsi_value - дополнительное условие по RSI для точки разворота. При rsi_value = 0 не используется
ZZ6 - уровни строятся по двум каналам максимумов/минимумов: быстрому длиной zz6_len и медленному длиной zz6_len_slow (если не задана - zz6_len * 3).
Уровень фиксируется, когда быстрый и медленный канал совпали (цена обновила экстремум) и быстрый канал начал разворачиваться.
В ZZ6 размер позиции зависит от риска: чем шире расстояние между уровнями (а значит дальше стоп), тем меньше лот.
zz6_risklong,zz6_riskshort- риск в % на сделку. Лот = базовый лот * (риск % / расстояние между уровнями в %)zz6_risk_one- использовать для short тот же риск, что и для long (zz6_risklong)zz6_risk_max- ограничение сверху для этого множителя лота
Параметры и модификаторы
Режим работы
reverse- обратный (контртрендовый) режим. При пробое верхнего уровня бот открывает short, при пробое нижнего - long. Ордера в этом режиме рыночныеalways_in_position- если позиции нет, а цена уже ушла за уровень (например после закрытия по стопу или тейку), бот сразу входит рыночным ордером по направлению пробояone_entry_long,one_entry_short- один вход на каждый новый уровень. Если позиция по уровню уже закрылась (например по тейку или стопу), повторно на этом же уровне бот не входитsingle_entry- усиливает предыдущую опцию: запрет повторного входа снимается не новым уровнем, а только после входа в противоположную сторону
Настройка уровней
level_offset_long,level_offset_short- сдвиг уровня на фиксированную величину в ценеlevel_multiplier_long,level_multiplier_short- сдвиг уровня в процентах. 1 - без сдвига, 1.01 - на 1% вышеangle_long,angle_short- наклон уровня. Уровень умножается на это значение на каждой новой свече и постепенно смещается к цене. 1 - горизонтальный уровень
Фильтры входа
Когда фильтр запрещает вход, бот не открывает новую позицию, но ордер на закрытие текущей позиции по противоположному уровню остается.
use_distance_filter,distance_filter- не входить, если расстояние между уровнями больше заданного % (слишком далекий стоп)use_flat_filter,flat_filter- не входить, если расстояние между уровнями меньше заданного % (признак боковика)use_narrowing- торговать только когда уровни сужаются: последний максимум ниже предыдущего, а последний минимум выше предыдущегоuse_ma_filter,ma_filter- не переворачиваться, если быстрая MA уже ушла от медленной дальше чем на заданный % против нового направленияuse_ma_distance_filter,ma_distance_filter- не входить, если быстрая и медленная MA ближе друг к другу чем заданный % (нет импульса)ma_fast_*,ma_slow_*- тип, длина и источник быстрой и медленной MA для двух фильтров вышеfilter_only_open- фильтры по расстоянию действуют только на открытие позиции, переворот из уже открытой позиции разрешен- Трендовый фильтр (блок
filter, общий для ZZ и HiDeep) - см. раздел «Закрытие позиции и общие опции»
Размер позиции
use_auto_risk- авториск для ZZ2. Множитель лота плавно меняется отauto_risk_coeff_startдоauto_risk_coeff_endв зависимости от расстояния между уровнями: отauto_risk_procent_startдоauto_risk_procent_end%. Узкий канал - больше лот, широкий - меньшеcount_pnl_profit,count_pnl_loss- при перевороте добавлять к размеру новой позиции прибыль или убыток текущейsize_control- защита от задвоения: если позиция случайно стала больше двух входов, лишнее закрывается рыночным ордером
Закрытие позиции
use_tp_between_levels,tp_between_levels_value- закрыть позицию в прибыли, если цена вернулась внутрь канала между уровнями и прибыль не меньше заданного %stop_by_new_level- стоп по новому уровню. Если после входа цена пробила новый уровень в сторону позиции, а затем вернулась к нему - позиция закрываетсяclose_on_wrong_side- закрыть позицию, если цена ушла за противоположный уровень больше чем на 1% (например стоп-ордер не сработал из-за гэпа)use_close_on_levels_crossing- закрыть позицию, если уровни пересеклись (верхний стал ниже нижнего)from_level_price- считать тейк-профит и минимальную прибыль от цены уровня, а не от фактической цены входа
Бэктест
Протестировать во встроенном бэктестере
Скрипт (PineScript) для тестирования стратегии на исторических данных в тестере стратегий TradingView:
Рекомендации:
(не строгие и их можно нарушать в исследовательских целях)
Рабочий таймфрейм от 4ч и выше.
Для любознательных
Алгоритм построения уровней стратегии ZZ2. Используется не стандартный индикатор ЗигЗаг. Из кода видно как все просто и перерисовка исключена. Но уровни строятся с задержкой в несколько свечей (это абсолютно не мешает стратегии)
Используются три последовательно сглаженные EMA. Это создает сильное сглаживание, уменьшая шум.
Переменная z фиксирует точки разворота. Если EMA разворачивается вверх → берется локальный минимум (l). Если вниз → локальный максимум (h). Эти точки (l и h) становятся основой для построения уровней.
Стратегию можно проверить на исторических данных в тестере и запустить в hamster-bot.