Идея коротко
Anthony Crudele, трейдер фьючерсов на индексы с двадцатилетним стажем, начинает любую сделку с вопроса о среде. Сред три: консолидация, тренд, возврат к среднему. Определяет он их по дневным полосам Боллинджера с периодом 20 и тремя стандартными отклонениями вместо привычных двух. Когда среда известна, он торгует в одну сторону. Две стороны разрешены только в консолидации.
Полосы сужаются: консолидация, выходы из диапазона чаще возвращаются. Полосы из плоских расходятся, и цена берёт максимум: тренд, только лонги (при расширении вниз только шорты). После тренда полосы сходятся: возврат к среднему, сделки против прошлого тренда с целью в середине полос.
Вариант B от Kieran Duff, который ведёт на CFD портфель из 20-30 автоматических стратегий: фильтр складывает метрики в балл и решает, какие сигналы пропускать. Веса и пороги он не назвал, скоринг ниже это формализация Finetiq.
В отличие от bollinger-squeeze, полосы здесь не дают входов, а распределяют разрешения между пробойными стратегиями и стратегиями возврата. От zero-parameter-filters отличие в форме: переключатель из трёх состояний вместо да или нет.
Почему это может работать
Crudele пришёл к системе после убытков: он был контрарианцем, фейдил ралли и пробои и терял на развороте рынка 2000 года. Причину он видит в том, что не определял среду. Три отклонения он выбрал под индексы: полосы в два отклонения NASDAQ пробивает в обычный день. Пользу правила он описывает так: оно держит его вне фейдов тренда и вне пробоев внутри диапазона.
Kieran решает ту же задачу для портфеля. Когда ADX растёт, цена уходит от средних и ATR расширяется, пробоям хорошо, а стратегии возврата и шорты лучше выключить. Фильтр только убирает сигналы с меньшей вероятностью, и Kieran признаёт, что иногда он заблокирует сделку, которая отыграла бы вчерашний убыток.
Теста самого классификатора нет ни у одного автора. Цифры Kieran относятся к его портфелю из пяти стратегий на in-sample, где он впервые включил фильтр. Все свои стратегии он туда ещё не добавил и сам говорит, что итоговый вид будет другим.
Правила
Полосы и признаки (автор)
// дневные бары, индексные фьючерсы ES, NQ, RTY
Mid = SMA(Close, 20)
SD = StdDev(Close, 20) // генеральное
Upper = Mid + 3 * SD // автор: 20 периодов, 3 отклонения
Lower = Mid - 3 * SD
Width = Upper - Lower
Outward = Upper > Upper[1] AND Lower < Lower[1] // автор: полосы смотрят наружу; Finetiq: оба края за бар
Inward = Width < Width[1] AND Width[1] < Width[2] // автор: полосы сходятся; Finetiq: 2 бара подряд
Narrow = Width < SMA(Width, 50) // Finetiq: полосы сжаты
Классификатор среды (автор, пороги Finetiq)
// Env хранится между барами, стартовое значение CONSOLIDATION
NewUp = Outward AND Close > Highest(High, 20)[1] // автор: расширение и новый максимум; Finetiq: за 20 баров
NewDown = Outward AND Close < Lowest(Low, 20)[1]
IF NewUp AND Env <> TREND_UP
Env = TREND_UP; EpisodeStart = текущий бар // Finetiq: начало эпизода ставится только при смене среды
IF NewDown AND Env <> TREND_DOWN
Env = TREND_DOWN; EpisodeStart = текущий бар
// новый максимум внутри того же тренда EpisodeStart не сдвигает
IF Env IN (TREND_UP, TREND_DOWN) AND Inward // автор: после тренда полосы сходятся
PeakUp = максимум Upper с EpisodeStart // Finetiq: пики полос за эпизод
PeakDown = минимум Lower с EpisodeStart
PrevTrend = Env
Env = MEAN_REV
IF Env = MEAN_REV AND (Narrow OR цель 50% достигнута OR 10 баров без нового тренда)
Env = CONSOLIDATION // автор: полосы сжались, это консолидация; дальше ждать, руки в карманы
// Finetiq: цель 50% и 10 баров как запасные условия
Разрешения по средам (автор)
TREND_UP: только лонги; шорты и фейды запрещены // автор
TREND_DOWN: только шорты // автор
CONSOLIDATION: обе стороны, у краёв диапазона, не в середине // автор
выход за диапазон вероятно вернётся // автор
Finetiq: пробойные стратегии выключены
MEAN_REV: сделки против PrevTrend, размер 0.5 // автор: против основного тренда маленьким
// размером; Finetiq: 0.5
сделки по PrevTrend запрещены // автор: больше не хочет быть в лонге
Уровни возврата и цели (автор, построение Finetiq)
Crudele строит сетку Фибоначчи не по цене, а по полосам: от пика верхней полосы до пика нижней. Его индикатор Beacon рисует её сам. Как выбираются пики, показано только на доске и одном графике, ниже наше прочтение.
Range = PeakUp - PeakDown
// после TREND_UP: шорт
L30 = PeakUp - 0.30 * Range
L50 = PeakUp - 0.50 * Range
IF Env = MEAN_REV AND PrevTrend = TREND_UP AND Close < L30 // автор: дневное закрытие ниже 30%
SELL SHORT AT NEXT BAR OPEN
Target = L50 // автор: цель 50%
IF Close > L30 THEN EXIT AT NEXT BAR OPEN // автор: пока закрытие не вернулось выше
StopLoss = максимум бара, на котором развернулся тренд // автор; Finetiq: максимум эпизода
// уровень 70% автор использует, чтобы оценить силу разворота, не для входа
// после TREND_DOWN зеркально от PeakDown: закрытие выше 30%, цель 50%
// цель в тренде (автор): прошлый пик полосы, «незаконченное дело»
TrendTarget_Up = Highest(Upper, 60) до EpisodeStart // Finetiq: окно 60
Выходы в тренде Crudele ведёт по VWAP от бара разворота и средним 8, 21 и 34, размер позиции считает от расстояния до стопа.
Вариант B. Скоринг режима (Kieran Duff, веса и пороги Finetiq)
Метрики фильтра Kieran: ATR, SMA 50, SMA 200, ADX, закрытие последнего дневного бара, ATR текущего бара, перцентиль ATR, режим объёма и режим тренда. Формулы, весов и порогов в интервью нет. Для VIX он предлагает не порог, а расширение за 2 дня против среднего за 2 месяца, но этот модуль у него ещё не построен.
// дневные значения прошлого закрытого бара
ATR14 = ATR(14); ADX14 = ADX(14) // Finetiq: периоды
Dist = ABS(Close - SMA(Close, 50)) / ATR14
S1 = ADX14 > ADX14[5] // автор: ADX растёт; Finetiq: за 5 дней
S2 = Dist > Dist[5] // автор: цена уходит от средних
S3 = ATR14 > ATR14[5] // автор: ATR расширяется
S4 = PercentRank(ATR14, 250) >= 50 // автор: перцентиль ATR; Finetiq: окно и порог
S5 = SMA(Volume, 10) > SMA(Volume, 50) // автор: режим объёма; Finetiq: сравнение
TrendUp = Close > SMA(Close, 200) AND SMA(Close, 50) > SMA(Close, 200) // автор: режим тренда
TrendDown = Close < SMA(Close, 200) AND SMA(Close, 50) < SMA(Close, 200) // Finetiq: определение
Score = S1 + S2 + S3 + S4 + S5 // Finetiq: равные веса, от 0 до 5
IF Score >= 4 AND TrendUp THEN пробойные лонги; возврат и шорты выключены // автор: действие; Finetiq: порог 4
IF Score >= 4 AND TrendDown THEN пробойные шорты; возврат выключен // Finetiq
IF Score >= 4 AND NOT TrendUp AND NOT TrendDown THEN пробои в обе стороны, размер 0.5 // Finetiq
IF Score <= 1 THEN стратегии возврата; пробойные выключены // Finetiq
IF Score IN (2, 3) THEN все стратегии, размер 0.5 // Finetiq
Подключение к карточкам базы (Finetiq)
// пример 1: prev-high-breakout-adx. Фильтр ADX(5) < 35, BUY STOP над максимумом прошлой сессии
Allowed_A = DailyADX < 35 // как в карточке
Allowed_B = Allowed_A AND Env = TREND_UP // Crudele: пробой только в тренде
Allowed_C = Allowed_A AND Env <> CONSOLIDATION // мягче: запрет только в диапазоне
// заметьте конфликт: ADX(5) < 35 отбирает тихие дни, TREND_UP требует расширения полос
// пример 2: five-day-low-mr. Покупка 5-дневного минимума, выход выше MA5
Allowed_MR = Env IN (CONSOLIDATION, TREND_UP) // покупка отката не противоречит «только лонг»
OR (Env = MEAN_REV AND PrevTrend = TREND_DOWN) // возврат после падения, размер 0.5
// в TREND_DOWN и в MEAN_REV после роста покупки запрещены
Параметры
| Параметр | Значение | Откуда |
|---|---|---|
| Таймфрейм | дневной | автор |
| Полосы Боллинджера | SMA 20, 3 стандартных отклонения | автор |
| Полосы наружу | верхняя растёт и нижняя падает за бар | Finetiq |
| Пробой в тренде | закрытие за 20-дневным экстремумом | Finetiq |
| Полосы сходятся | ширина падает 2 бара подряд | Finetiq |
| Полосы сжаты | ширина ниже своей SMA 50 | Finetiq |
| Уровни возврата | 30, 50, 70% между пиками полос | автор |
| Вход в возврат | дневное закрытие за уровнем 30% | автор |
| Цель возврата | 50%, выход при закрытии обратно за 30% | автор |
| Размер против основного тренда | 0.5 | Finetiq (автор: маленький) |
| Выход из MEAN_REV | полосы сжаты (Narrow), цель 50% или 10 баров | автор (сжатие полос), Finetiq (порог сжатия, цель, 10 баров) |
| Цель в тренде | прошлый пик полосы, окно 60 баров | автор, окно Finetiq |
| Вариант B: метрики | ADX, ATR, перцентиль ATR, SMA 50 и 200, объём, тренд | автор |
| Вариант B: периоды, веса, пороги | ADX 14, ATR 14, 5 и 250 дней, баллы 4 и 1 | Finetiq |
Что проверить
- Разделяет ли классификатор рынок. Разметьте историю ES и NQ средами и посчитайте для каждой среднее изменение цены за 5 дней, долю продолжения пробоев 20-дневного экстремума и долю возвратов к Mid. Если в TREND_UP пробои продолжаются не чаще, чем в CONSOLIDATION, классификатор не работает.
- Три отклонения против двух. Тот же классификатор на 20/2 и 20/2.5: частота смены сред и результат. Crudele считает два отклонения на индексах слишком близкими.
- Окрестность порогов Finetiq. Пробой за 10, 20 и 40 баров; схождение 1, 2 и 3 бара; окно Narrow 30, 50 и 100. Скачок результата от соседнего значения означает подгонку.
- Стратегия с фильтром и без. Три версии
prev-high-breakout-adxиз примера: сколько сделок фильтр убрал и какими они были. - Уровни 30/50/70. Вход за 30% против 50% и против входа сразу при Inward, цель 50% против текущей Mid.
- Скоринг Kieran. Равные веса против одного ADX и одного перцентиля ATR. Пороги выбирайте только на in-sample.
- Издержки переключений. Сколько раз в год меняется среда. Переключения на пограничных барах плодят сделки, которые только платят спред.
Особенности платформ
TradingView (Pine Script)
ta.bb(close, 20, 3)использует генеральное отклонение, какStdDevв EasyLanguage иiBandsв MT5, так что уровни 30/50/70 совпадут.- Среду и пики полос храните в переменных
varи обновляйте только на закрытом баре. - ADX для варианта B берите из
ta.dmi(14, 14), он по Уайлдеру. Перцентиль ATR:ta.percentrank(atr, 250). - У ES дневной бар в TradingView начинается в 18:00 ET. Полосы по кэш-индексу и по фьючерсу различаются, считайте по тому ряду, которым торгуете.
MultiCharts и TradeStation (EasyLanguage)
- Полосы проще посчитать явно:
Average(Close, 20) + 3 * StdDev(Close, 20).StdDevSвыборочное и даст полосы шире. - У фьючерсов дневной бар TradeStation закрывается по settlement, а 1440-минутный по последней сделке. Закрытие за уровнем 30% может выпасть на разные дни. Бэктест и торговлю ведите на одном виде бара.
AvgTrueRangeэто простое среднее TR, в Pine ATR по Уайлдеру. Признаки S2, S3 и S4 варианта B дадут другие дни, если не посчитать Уайлдера вручную.- Классификатор копируйте в код каждой стратегии, которую он фильтрует. Так в бэктесте все видят одно значение прошлого дня.
MetaTrader 5 (MQL5)
iBands(_Symbol, PERIOD_D1, 20, 0, 3, PRICE_CLOSE)даёт полосы на генеральном отклонении. Значения берите с бара 1.- Дневной бар CFD строится по серверному времени брокера. Короткие воскресные бары добавляют лишние закрытия в окно 20 и сдвигают полосы.
- Для варианта B берите
iADXWilder,iADXсглаживает иначе.iATRэто простое среднее TR. - Режим объёма у CFD считается по тиковому объёму (
iTickVolume). Kieran торгует CFD именно так, но это активность котировок у брокера, а не объём торгов.
Где идея может сломаться
- Crudele торгует с дискрецией: цели по чужим уровням, выходы по VWAP и средним, опционы при широком стопе, размер по макрофону. Механическая версия этого не повторяет.
- Самое трудное место он называет сам: переход после возврата к среднему, когда неизвестно, будет консолидация или новый тренд. Здесь его чаще всего бьёт, и здесь больше всего наших порогов.
- Определения «полосы наружу», «сходятся» и выбор пиков для сетки наши. Разные прочтения дадут разные даты смены среды.
- Статистики в видео нет, только схемы на доске и один график ES 2025 года. В выпуске много рекламы проп-фирм.
- Цифры Kieran получены на in-sample 2018-2019 годов, в первом прогоне фильтра и не на всём портфеле. Об out-of-sample они ничего не говорят.
- Скоринг из пяти признаков с порогами легко подогнать. Веса автора неизвестны, наши равные веса только стартовая точка.