Выложу сразу главное, чтобы не было ощущения, что я прячу неудобное в конец.
Бэктест (8 акций MOEX, 2024-01 — 2026-06, 1554 сделки, комиссия 0,05% на сторону): +18,4% против −31,3% у buy&hold, просадка −3,5%, PF 1,22, winrate 42,6%.
Живая работа (сервер, 07.08 — 20.08.2026, 20 закрытых сделок): −4,39%, PF 0,61, winrate 25%.
Ниже — устройство системы, полные параметры, откуда взялись цифры и почему я не считаю двухнедельный минус опровержением. И почему двухнедельный плюс я бы не считал подтверждением тоже.
Что за стратегияFVG — Fair Value Gap, трёхсвечный имбаланс. Бычий: low[i] > high[i-2], зона [high[i-2] .. low[i]]. Медвежий зеркально. Порог размера: (top-bot) ≥ ATR × min_mult.
Вход по краю зоны при возврате цены, стоп за дальним краем плюс буфер ATR, цели как R-мультипликаторы 1R/2R/3R/4R, фиксация по 25% на каждой. Зона умирает при митигации — когда цена закрылась по ту сторону дальней границы.
Это порт Pine-индикатора «FVG Trade Entries» в event-driven бэктестер на pandas.
Почему MTF, а не чистый часСразу отвечу на очевидный вопрос — зачем связка 1h+5m, если можно проще.
Считал три варианта входа на одних и тех же сигналах:
| Правило входа | SBER | GAZP |
|---|---|---|
| По open следующего часа | −19,6% | +14,7% |
| MTF, open следующего 5m-бара | +9,7% | +27,7% |
| MTF, лимитка на краю зоны (5m) | +16,7% | +42,3% |
Разброс на SBER — 36 процентных пунктов на одних и тех же зонах, разница только в том, где фиксируется вход. На часовом входе стратегию торговать нельзя: к открытию следующего часа цена ушла от зоны на непредсказуемое расстояние.
Детекция целиком на 5m тоже мертва: −98,5%, 5662 сделки, комиссия съедает счёт. Осмысленный масштаб — зоны с часа, исполнение с пятиминутки.
Стек фильтровТут главное, и тут же основной риск подгонки, о котором скажу отдельно.
| Конфигурация | Доходность | PF | Сделок | Win% |
|---|---|---|---|---|
| Чистый FVG | +2,9% | 1,03 | 615 | 37 |
| + EMA100 (1h) | +14,4% | 1,11 | 521 | 39 |
| + объём рос на барах гэпа | +16,7% | 1,32 | 223 | 42 |
| + min TP1 0,5% | +24,0% | 1,34 | 187 | 49 |
SBER, честное MTF-исполнение, лэддер 25%×4
Чистый FVG эджа не даёт — PF 1,03 это балансирование около нуля. Работают только направленные фильтры:
Ненаправленные ограничения не сработали ни разу: max_zones=1 хуже везде (+17%→+1%), фильтр «одна сделка в час» на лэддере даёт −16 п.п., множество позиций −67% (залповые стопы в трендах).
Тап на пониженном объёме проверял отдельно — −4,0%, mean-reversion тут не работает.
Обязательная очистка данныхДва фильтра, которые эджа не создают, но без них цифры фиктивные.
Фильтр сессии MOEX. Кэш T-Invest содержит внебиржевые бары — 22% часовых. Ликвидности там нет, спред широкий, бэктест это не штрафует. Без фильтра результат завышен на 25–50 п.п. Режу до ресемпла: будни 07:00–23:50, выходные 09:50–19:00 МСК.
Дивидендная пауза. Цены MOEX неадъюстированные, дивгэп SBER на −8% рисует фантомный гигантский FVG. Конкретный случай: short от 11.07.2024 висел 217 дней и блокировал слот. Даты отсечек тянутся из ISS, пауза за день до гэпа плюс прогрев после.
Отдельно про адъюстирование: ISS отдаёт неадъюстированные ряды, и на сплитах это разрыв ×98 у GMKN и ×10 у PLZL. Дневки беру из T-Invest, там пересчитано.
Результаты по пулуВосемь бумаг, параметры не подгонялись под инструмент — единый набор, зафиксированный на SBER и прогнанный как есть.
| Бумага | Сделок | FVG | B&H | maxDD | PF | Win% | Sharpe |
|---|---|---|---|---|---|---|---|
| GAZP | 176 | +41,6% | −38,2% | −5,7% | 1,29 | 42,6 | 1,95 |
| NVTK | 184 | +38,4% | −37,8% | −8,3% | 1,47 | 47,8 | 2,67 |
| ROSN | 179 | +37,9% | −46,7% | −8,8% | 1,30 | 40,8 | 1,87 |
| LKOH | 200 | +32,5% | −38,7% | −9,5% | 1,42 | 50,5 | 2,66 |
| SBER | 187 | +24,0% | +11,2% | −5,2% | 1,34 | 48,7 | 2,23 |
| CHMF | 213 | −0,7% | −59,4% | −18,0% | 0,98 | 38,5 | −0,07 |
| MOEX | 205 | −11,5% | −15,4% | −20,6% | 0,86 | 37,6 | −0,94 |
| GMKN | 210 | −14,7% | −25,8% | −19,4% | 0,83 | 35,7 | −1,23 |
| Пул | 1554 | +18,4% | −31,3% | −3,5% | 1,22 | 42,6 | — |
Пул — equal-weight, капитал делится на 8, каждая бумага компаундится своей кривой.
Что здесь стоит отметить:
Знак определяется winrate, а не payoff. Прибыльные — win 40,8–50,5%, убыточные — 35,7–38,5%. Порог примерно по 40%. Payoff у убыточных нормальный (1,44–1,57), просто при 36% попаданий он не окупает частоту стопов.
Диверсификация гасит просадку с 18–21% до 3,5%. Одиночные бумаги проседают сильно, но в разное время.
Три бумаги в минусе я не выкинул. Отбор по итогам того же прогона — подгонка. Убирать можно будет только после проверки на другом периоде, и это ещё не сделано.
Эдж контрциклический. У 7 из 8 buy&hold отрицателен. Основной вклад — шорты на падающем рынке 2024–2026. На растущем рынке результат будет другим, какой — не знаю.
Гэп-модель выходаЗамерил: 50,2% сделок переносятся через ночь, 19,7% через выходные(у SBER 59,0% и 29,5%). Не краевой случай.
Пересчитал по фактически доступной цене — если бар открылся за уровнем, выход по open:
| Модель | Σ net % | ср. PF | Бумаг в плюсе |
|---|---|---|---|
| По уровню (как было) | 114,4 | 1,348 | 8/8 |
| Гэп, честно | 106,2 | 1,321 | 8/8 |
| Гэп + слип 0,05% | 102,6 | 1,311 | 8/8 |
| Гэп + слип 0,15% | 95,3 | 1,290 | 8/8 |
| Гэп только против позиции + слип 0,15% | 83,6 | 1,263 | 8/8 |
Честная модель забирает 8,2 п.п. из 114 — остаётся 92,8%. В заведомо пессимистичном сценарии 73%, и все 8 бумаг сохраняют знак.
Почему деградация умеренная: разобрал 174 ноги, закрытые разрывом. Против позиции 49 ног на −32,2 п.п., в пользу 125 ног на +65,3 п.п. Разрывы на тейках втрое чаще, чем на стопах — в лесенке четыре тейка против одного стопа. 90% гэп-стопов (44 из 49) приходятся на первые минуты сессии, 06:50–07:05 и 09:50–10:05.
Что вживуюБот работает на VPS с 6 августа. Выгрузка из боевой базы на 21.08:
| Показатель | Значение |
|---|---|
| Период | 07.08 — 20.08.2026 |
| Сигналов FVG | 21 |
| Закрытых сделок | 20 |
| Прибыльных | 5 (25%) |
| Сумма net | −4,39% |
| PF | 0,61 |
Две последние сделки целиком.
GMKN, 18.08, лонг. Зона родилась 13:00, касание 15:40, вход 115,30, стоп 113,96 (риск 1,16%). Лесенка отработала полностью: TP1 в 19:10, TP2 в 07:10 следующего дня, TP3 в 17:00, TP4 в 17:30 по 120,67. Результат +2,81% net, в позиции 26 часов.
CHMF, 20.08, лонг. Зона от 19.08, касание 13:30, вход 629,20, стоп 620,40. Стоп через три часа, −1,50% net.
Как это читать. 20 сделок — шум. При истинном winrate 42% вероятность получить 5 успехов из 20 или хуже около 8%: редко, но рядовое событие. Отличить «стратегия сломалась» от «не повезло две недели» на такой выборке нельзя. Внутри бэктеста из 1554 сделок двухнедельные куски и хуже встречались.
Обратное тоже верно: покажи я вам сейчас +4% за две недели, это ровно так же ничего не значило бы. Судить буду по году и по winrate, а не по доходности — winrate стабилизируется быстрее.
Слабые местаПеречислю сам, чтобы не собирать это в комментариях.
Подгонка. Стек из трёх фильтров подбирался на SBER. Устойчивость проверял по подпериодам — плюс во всех, — но 187 сделок на бумагу за 2,5 года это немного. Полноценного walk-forward с переоптимизацией на этой конфигурации нет.
Train/test не делался. Прогон однопроходный по всему периоду. Учитывая, что плюс на GAZP/ROSN/NVTK сделан на падающем рынке, период надо бить пополам. Не сделано.
На фьючерсы не переносится. Проверял 9 ликвидных контрактов FORTS (SR, GZ, RN, Si, MM, GD, Brent, серебро, юань) на тех же параметрах: PF 0,57–1,04, ни одного проходного. Payoff везде здоровый 1,6–2,0, проваливается точность входа (win 22–38%). На акциях та же конфигурация работает — значит, дело в природе инструмента, а не в параметрах.
Про фантомный эдж на неликвиде. Отдельно поучительный случай: RVI дал лучший результат за всё исследование, PF 2,11 и +84%. Целиком артефакт. Покрытие сессии барами 5,5%, медианный объём 2 контракта, медианный интервал «пятиминутного» ряда 25 минут. Весь плюс делали 5 сделок из 45, медиана сделки −0,34%, а 11 стоп-лоссов из 34 закрылись в плюс — цена перескакивала уровень разрывом. Правило после этого: сначала покрытие сессии и медиана объёма, только потом PF.
Расхождение конфигурации. Цифры пула получены при min_gap_pct=0, а у бота в конфиге стоит 0,2. Это разные наборы сделок, на SBER примерно вдвое. Собираюсь перегнать на боевом значении.
Смена режима. Результат получен на падающем рынке. Что будет на растущем — открытый вопрос.
Про инфраструктуру короткоРаз уж речь про живую работу. Детектор зон не переписан под бота — импортируется из файла бэктестера, golden-тест сверяет сигналы с эталонным прогоном на 8 тикерах. Отдельный тест сверяет каждый параметр с пультом поимённо: однажды бот молча разошёлся по min_gap_pct и торговал вдвое больше зон, не уронив ни одного теста. Всего 712 тестов.
Из грабель, которые могут пригодиться: незакрытую свечу запрашивать нельзя — при слиянии parquet побеждает старая строка, и партиал остаётся в кэше навсегда. Защита тройная: изолированный кэш, запрос не дальше последней закрытой свечи, отбрасывание незакрытого бара после загрузки.
ВыводБэктест выглядит прилично: PF 1,22 на 1554 сделках, просадка 3,5%, бьёт buy&hold на 50 п.п. Живые две недели в минусе, и это ничего не опровергает, ровно как не подтвердило бы двухнедельный плюс.
Что я считаю реально установленным: чистый FVG эджа не даёт, эдж появляется от направленных фильтров, на фьючерсы не переносится, гранулярность исполнения решает больше, чем сами фильтры.
Что не установлено: держится ли это вне периода 2024–2026 и на растущем рынке. Вернусь с цифрами, когда наберётся выборка.
Готов ответить на вопросы по методике в комментариях. Если видите дыру в рассуждениях — говорите, для того и выкладываю.
Не является индивидуальной инвестиционной рекомендацией. Прошлые результаты не гарантируют будущих.
Веду канал про бэктестинг, там разборы стратегий с цифрами и отрицательными результатами тоже.