Идея коротко
Фильтр отвечает на вопрос: закончилась ли коррекция рынка и можно ли снова покупать пробои. Уильям О'Нил, автор CANSLIM и основатель Investor's Business Daily, отвечает на него днём подтверждения, follow-through day. Jack Corsellis разбирает правило в конце первой части обзора книги «How to Make Money in Stocks».
Рынок падает. В какой-то день индекс перестаёт обновлять минимум и начинает попытку ралли: это день 1. С четвёртого дня попытки ждём сильный рост одного из главных индексов на объёме выше, чем накануне. Такой день говорит, что попытка ралли, скорее всего, настоящая. Сильнейшие подтверждения приходят на 4-7 день. Сигнал не значит покупать всё сразу: он разрешает начать покупать качественные акции, которые выходят из баз.
Почему это может работать
Объяснение О'Нила через институциональный спрос. Отскок в первые дни после минимума держится на закрытии коротких позиций и мелких покупках. Сильный рост на повышенном объёме через несколько дней показывает, что вошли крупные деньги, способные двигать индекс. Первые три дня пропускаются, чтобы отсеять отскок на день-два.
Довод О'Нила асимметричный: каждый новый бычий рынок начинался с такого дня. Обратное неверно, и Джек это подчёркивает: после подтверждения рынок может откатить, а часть подтверждений проваливается. Статистики в видео нет, только примеры, выбранные задним числом. Сколько подтверждений не привело к росту, неизвестно.
Отличие от соседних фильтров. index-ema-regime построен на месячных и недельных средних и включает покупки через недели или месяц после разворота. День подтверждения ловит разворот раньше, в первые дни попытки ралли (сильнейшие на 4-7 день, в примерах Джека до десятого, карточка ждёт до 25 дней), ценой ложных сигналов. От breadth-regime он отличается данными: нужен только индекс и его объём, без статистики по всем акциям.
Правила
Коррекция и день 1 (Finetiq)
В видео коррекция и попытка ралли описаны словами: рынок в нисходящем тренде, затем день 1. На примерах Джека день 1 это доджи у минимума, бар разворота после гэпа вниз или свеча с длинной нижней тенью. Пороги ниже наши.
// дневные бары индекса: NASDAQ Composite или S&P 500
// сообщество (Джек): Dow с его 30 бумагами весит меньше
Correction = Close <= 0.92 * Highest(Close, 63) // Finetiq: 8% ниже 3-месячного максимума
OR Close < EMA(Close, 21) на 10 закрытиях подряд // Finetiq: вариант без процента
NewLow = Low <= Lowest(Low, 20) // Finetiq: 20-дневный минимум
IF Correction AND NOT Attempt AND NewLow
CandidateLow = Low
IF CandidateLow задан AND NOT Attempt AND Close > Close[1] // Finetiq: первое закрытие вверх после минимума
Attempt = TRUE; Day1Low = CandidateLow; DayCount = 1
// вариант: день нового минимума с закрытием в верхней половине диапазона считать днём 1
IF Attempt
DayCount = DayCount + 1 на каждом следующем баре
IF Low < Day1Low // Finetiq: пробой минимума попытки
Attempt = FALSE; CandidateLow = Low // в видео этого правила нет, отсчёт заново
День подтверждения (автор, пороги Джека и Finetiq)
IF Attempt AND DayCount >= 4 // автор: начиная с четвёртого дня
Gain = Close / Close[1] - 1
FTD = Gain >= 1.5% // сообщество (Джек): не меньше 1.5%, лучше 2%
AND Volume > Volume[1] // автор: всегда выше вчерашнего
AND Volume > Average(Volume, 30)[1] // Finetiq: жёсткое условие; у автора «в большинстве случаев»
// Finetiq: 30 дней, как на графиках Джека
FTD_Soft = Gain >= 1.5% AND Volume > Volume[1] // вариант без условия средней, ближе к словам автора
FTD_Strong = FTD AND Gain >= 2% AND DayCount <= 7 // автор: сильнейшие на 4-7 день
IF Attempt AND DayCount > 25 AND NOT FTD // Finetiq: попытка без подтверждения устарела
Attempt = FALSE
// в примерах Джека подтверждение приходило и на десятый день
Состояние рынка для стратегии (Finetiq)
// автор: подтверждение разрешает начать покупать, а не покупать всё сразу
IF FTD
MarketOK = TRUE; FTD_Day1Low = Day1Low; Attempt = FALSE
// когда разрешение отзывается (Finetiq)
IF MarketOK AND Close < FTD_Day1Low // индекс ушёл под минимум попытки
MarketOK = FALSE
IF MarketOK AND Close < EMA(Close, 21) на 5 закрытиях подряд
MarketOK = FALSE
// после отзыва снова ищем коррекцию и день 1
// в начале истории MarketOK = TRUE, если индекс выше EMA 21 и не в коррекции
// сообщество (Джек): лучше, если индекс вернулся выше EMA 21 (Mike Webster: под ней рынок мало даёт)
MarketOK_Plus = MarketOK AND Close > EMA(Close, 21)
RiskMult = 0.5 в первые 10 дней после FTD, затем 1.0 // Finetiq: первые позиции меньше
Подключение к карточкам базы (Finetiq)
// пример 1: qullamaggie-breakout. Там режим по дневным EMA 10 и 20 NASDAQ Composite
Allowed_A = RegimeOK // как в карточке
Allowed_B = MarketOK // только день подтверждения
Allowed_C = RegimeOK OR (MarketOK AND BarsSince(FTD) <= 10) // подтверждение включает покупки раньше средних
// вход, стоп и сопровождение карточки не меняются
// пример 2: index-ema-regime, вариант B (недельные EMA 10 и 20)
EntryAllowed_FTD = (Uptrend AND NOT CashFlag) OR MarketOK // подтверждение снимает запрет до пересечения средних
Параметры
| Параметр | Значение | Откуда |
|---|---|---|
| Индекс | NASDAQ Composite или S&P 500, Dow весит меньше | автор (один из главных индексов), сообщество (Джек: Dow весит меньше) |
| Коррекция | 8% ниже 3-месячного максимума или 10 закрытий под EMA 21 | Finetiq |
| День 1 | первое закрытие вверх после 20-дневного минимума | Finetiq |
| Отмена попытки | пробой минимума дня 1 | Finetiq |
| Начало окна подтверждения | 4-й день | автор |
| Сильнейшее подтверждение | 4-7 день | автор |
| Предел ожидания | 25 дней | Finetiq |
| Рост в день подтверждения | не меньше 1.5%, лучше 2% | сообщество (Джек о правиле О'Нила) |
| Объём | выше вчерашнего | автор |
| Объём выше среднего | обязательно в основной версии, вариант FTD_Soft без него | Finetiq (автор: в большинстве случаев) |
| Длина средней объёма | 30 дней | сообщество (графики Джека), выбор Finetiq |
| Индекс выше EMA 21 | желательно | сообщество (Джек со слов Mike Webster) |
| Отзыв разрешения | под минимумом дня 1 или 5 закрытий под EMA 21 | Finetiq |
| Размер после сигнала | половина риска первые 10 дней | Finetiq |
Что проверить
- Что происходит после подтверждений. Найдите все дни подтверждения за 30-40 лет на NASDAQ Composite и S&P 500 и посчитайте доходность индекса через 5, 20 и 60 дней. Сравните со случайными днями внутри коррекций. Примеры Джека отобраны, их для выводов мало.
- Доля провалов. Какая часть подтверждений отменилась пробоем минимума дня 1 в следующие 20 дней. Это число ложных разрешений, которые получит стратегия.
- Окрестность порогов. Рост 1%, 1.5%, 2%, 2.5%. Первый допустимый день 3, 4, 5. Коррекция 6%, 8%, 10%. Джек говорит, что порог О'Нила раньше был ниже, так что на старой и новой истории лучший порог может различаться.
- Объём. Условие «выше вчерашнего» против «выше вчерашнего и выше среднего» против версии без объёма. Если объём ничего не добавляет, фильтр переносится на CFD.
- Подключение к стратегии. Пробойная стратегия из
qullamaggie-breakoutс режимом по средним, с днём подтверждения и с обоими. Смотрите, сколько сделок фильтр добавил в первые недели после минимума и чем они закончились. - Какой индекс. NASDAQ Composite против S&P 500 и против сигнала на любом из двух. У О'Нила речь об одном из главных индексов, и выбор меняет число сигналов.
Особенности платформ
TradingView (Pine Script)
- Если стратегия работает на внутридневных барах бумаги, индекс читайте через
request.securityс дневным таймфреймом, сдвигом[1]иlookahead = barmerge.lookahead_on. На дневках берите закрытый бар индекса. - Проверьте, есть ли у символа индекса объём и откуда он. Если его нет, объём берут у ETF (QQQ, SPY) или у фьючерса, и это уже приближение.
- Состояние попытки храните в переменных
var. Счётчик дней должен считать торговые дни индекса, а не бары графика бумаги с другим расписанием. - Стратегия торгует только символ графика. Фильтр для корзины акций проверяется по одной бумаге.
MultiCharts и TradeStation (EasyLanguage)
- Индекс подключается вторым потоком (
Close of Data2,Volume of Data2). Счётчик дней ведите только на новых барах Data2. - Объём индексного символа зависит от поставщика данных. Сверьте его с объёмом биржи за несколько дат: если это объём одной площадки или его нет, условие объёма теряет смысл.
- На внутридневных барах TradeStation полный объём исторически лежит в
Ticks. Считайте фильтр на дневных барах индекса. - Рост считайте от вчерашнего закрытия индекса, а не от открытия. На гэпах разница большая.
MetaTrader 5 (MQL5)
- У CFD на индексы только тиковый объём (
iTickVolume). Условие «объём выше вчерашнего» по нему описывает активность котировок у брокера, а не объём торгов. Реальный объём (iRealVolume) есть только у биржевых инструментов. - NASDAQ Composite у CFD-брокеров почти не встречается. NAS100 это NASDAQ-100, US500 близок к S&P 500. Даты сигналов на них будут отличаться от примеров.
- Дневной бар CFD закрывается по серверному времени брокера, а не в 16:00 ET. Рост за день у CFD и у кэш-индекса считается от разных закрытий.
- Значения индекса берите с закрытого бара (сдвиг 1), иначе на истории сигнал увидит незакрытый день.
Где идея может сломаться
- В видео нет теста, только удачные подтверждения с 1978 по 2022 год. Провалившихся Джек не показывает.
- Коррекцию, день 1 и отмену попытки автор не формализовал. От этих правил зависит, какие дни станут сигналом, и наша версия может давать другие даты, чем у IBD.
- Порог роста менялся: по словам Джека, у О'Нила он был ниже, а в обновлённой версии около 2%. Порог, подобранный на истории, мог не существовать в момент сигнала.
- Сигнал редкий: коррекции случаются несколько раз за десятилетие, поэтому даже за 30-40 лет истории из проверки 1 подтверждений на одном индексе наберётся порядка десятков, а не сотен. Для выводов этого мало.
- Объём индекса за десятилетия изменился из-за электронной торговли и новых площадок. Сравнение со вчерашним днём это переживает, сравнение со средней хуже.
- Правило описано внутри обзора CANSLIM и рассчитано на покупку лидеров из баз, а не на торговлю самим индексом.