S0 · ИССЛЕДОВАНИЕ
Research Protocol v1.0: Segment Engine + dh-dynamics
Разбор протокола автора от 12.10.2026 и архива его рабочей папки DesktopCalibrator. Эталон — RIZ6 (фьючерс на индекс РТС, декабрь 2026), таймфрейм 5M, период 31.08 → 10.10.2026, 271 сегмент, S0 = 77970, STEP = 120. Все цифры ниже — из протокола; там, где я пересчитал их по segments.csv и impulse_profile.csv из архива, стоит пометка сверено.
Коротко
- Что исследуют. Поток сегментов Core v2 сам по себе убыточен: 271 сделка, −10820 пунктов, в среднем −39,9 на сделку, прибыльных 32,8 %. Задача — найти, какие сегменты не брать, а какие держать дольше.
- Чем. Новый слой — dh-dynamics: три ширины коридора волатильности (короткое, среднее, длинное окно) и их отношение. Плюс время от S0 до входа (lag) и то, чем закончились предыдущие сегменты.
- Главная находка. Сильнее всего исход предсказывает скорость: TARGET доходит до KEY за 7,5 минуты (медиана), STOP — за 40. Второй признак — «сжатое длинное + раздутое короткое» на входе.
- Результат. Фильтр входа v2 оставляет 47 сделок из 271 (17 %), средний результат +56,5 против −39,9 у всего потока.
- Наш первый профиль — BTCUSDT 5M (раздел 13). На 61 сегменте нашей цепочки lag и переходы работают с обратным знаком. Правило RIZ6 в пересчёте через STEP пропускает 6 сделок, и все в минус. Свой фильтр BTC не прошёл проверку на отложенной части.
- Куда идёт. От фиксированных порогов RIZ6 к протоколу профилирования: одна и та же процедура на любом инструменте сама находит его пороги («ДНК инструмента»). Сравнение профилей разных рынков должно отделить общие законы от подгонки.
1. Объект исследования: сегмент Core v2
Сегменты строит тот же авторский core.py, что лежит у нас в s0/base/. Все уровни отсчитываются от S0 в шагах STEP в сторону сегмента: вверх у LONG, вниз у SHORT.
| KEY — вход | S0 ± 3·STEP |
|---|---|
| STOP | S0 ± 2·STEP, срабатывает с буфером 0,5·STEP |
| PARTIAL — фиксация половины | S0 ± 6·STEP (KEY + 3·STEP), доля 0,5 |
| TARGET | S0 ± 8·STEP |
| REVERSAL | экстремум забега ∓ 3·STEP → обратный сегмент |
| Дрейф KEY | U + D ≤ 2·STEP (MAX_TOTAL_DEVIATION) |
Уточнение к записи STOP
В протоколе STOP записан как «S0 ∓ 2·STEP», то есть будто бы по другую сторону S0. В данных он лежит с той же стороны, что и KEY, на шаг ближе к S0. Первый сегмент: LONG, S0 = 77970, KEY = 78330, STOP = 78210 = S0 + 2·120. Значит, риск от входа до стопа — 1 STEP плюс буфер, а не 5 STEP. сверено
2. Новый слой: dh-dynamics
Что такое ширина
DH-уровни свечи — это её open и середина тела (open + close)/2. Тени не используются. Ширина окна — расстояние между крайними DH-уровнями за последние w свечей. Для 5M окна такие: short w = 5, medium w = 15, long w = 45. Это 25 минут, 75 минут и 3,75 часа.
s_abs, m_abs, l_abs — ширины в пунктах
spread_abs = l_abs − s_abs
ratio = s_abs / l_abs
ratio близок к 1, когда последние 5 свечей одни дают почти весь размах длинного окна: «короткое раздулось». Малый ratio означает, что рынок сейчас стоит внутри широкого старого диапазона.
Как ширины пристёгиваются к сегменту
filter_test.py берёт строку ряда Width на момент входа и за 5, 15 и 45 минут до него. Получаются признаки l_abs_0, l_abs_5, l_abs_15, l_abs_45 и так далее. Признак lag_min_* — контроль: не склеилась ли точка через ночной перерыв торгов.
lag_from_s0_min — минуты от выхода из предыдущего сегмента (когда появилась S0 текущего) до входа по KEY. Проще говоря, как быстро цена прошла первые 3 STEP.
3. Исходы сегмента — пять групп
Группа складывается из события выхода и того, был ли до него PARTIAL. TARGET и PARTIAL нельзя сливать в одну «успешную» группу: протокол прямо называет это методической ошибкой. Вместе они составляют IMPULSE — сегменты, где цена дошла хотя бы до 6·STEP.
По impulse_profile.csv сверено. В профиле протокола PARTIAL_ONLY = 43 и GAP_WITH_PARTIAL = 1: один гэп с частичной фиксацией вынесен отдельно. PARTIAL_ONLY здесь — это REVERSAL после PARTIAL. Стоп после PARTIAL (STOP_AFTER_PARTIAL) в коде предусмотрен, но в данных RIZ6 не встретился.
Картина простая: весь минус дают STOP_ONLY (59 % сделок, −31220). TARGET и PARTIAL вместе зарабатывают +23480, но этого не хватает. Поэтому любой фильтр оценивается по тому, сколько STOP он отсекает и сколько IMPULSE при этом теряет.
4. Принципы методологии
Один признак за раз
Сначала каждый признак отдельно (скрининг, свипы по порогу), потом комбинации.
Случайный пропуск как контроль
Правило пропуска сравнивается со случайным пропуском того же объёма. Так погиб SkipB: p = 28,9 %.
Время, а не перемешивание
Train/test делится по времени. Три среза: начало → середина, середина → конец, весь файл.
Группы не смешивать
TARGET, PARTIAL, STOP, REV разбираются по отдельности.
Out-of-sample до внедрения
Правило идёт в core.py, только если устояло на срезе, на котором не подбиралось.
Без ML на малых выборках
Правила должны читаться человеком. Дерево глубины 3 допускается только как способ найти пороги.
5. Конвейер
Ядро
core_cli.py по свечам, S0 и STEP → RIZ6_events.json: все события цепи.
у нас: s0/base/
Сегменты
enrich_events.py группирует события ENTRY → PARTIAL? → EXIT, восстанавливает время → segments.csv.
s0/calibrator
Джойн с Width
filter_test.py + ряд dh_dynamics.py: группы, Width на t = 0/5/15/45, lag → filtered_segments.csv.
s0/calibrator
Сигналы A
dh_signals.py: всплеск ширины от залипшего минимума на mult × STEP.
s0/calibrator
Сигналы B
sector_1_8_events_v2.py: пробой нижней 1/8 скользящего диапазона ширины.
s0/calibrator
Сигналы × сегменты
attach_signals_v2.py: для каждого сегмента есть ли сигнал before / at / inside / after.
s0/calibrator
Аналитика
lag_analysis, skip_test, combined_filter, pre_chain_context, rev_stop_to_target, target_*, signal_*.
s0/calibrator
Out-of-sample
oos_check.py: прогон всех правил на срезах по времени.
план
Оркестратор
step_protocol.py, profile_writer.py, profiles_comparison.py, hold_beyond_target_test.py.
у нас: research/protocol/step_protocol.py
После каждого шага в протоколе есть ручная проверка: число событий, exit_event.value_counts(), распределение групп, размер файла сигналов.
6. Три ключевых признака
1. Lag от S0 — самый сильный одиночный предиктор сверено
Медиана времени от появления S0 до входа. Если цена прошла 3 STEP за 1–2 свечи, это импульс, и он чаще доходит дальше. Медленное подползание к KEY — признак будущего стопа. Оптимум для IMPULSE: lag ≤ 10 (precision 0,43, recall 0,56).
2. Состояние Width на входе сверено
| медиана на входе | TARGET | PARTIAL_ONLY | REV_NO_PARTIAL | STOP_ONLY |
|---|---|---|---|---|
| l_abs (длинное) | 660 | 800 | 878 | 750 |
| s_abs (короткое) | 330 | 230 | 378 | 245 |
| ratio | 0,45 | 0,32 | 0,40 | 0,30 |
| spread_abs | 353 | 470 | 483 | 518 |
У TARGET длинное окно сжато, а короткое раздуто: расхождение, новое движение внутри спокойного фона. У STOP раздуты оба окна, рынок уже «расплескался». Профиль TARGET: l_abs < 700, s_abs > 300, ratio > 0,40, spread < 400. Как самостоятельный фильтр он не работает (precision 0,23), зато зеркальное правило-запрет работает.
3. Контекст двух предыдущих сегментов
Важно, что было до (prev) и до-до (prevprev). REV_NO_PARTIAL в роли prev почти вдвое повышает шанс следующего TARGET (lift 1,85). PARTIAL_ONLY, наоборот, понижает (lift 0,79). Если prevprev = REV, после TARGET рынок продолжил движение в 5 случаях из 5. Сжатие длинного окна от prevprev к TARGET (delta_l_abs > 100) даёт precision 0,75.
7. Каталог гипотез
Часть I — Width и lag в сегментах
| H1.1 | IMPULSE имеет отличный от остальных профиль Width | да |
| H1.2 | TARGET отличается от PARTIAL по Width | да |
| H1.3 | Простой Width-фильтр на входе даёт precision > 0,5 | нет, 0,23 |
| H1.4 | FORBID как запрет даёт precision > 0,7 | да, 0,80 |
| H1.5 | Lag от S0 предсказывает исход | да |
| H1.6 | SkipA: пропуск после TARGET в ту же сторону | слабо |
| H1.7 | SkipB: пропуск после любого выхода в ту же сторону | нет, p = 28,9 % |
| H1.8 | «Ждать два стопа» даёт плюс | нет |
| H1.9 | REV → TARGET — систематический переход | да, lift 1,85 |
| H1.10 | LAG + FORBID + skip дают положительный P&L на обоих срезах | да |
| H1.11 | PARTIAL_VETO: prev = PARTIAL_ONLY и prev_l_abs < 700 | да, n = 14: 10 STOP, 1 TARGET |
| H1.12 | REV_VETO: prev = REV и (prev_l_abs < 600 или prev_lag > 10) | да, n = 18: 12 STOP, 2 TARGET |
| H1.13 | PRIORITY_REV даёт 100 % побед | n = 3 |
| H1.14 | PARTIAL_ONLY и REV_NO_PARTIAL в роли prev действуют противоположно | да: 9,3 % против 21,9 % |
Часть II — цепочки и удержание
| H2.1 | После TARGET в 59 % случаев активируется следующий сегмент в ту же сторону | да |
| H2.2 | Продолжение (A) или разворот (B) видно по Width на TARGET | слабо, 0,55 |
| H2.3 | Сжатие от prevprev к TARGET предсказывает продолжение A | да, 0,75 |
| H2.4 | prevprev = REV → почти всегда A | 5 из 5 |
| H2.5 | REV сам по себе — триггер продолжения | нет, 2 из 32 |
| H2.6 | Экстремумы Width на REV предсказывают TARGET | нет |
| H2.7 | REV + Width → P(следующий TARGET) 30–40 % | да |
| H2.8 | STOP + Width → P(следующий TARGET) 22 % | да |
| H2.9 | После REV хорош короткий lag, после STOP — длинный | да |
| H2.10 | Запрет после REV: lag > 10 или l_abs < 600 → P = 0 | да |
| H2.11 | Запрет после STOP: m_abs > 600 → P = 0 | да |
Часть III — сигналы dh
| H3.1 | Сигналы A чаще предшествуют TARGET, чем STOP | план |
| H3.2 | Сигналы B чаще предшествуют TARGET, чем STOP | план |
| H3.3 | У TARGET путь от сигнала до входа короче | план |
| H3.4 | Цепочки A чаще начинаются с сигнала | план |
| H3.5 | Сигнал + prevprev = REV улучшают precision | план |
| H3.6 | Сигналы дают информацию сверх lag | план |
| H3.7 | Сигналы A и B вместе усиливают друг друга | план |
По архиву часть III уже прогнана: есть attach_signals_v2, signal_deep_analysis и combined_filter v3 с PRIORITY_STRONG. Протокол ссылается на «часть V» с открытием «сигнал внутри сегмента», но самой части V в файле нет (см. раздел 14).
8. Фильтр входа v2
Сегмент проходит последовательно через пять запретов. Приоритеты ничего не блокируют, это только метки.
- LAG — lag_from_s0_min ≤ 10
- FORBID — нет: l_abs > 850, или spread > 550, или ratio < 0,22
- TARGET-skip — нет: prev = TARGET в ту же сторону
- PARTIAL_VETO — нет: prev = PARTIAL_ONLY и prev_l_abs < 700
- REV_VETO — нет: prev = REV_NO_PARTIAL и (prev_l_abs < 600 или prev_lag > 10)
PRIORITY_REV = prev REV_NO_PARTIAL и (prev_l_abs > 600 или prev_ratio > 0,45) → n 3, ср +468
PRIORITY_PARTIAL = prev PARTIAL_ONLY и prev_l_abs > 1000 и prev_ratio < 0,30 → n 1, +170
PRIORITY_STRONG (v3) = внутри сегмента был сигнал dh
Результат
| срез | n | ср P&L | imp % | wr % | улучш. |
|---|---|---|---|---|---|
| до 6 сен | 18 | +27,5 | 50,0 | 44,4 | +108,5 |
| 7 сен + | 29 | +74,5 | 55,2 | 55,2 | +101,4 |
| весь | 47 | +56,5 | 53,2 | 51,1 | +96,4 |
Плато положительного P&L по lag: в первой половине 5–10, во второй 5–60, на всём файле 5–20. Остались резервы: внутри PASSED ещё 16 STOP_ONLY (−4100) и 6 REV (−1000). Если их убрать, средний был бы около +165.
9. Правила после входа
Держать за TARGET
если delta_l_abs > 100 или prevprev = REV:
держать до активации N+1, выход +3·STEP
иначе: выход на TARGET
Оценка: +1,77·STEP на TARGET-сделку, precision 0,75–0,80. Это оценка по сегментам, а не прогон по свечам: hold_beyond_target_test.py только запланирован, со свипом стопа 0–3 STEP и удержания 2–4 STEP.
Подтверждение сигналом (правило №4)
Вход по обычному фильтру. Если в сделке сработал сигнал dh (A_l, A_m, B_lt, B_st inside), то держать до TARGET и не закрывать половину на PARTIAL. Если не сработал — обычное поведение.
После REV — следующий TARGET
lag ≤ 10 и (l_abs > 600 или ratio > 0,45) → 30–40 %
lag > 10 или l_abs < 600 → 0 %
После STOP — следующий TARGET
l_abs < 500 и ratio > 0,55 → 22 %
l_abs < 500 и lag 20–60 → 40 %
m_abs > 600 → 0 %
Особый паттерн: STOP → STOP → STOP → TARGET, n = 11, в среднем +470.
10. Сигналы dh: каналы A и B
Канал A — всплеск от якоря (dh_signals.py)
Якорь «залипает» на локальном минимуме ширины и опускается вместе с ней. Когда ширина поднимается над якорем на target = mult × STEP (по умолчанию 2·STEP = 240 п.), это сигнал. После сигнала отслеживается максимум. Откат ширины на target/2 от него перезаряжает якорь.
Источник — s_abs, m_abs или l_abs, отсюда каналы A_s, A_m, A_l.
Канал B — выход из нижней 1/8 (sector_1_8_events_v2.py)
По скользящему окну ширины (от 200 свечей до окна профиля) берутся W_min и W_max, R = W_max − W_min. Диапазон делится на 8 секторов, B_1 = W_min + R/8.
strict: ширина пересекла B_1 снизу вверх
touch: пересекла буфер B_1 + R/16, уже стоя выше B_1
Три окна × strict/touch дают 6 каналов: B_ss, B_st, B_ms, B_mt, B_ls, B_lt. Выходные дни вырезаются до построения профиля, ночные гэпы остаются.
Четыре отношения сигнала к сегменту
Открытие сессии 3: решает inside, то есть сигнал не до входа, а во время сделки. Отсюда правило №4 и PRIORITY_STRONG. Сигнал after слабо намекает, что следующий вход в ту же сторону сработает. Это отложено. Следующий уровень детализации — когда внутри сегмента пришёл сигнал: ранний подтверждает вход, поздний — продолжение.
11. Что опровергнуто
- SkipB не отличается от случайного пропуска (p = 28,9 %).
- «Ждать два стопа» не работает: серии STOP продолжаются, а не разворачиваются.
- REV как триггер продолжения: только 2 из 32.
- Пики Width на REV все ведут к STOP или REV, не к TARGET.
- Простой Width-фильтр на вход: precision 0,23.
- Объединять TARGET и PARTIAL методически неверно.
- TARGET-skip отдельно слаб, работает только в связке.
12. Часть IV — протокол профилирования (v1.2, концепция)
Было: зафиксированные пороги → натягиваем на инструмент.
Стало: процедура исследования → порождает пороги для каждого инструмента.
Загрузка
Ряд Width + segments.csv, проверка дат, пропусков, диапазона → base_info.
База
Распределение групп, базовый P&L и win rate, медианы Width и lag по группам.
Одиночные предикторы
Свипы lag, l/m/s_abs, spread, ratio отдельно по группам → пороги.
Запреты
FORBID, PARTIAL_VETO, REV_VETO — X, Y, Z через свип.
Приоритеты
PRIORITY_REV, PRIORITY_PARTIAL — свип и 2D-сетки.
Переходы
Матрица переходов, топ цепочек из 4, серии 3+ в одну сторону.
Удержание
TARGET → A/B, свип delta_l_abs, prevprev = REV.
Сигналы dh
Каналы A и B, джойн, H3.1–H3.7.
Комбинированный фильтр
Сборка правил, свип lag, три среза по времени.
Экспорт
profile_<инструмент>.json + profiles_comparison.csv + рекомендации.
Принципы
- Порядок исследований одинаков для всех инструментов, пороги у каждого свои.
- Профиль живой: при новом периоде он пересчитывается, а структура сохраняется.
- Если правило работает везде, это закон рынка. Если на одном инструменте — специфика или подгонка.
- Шаги независимы: нет REV-сегментов — шаг пропускается и пишется null, протокол не падает.
- Скрипты-исследователи не переписываются, протокол их только оркеструет.
Профиль RIZ6 (сокращённо)
base: 271 сегм, avg −39.9, wr 32.8
single: lag ≤ 10 (P 0.43, R 0.56)
veto: FORBID 850/550/0.22 → 0.80
PARTIAL_VETO 700 → 0.71
REV_VETO 600 / lag 10 → 0.83
transitions: REV→TARGET lift 1.85
STOP×3 → TARGET, n 11, +470
hold_mode: delta_l_abs 100, EV 1.77·STEP
dh_signals: null (not tested yet)
combined: 47 / +56.5 / oos_okКалибровка под другой инструмент: FORBID нужно пересчитать от медиан l_abs и spread, LAG_MAX — от медианы lag у TARGET, delta_l_abs — от STEP или R. Открыт вопрос, как сравнивать результаты: парсить stdout скриптов хрупко, альтернатива — переделать их в библиотеку функций.
13. Первый профиль по части IV: BTCUSDT 5M прогон 15.10.2026
Протокол прогнан на нашем контуре BTCUSDT 5M (Bybit, бессрочный USDT-фьючерс). Сегменты взяты из живой цепочки сайта: S0 = 78236,6 от 01.09.2026, STEP = 350, снимок 15.10 10:30 UTC. Это 61 закрытый сегмент и 12972 свечи без единого пропуска. Ширина есть у всех 61, lag — у 60 (кроме первого).
Как прогнано
- Свечи и сделки цепочки →
candles.csv(формат MOEX, как RI5M.csv) иsegments.csvв поляхenrich_events.py(research/protocol/prepare_contour.py) - Скрипты автора без правок:
dh_dynamics(5/15/45, пункты,--max-candles 100000),filter_test,dh_signalsиsector_1_8_events_v2на трёх окнах (A: 2·STEP = 700; B:--no-skip-weekends),attach_signals_v2,signal_deep_analysisи вся аналитика частей I–II - STEP 0–9 части IV —
research/protocol/step_protocol.py. Оркестратора у автора нет, он написан по разделу 3 части IV
Как ищутся пороги
Одна мера для всех правил: (средний P&L прошедших − средний всех) × √n прошедших. Она не даёт выбрать правило, которое оставляет 2–3 удачные сделки. Минимум 5 случаев, для правил по предыдущему сегменту 3. Ширины дополнительно переведены в STEP, чтобы сравнивать с RIZ6.
Отдельно проверено правило автора, перенесённое через STEP: пороги RIZ6 × 350/120 (FORBID 2479 / 1604 / 0,22, veto 2042 и 1750). Так проверяется, универсальны ли пороги автора.
Out-of-sample честный: пороги LAG и FORBID подбираются на первых 60 % сегментов (36, до 28.09), проверяются на последних 25.
STEP 1. База: поток уже в плюсе
Всего +9646 пунктов, в среднем +158 на сделку (+0,45 STEP), прибыльных 41 %. У RIZ6 было −0,33 STEP на сделку. TARGET на BTC втрое чаще (34 % против 12 %). Поэтому задача протокола здесь другая: не отсеять убыточный поток, а не испортить прибыльный.
RIZ6 и BTCUSDT рядом
| признак | RIZ6 5M | BTCUSDT 5M | что значит |
|---|---|---|---|
| сегментов | 271 | 61 | у BTC в 4,5 раза меньше, все пороги — наблюдения |
| средний P&L, STEP | −0,33 | +0,45 | базовый поток BTC прибыльный |
| медиана l_abs у TARGET, STEP | 5,5 | 3,0 | сегмент BTC (8 STEP) крупнее своей 45-свечной ширины почти втрое |
| l_abs: TARGET / STOP | 660 / 750 | 1040 / 1037 | на BTC ширина на входе исходы не различает |
| медиана lag: TARGET / STOP, мин | 7,5 / 40 | 195 / 150 | у BTC 3 STEP проходятся часами, и быстрые входы хуже |
| lift TARGET после REV | 1,85 | 0,32 | противоположно |
| lift TARGET после TARGET | 0,53 | 1,66 | BTC — инерция, RIZ6 — возврат |
| FORBID, precision | 0,80 | 0,57 свой · 0,29 перенос | запрет по ширине на BTC слабый |
| фильтр входа | 47 · +56,5 | 14 · +415 в выборке 9 · −73 на проверке | свой фильтр BTC не держится |
Что показал прогон
- Lag работает наоборот. Lag ≤ 10 мин на BTC почти всегда означает вход сразу после разворота: все 14 случаев с lag = 0 идут за REVERSAL. Это наш мгновенный обратный сегмент (#114). Такие 19 сделок дают в среднем −130, остальные 42 дают +289. Правило автора «lag ≤ 10» оставило бы на BTC худшие сделки. Свип: lag ≤ 10 → 19 сделок, −130; ≤ 120 → 30, +136; ≤ 360 → 44, +212; без ограничения → 61, +158.
- Ширина на входе почти ничего не говорит. Медианы l_abs, s_abs, ratio и spread у TARGET и STOP совпадают. Свипы находят пороги, но только на 7–15 сделках, например ratio ≤ 0,25: 15 сделок, +712. Ни один не проверен вне выборки.
- Переходы — инерция. После TARGET следующий TARGET в 57 % случаев, после REV в 11 %. Поэтому TARGET-skip автора («после TARGET в ту же сторону не входить») на BTC вредит: он выкидывает 9 сделок на +1144. Лучшая цепочка из трёх предыдущих — TARGET → TARGET → TARGET: дальше 7 случаев, в среднем +545. После двух стопов подряд — 11 случаев, в среднем +390. После трёх — уже 4 случая, +21; «STOP×3 → TARGET» автора здесь не повторяется.
- Правило автора через STEP не переносится. LAG ≤ 10, FORBID и veto в пересчёте на STEP 350 пропускают 6 сделок, все в минус, в среднем −372. FORBID в этом пересчёте выкидывает 9 TARGET из 14 пойманных.
- Свой фильтр BTC — подгонка. На всех 61 он отбирает 14 сделок, +415 (lag ≤ 360, FORBID 1040 / 937 / 0,13, veto). Честно: пороги на первых 36, затем последние 25. В выборке 11 сделок, +386; на проверке 9 сделок, −73 против +161 у всего потока. Вердикт профиля: не применять.
- Сигналы dh. Из 9 каналов до входа на обеих половинах устоял один: B_st at, касание буфера 1/8 на коротком окне в пределах ±5 мин от входа. Первая часть: 11 сделок, +301 против +92 без сигнала. Вторая: 7 сделок, +444 против +51. кандидат — 18 случаев, и канал выбран как лучший по всей выборке. Ещё A_m before: 7 / +408 и 3 / +431, но это слишком мало.
- Сигнал inside — артефакт длины сделки. Сегменты с сигналом внутри живут медианно 100–210 свечей, без него 7–58. Чем дольше сделка, тем вероятнее в неё попадёт сигнал, а дольше всех живут TARGET. Поэтому «+930 при A_s inside» ничего не говорит о будущем. Это касается и правила №4 и PRIORITY_STRONG у RIZ6: их нужно проверять с учётом момента сигнала, а не по факту его наличия.
- Удержание за TARGET. Из 21 TARGET дальше в ту же сторону пошли 9 (A), развернулись 12 (B). delta_l_abs > 300 даёт A в 2 из 3, prevprev = REV — 2 из 2. EV не посчитан: без прогона по свечам (
hold_strategy_sim.pyу автора в плане) это догадка.
Профиль BTCUSDT 5M (сокращённо)
base: 61 сегм, avg +158 (+0.45 STEP), wr 41.0
single: lag ≥ 10 (P 0.49, R 0.77) — наоборот RIZ6
l_abs TARGET 1040 = STOP 1037
veto: FORBID 1040/937/0.13 → 0.57, 28 пойм.
PARTIAL_VETO 1146 → 3 из 3 STOP
REV_VETO prev_lag > 0 → 0.71
transitions: REV→TARGET lift 0.32
TARGET→TARGET lift 1.66
hold_mode: A 9 / B 12, EV null
dh_signals: B_st at — кандидат (обе половины)
combined: 14 / +415 в выборке
test 9 / −73 → oos_ok falseЧто из этого следует
- Порядок исследований переносится, пороги — нет. Это ровно принцип части IV, и BTC его подтвердил на первом же инструменте: два главных признака RIZ6, lag и переходы, на BTC работают с обратным знаком.
- 61 сегмента мало, чтобы найти фильтр. Чтобы профиль стал опорой, нужна длинная история. Цепочку с STEP 350 можно прогнать по свечам BTC 5M с 2021 года (они есть в базе), но это уже не живая цепочка сайта, а отдельный исследовательский прогон.
- Lag у нас зависит от правки #114. Мгновенный обратный сегмент делает lag = 0 после каждого разворота. Сравнивать lag с RIZ6 можно только с разбивкой по типу выхода предыдущего сегмента.
- Единственный кандидат для наблюдения на живой цепочке — B_st at.
Файлы прогона: research/protocol/out/btcusdt-5m/ — profile_BTCUSDT_5M.json (полный профиль STEP 0–9), filtered_segments_with_signals_v2.csv, ряд ширин, сигналы A и B, logs/ с выводом каждого скрипта автора. Сравнение инструментов — research/protocol/profiles_comparison.csv (RIZ6 из протокола + BTCUSDT). Повторный прогон: prepare_contour.py btcusdt-5m …, затем скрипты по разделу 5, затем step_protocol.py. signal_segment_analysis.py ждёт старый формат v1 файла сигналов и на v2 не запускается; его тесты H3.x покрывает signal_deep_analysis.py.
14. Как я это понял — выводы и замечания
Суть в одной мысли
Сегмент Core v2 — это ставка на импульс: вход на 3·STEP от S0, цель на 8·STEP. Протокол учится отличать настоящий импульс от медленного дрейфа к KEY, пока сделка ещё не открыта. Настоящий импульс быстрый (малый lag), начинается из сжатия (малый l_abs, большой ratio) и часто идёт после разворота (prev = REV). Дрейф медленный, приходит в уже раздутый рынок и заканчивается стопом. Сигналы dh — попытка увидеть начало импульса прямо по ширине, без уровней сегмента.
Что стоит учитывать, прежде чем переносить цифры
- Width есть не у всех сегментов. В
impulse_profile.csvширины пустые у первых 91 сегмента: всё до 10.09 12:00. Есть только у 180 из 271. сверено Причина вdh_dynamics.py: для 5M он по умолчанию считает только последние 5000 свечей (--max-candles). При торговом дне MOEX это примерно месяц от 10.10 назад. Значит, в срезе «до 6 сентября» Width не было ни у одного сегмента. Пустое сравнение даёт «ложь», поэтому FORBID и запреты по prev_l_abs там ничего не отсекали. Этот срез проверял только LAG и правила по prev. Устойчивость именно Width-правил на первой половине не проверена. - Это не настоящий out-of-sample. Пороги 850/550/0,22, 700, 600 подбирались на всём файле, потом этот же файл резался на две половины. Честная проверка — подобрать пороги на первой части и только потом применить ко второй. Как раз это и есть план
oos_check.py(уровень 7). - Малые выборки. PRIORITY_REV: n = 3, PRIORITY_PARTIAL: n = 1, «prevprev = REV → 5 из 5», «STOP×3 → TARGET»: n = 11. Это наблюдения, а не правила. Протокол сам это признаёт, но в рекомендации они уже попали.
- Lag считается по календарю. Это
entry_time − exit_timeпредыдущего сегмента. Ночной перерыв MOEX попадает внутрь лага и делает его «длинным». Контрольlag_min_*есть у признаков Width, но не у самого lag. - Пороги в пунктах РТС. 850, 600, 500 — это 7, 5 и 4 STEP при STEP = 120. На другом инструменте их надо выражать через STEP или через профиль. Часть IV об этом и говорит.
- Hold-mode пока только оценка. +1,77·STEP посчитаны по следующему сегменту, а не прогоном по свечам с реальным стопом.
- Документ склеен из нескольких сессий. «Сессия 3» встречается дважды. В плане enrich_events «доработать», в части IV — «уже доработан». Часть III числится в плане, хотя скрипты по ней уже есть. Нет «части V» с результатами inside-сигналов. Нет 6.4 «Данные».
- STOP записан как «S0 ∓ 2·STEP», а в данных он с той же стороны, что и KEY (раздел 1).
15. Что это значит для нашего проекта
Что переносится напрямую
- Ядро общее:
s0/base/core.py— тот же Core v2.volatility_phase.pyиз архива совпадает с нашим байт в байт. - У нас уже есть цепочки сегментов по BTC, ETH, BCH, SOL на 5M–4H (
s0/out). Значит, есть и материал для шагов 2–3 конвейера. - Сама процедура части IV: группы, свипы, запреты, переходы, три среза по времени. Она не зависит от рынка.
Что отличается
- В нашем
core.pyесть правки владельца. Встречный KEY по close забега (#107) и мгновенный обратный сегмент (#114) меняют REVERSAL. Склейка GLUE (#115, #118) даёт сегменты без сделки. Распределение групп у нас будет другим, а GLUE нужна отдельная группа. - Крипта торгуется 24/7: нет ночных гэпов и выходных. Lag становится чище, а
--skip-weekendsв канале B для неё надо выключать (--no-skip-weekends). - Пороги RIZ6 в пунктах неприменимы, а в пересчёте через STEP не работают. Профиль нужно строить заново для каждого контура. Первый такой профиль, BTCUSDT 5M, — в разделе 13.
16. Файлы
Скрипты архива лежат в s0/calibrator/ без правок, там же протокол (RESEARCH_PROTOCOL_v1.0.md) и README с картой «скрипт → шаг». Из архива не взят только volatility_phase.py: он совпадает с s0/base/volatility_phase.py. dh_dynamics.py из архива новее копии в пакете 02.10 (окна 5/15/45, ширина в пунктах, выгрузка ряда), поэтому взят он.