Ідея коротко
У класичного пробою один рівень: максимум за N днів. Тут рівнів два. Donchian позначає максимум і мінімум за N днів, Keltner малює смугу навколо середньої на відстані кількох ATR. Вони по-різному реагують на волатильність, і в різні дні ближче до ціни опиняється то один, то інший. Правило просте: сигнал дає той канал, якого ціна торкнулася першим.
Gary Antonacci і Carlo Zarattini застосували це до 48 галузевих секторів США за сто років. Вхід у лонг на першому дотику до верхньої межі 20-денного каналу. Вихід на першому дотику до нижньої межі 40-денного каналу: довжину виходу подвоїли, щоб дати угоді місце і не плодити оборот. Шортів немає, розмір позиції нормовано на волатильність.
Tom Basso використовує той самий прийом із трьома індикаторами (Donchian, Bollinger, Keltner) і короткою довжиною 9 днів. Його версія завжди в ринку й перевертається в обидва боки.
Чому це може працювати
Обидва автори пояснюють канали як смугу шуму. Усередині неї ціна ходить без напрямку, і торгувати там немає сенсу: у боковику виходять лише пили. Вихід за смугу Antonacci вважає ознакою продовження руху, його гіпотеза звучить як «новий максимум чотирьох тижнів обіцяє продовження». Basso порівнює це з термостатом, якому потрібен запас у пару градусів, щоб не клацати щохвилини.
Ширина Keltner і Bollinger залежить від волатильності. У тихому ринку лінії сходяться, у нервовому автоматично розходяться. Basso вважає, що тому такі індикатори витримують зміну умов краще за фіксовані перетини середніх. Перший дотик бере ту міру шуму, яка зараз ближча до ціни. Basso прямо каже, що йому байдуже, який з індикаторів поставить ордер: усі три вимірюють той самий шум.
У розкладанні результату в Antonacci головний внесок у Sharpe дав таймінг, а не вибір секторів. Ведучий Rich Brennan пояснює це тим, що пробої пропускають основну масу дрібних рухів і працюють на хвостах розподілу. Ці пояснення не перевірені нами.
Правила
Канали
// денні бари
DonchianUpper(N) = максимум High за N останніх закритих барів
DonchianLower(N) = мінімум Low за N останніх закритих барів
KeltnerUpper(N) = EMA(Close, N) + K * ATR(N)
KeltnerLower(N) = EMA(Close, N) - K * ATR(N)
// Basso описує Keltner як EMA 21 плюс ATR приблизно за 21 день, помножений на коефіцієнт.
// Finetiq: в Antonacci довжина Keltner дорівнює довжині каналу (20 або 40), K = 2 як стартове значення
BollingerUpper(N) = SMA(Close, N) + B * StdDev(Close, N)
BollingerLower(N) = SMA(Close, N) - B * StdDev(Close, N)
// Finetiq: B = 2, ширину у відео не названо
Перший дотик
// першим спрацює рівень, найближчий до ціни
FirstUp(N) = min(DonchianUpper(N), KeltnerUpper(N))
FirstDown(N) = max(DonchianLower(N), KeltnerLower(N))
// Finetiq: смуга Keltner або Bollinger може опинитися за ціною вже на закритті.
// Тоді дотик уже відбувся: вхід за ринком на наступному відкритті, без стоп-ордера
Основна система: Antonacci, лише лонг
IF position = FLAT
IF Close > KeltnerUpper(20)
BUY AT NEXT BAR OPEN // Finetiq: рівень пройдено на закритті
ELSE
BUY STOP at FirstUp(20) // автор: перший дотик до 20-денного каналу
IF position = LONG
IF Close < KeltnerLower(40)
EXIT AT NEXT BAR OPEN // Finetiq
ELSE
SELL STOP at FirstDown(40) // автор: перший дотик до 40-денного каналу вниз
// шортів немає: в акцій висхідний дрейф (автор)
// окремого стоп-лоса немає, його роль грає вихід за 40-денним каналом
Розмір позиції (автор, числа Finetiq)
Vol = StdDev(денні доходності, 20) * sqrt(252) // Finetiq: вікно у відео не названо
Weight = TargetVol / Vol / M // автор: нормування на волатильність
TargetVol = 10% // автор, з пам'яті
M = кількість інструментів у кошику // Finetiq: M = 1 для одного ETF
Weight = min(Weight, 1 / M) // Finetiq: без плеча
// перебалансування щодня (автор)
// кошик: тримаємо всі сектори із сигналом, без ранжування (автор)
Варіант B. Basso: 9 днів, три канали, завжди в ринку
// індексні ф'ючерси, завжди лонг або шорт, розвороти в обидва боки (автор)
// у Basso та сама 9-денна зв'язка на мікроф'ючерсах біткоїна й ефіру, напрямок там не уточнено
N = 9 // автор, для всіх трьох індикаторів
UpperLevel = min(DonchianUpper(9), BollingerUpper(9), KeltnerUpper(9))
LowerLevel = max(DonchianLower(9), BollingerLower(9), KeltnerLower(9))
// автор: ордер ставить лінія, найближча до ціни, який індикатор це буде, неважливо
IF position = SHORT OR position = FLAT
BUY STOP at UpperLevel
IF position = LONG OR position = FLAT
SELL SHORT STOP at LowerLevel
// Finetiq: те саме правило про рівень, пройдений уже на закритті
// розмір: загальний принцип Basso
Units = Equity * 0.5% / (|EntryPrice - LowerLevel| * PointValue) // для лонга
// автор: у прибутковій позиції ризик може зрости до 1%, далі позиція урізається
Варіант C. Basso: триденний Donchian
// близько 26–27 ф'ючерсів, завжди в ринку (автор)
BUY STOP at DonchianUpper(3)
SELL SHORT STOP at DonchianLower(3)
// нижня лінія і є трейлінг-стоп лонга, окремий трейлінг не потрібен (автор)
// внутрішні дні не пробивають канал і ігноруються самі собою (автор)
Параметри
| Параметр | Значення | Звідки |
|---|---|---|
| Канал входу (A) | 20 днів, Donchian і Keltner | автор |
| Канал виходу (A) | 40 днів, Donchian і Keltner | автор |
| Правило спрацювання | перший дотик до будь-якого каналу | автор |
| Напрямок (A) | лише лонг | автор |
| Множник Keltner K | 2 | Finetiq |
| Середина й ширина Keltner | EMA і ATR тієї самої довжини | Finetiq (у Basso EMA 21 і ATR близько 21) |
| Розмір (A) | нормування на волатильність, ціль близько 10% | автор |
| Перебалансування (A) | щодня | автор |
| Вікно волатильності | 20 днів | Finetiq |
| Рівень пройдено на закритті | вхід за ринком на наступному відкритті | Finetiq |
| Довжина (B) | 9 днів, три індикатори | автор |
| Ширина Bollinger B | 2 стандартні відхилення | Finetiq |
| Напрямок (B, C) | завжди в ринку, розвороти | автор |
| Довжина (C) | 3 дні, лише Donchian | автор |
| Ризик на позицію (B, C) | 0.5% капіталу, до 1% у прибутковій позиції | автор (загальний принцип Basso) |
Що перевірити
- Перший дотик проти одного каналу. Три прогони варіанта A: лише Donchian 20/40, лише Keltner 20/40, перший дотик. Якщо комбінація не краща за найкращий із двох, другий канал лише додає угоди.
- Множник Keltner. K = 1.5, 2, 2.5, 3. За малого K смуга Keltner майже завжди ближча до ціни й фактично заміняє Donchian. Запишіть, яка лінія дала сигнал у кожній угоді, і подивіться на частки.
- Асиметрія 20/40. Порівняйте 20/40 із 20/20 і 20/10. Автор подвоїв довжину виходу заради меншого обороту. Перевірте, скільки це коштує у відданому прибутку й просадці.
- Щоденне перебалансування. Нормування щодня проти перебалансування лише за відхилення ваги більше ніж на 20%. Автор визнає, що щоденна версія помітно збільшує кількість угод.
- Околиця 9 днів у Basso. 7, 9, 12, 15 днів на індексному ф'ючерсі з повними витратами. Система завжди в ринку й перевертається часто, витрати тут вирішують.
- Сектор проти індексу. Варіант A на одному секторному ETF проти того самого правила на S&P 500. Якщо на широкому індексі результат близький, основну роботу робить таймінг, як і каже автор.
- Вхід за ринком після закриття за смугою. Порахуйте частку таких входів і середнє прослизання від рівня. На гепах ціна входу помітно гірша, ніж в ідеальному тесті за рівнем.
Особливості платформ
TradingView (Pine Script)
ta.kcрахує середину й ширину за своєю реалізацією, а реалізації Keltner різняться. Щоб збігтися з правилами, зберіть смугу самі:ta.ema(close, 20) + k * ta.atr(20).ta.atrзгладжує за Вайлдером.- Стоп-ордер на купівлю нижче поточної ціни виконується на відкритті наступного бару. Якщо смуга Keltner уже під ціною,
strategy.entry(..., stop = firstUp)перетворюється на вхід за ринком. Розділяйте цей випадок явно, інакше вхід виглядатиме як пробій рівня. ta.stdevза замовчуванням генеральне стандартне відхилення, якStdDevв EasyLanguage іiBandsу MQL5. Смуги Bollinger на трьох платформах збіжаться за однакової довжини.- Стратегія торгує один символ. Кошик із 48 секторів зі спільним нормуванням у Pine не протестувати. Варіант A перевіряється на одному ETF, кошик збирається поза TradingView.
MultiCharts і TradeStation (EasyLanguage)
- Keltner зберіть самі:
XAverage(Close, 20) + K * ATRw, деATRwпораховано за Вайлдером вручну.AvgTrueRangeце просте середнє TrueRange, смуги з ним будуть іншими. Оберіть одну версію ATR і тримайте її на всіх платформах. Buy next bar at FirstUp stopживе один бар. Надсилайте його на кожному барі. Якщо рівень нижче відкриття наступного бару, ордер виконається за відкриттям.- Для ф'ючерсів (варіанти B і C) закриття денного бару в TradeStation це settlement, у 1440-хвилинного бару остання угода (Kevin Davey, The Algorithmic Advantage #036). Триденний канал на двох видах бару дає різні рівні майже щодня.
- Кошик секторів з нормуванням за волатильністю тестується в портфельному модулі: Portfolio Trader у MultiCharts, Portfolio Maestro у TradeStation.
MetaTrader 5 (MQL5)
- Вбудованого Keltner немає. Середню беріть через
iMA(..., MODE_EMA, ...), ATR рахуйте самі:iATRце просте середнє TR. - Секторні ETF є не в кожного брокера. У CFD на ETF нараховується своп, а позиція варіанта A тримається тижнями й місяцями.
- Щоденне нормування впирається в крок лота
SYMBOL_VOLUME_STEP. На невеликому рахунку вага змінюється сходинками, і частина перебалансувань не відбувається. - Для варіантів B і C на неттинговому рахунку розворот робиться однією угодою подвійного обсягу, на хеджинговому стару позицію треба закрити явно.
Де ідея може зламатися
- Множник Keltner і ширину Bollinger у відео не названо. Від них залежить, який канал спрацьовує першим, тобто суть правила. Antonacci визнає, що деталей статті не пам'ятає, точні налаштування треба брати із самої статті.
- Столітні дані це галузеві індекси, а не цінні папери, якими можна торгувати. Історія секторних ETF коротка, автор перевіряв їх окремо.
- Автор сам показує нерівність: у столітній таблиці є чудові й слабкі періоди, режими тривають по 15–20 років. Тест на 5–10 роках може повністю потрапити в слабкий режим.
- Хедж шортом покращував Sharpe і просадку, але знижував підсумкову доходність, тому модель залишили лише довгою. Просадки лонг-версії у ведмежому ринку ніхто не страхує.
- У Basso немає цифр результату. Версії B і C описано як його поточні стратегії, без статистики й без ширини смуг.
- Щоденне нормування за волатильністю збільшує оборот. На малому рахунку й CFD витрати можуть з'їсти різницю з простим утриманням.