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
STOPS0 ± 2·STEP, срабатывает с буфером 0,5·STEP
PARTIAL — фиксация половиныS0 ± 6·STEP (KEY + 3·STEP), доля 0,5
TARGETS0 ± 8·STEP
REVERSALэкстремум забега ∓ 3·STEP → обратный сегмент
Дрейф KEYU + 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.

STOP_ONLY159 · −31220 · ср −196
PARTIAL_ONLY44 · +8345 · ср +190
REV_NO_PARTIAL32 · −3820 · ср −119
TARGET32 · +15135 · ср +473
GAP_NO_PARTIAL4 · +740

По 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. Конвейер

1

Ядро

core_cli.py по свечам, S0 и STEP → RIZ6_events.json: все события цепи.

у нас: s0/base/

2

Сегменты

enrich_events.py группирует события ENTRY → PARTIAL? → EXIT, восстанавливает время → segments.csv.

s0/calibrator

3

Джойн с Width

filter_test.py + ряд dh_dynamics.py: группы, Width на t = 0/5/15/45, lag → filtered_segments.csv.

s0/calibrator

4

Сигналы A

dh_signals.py: всплеск ширины от залипшего минимума на mult × STEP.

s0/calibrator

5

Сигналы B

sector_1_8_events_v2.py: пробой нижней 1/8 скользящего диапазона ширины.

s0/calibrator

6

Сигналы × сегменты

attach_signals_v2.py: для каждого сегмента есть ли сигнал before / at / inside / after.

s0/calibrator

7

Аналитика

lag_analysis, skip_test, combined_filter, pre_chain_context, rev_stop_to_target, target_*, signal_*.

s0/calibrator

8

Out-of-sample

oos_check.py: прогон всех правил на срезах по времени.

план

9

Оркестратор

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 — самый сильный одиночный предиктор сверено

TARGET7,5 мин
PARTIAL10 мин
REV15 мин
STOP40 мин

Медиана времени от появления S0 до входа. Если цена прошла 3 STEP за 1–2 свечи, это импульс, и он чаще доходит дальше. Медленное подползание к KEY — признак будущего стопа. Оптимум для IMPULSE: lag ≤ 10 (precision 0,43, recall 0,56).

2. Состояние Width на входе сверено

медиана на входеTARGETPARTIAL_ONLYREV_NO_PARTIALSTOP_ONLY
l_abs (длинное)660800878750
s_abs (короткое)330230378245
ratio0,450,320,400,30
spread_abs353470483518

У 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.1IMPULSE имеет отличный от остальных профиль Widthда
H1.2TARGET отличается от PARTIAL по Widthда
H1.3Простой Width-фильтр на входе даёт precision > 0,5нет, 0,23
H1.4FORBID как запрет даёт precision > 0,7да, 0,80
H1.5Lag от S0 предсказывает исходда
H1.6SkipA: пропуск после TARGET в ту же сторонуслабо
H1.7SkipB: пропуск после любого выхода в ту же сторонунет, p = 28,9 %
H1.8«Ждать два стопа» даёт плюснет
H1.9REV → TARGET — систематический переходда, lift 1,85
H1.10LAG + FORBID + skip дают положительный P&L на обоих срезахда
H1.11PARTIAL_VETO: prev = PARTIAL_ONLY и prev_l_abs < 700да, n = 14: 10 STOP, 1 TARGET
H1.12REV_VETO: prev = REV и (prev_l_abs < 600 или prev_lag > 10)да, n = 18: 12 STOP, 2 TARGET
H1.13PRIORITY_REV даёт 100 % победn = 3
H1.14PARTIAL_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.4prevprev = REV → почти всегда A5 из 5
H2.5REV сам по себе — триггер продолжениянет, 2 из 32
H2.6Экстремумы Width на REV предсказывают TARGETнет
H2.7REV + Width → P(следующий TARGET) 30–40 %да
H2.8STOP + 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

Сегмент проходит последовательно через пять запретов. Приоритеты ничего не блокируют, это только метки.

  1. LAG — lag_from_s0_min ≤ 10
  2. FORBID — нет: l_abs > 850, или spread > 550, или ratio < 0,22
  3. TARGET-skip — нет: prev = TARGET в ту же сторону
  4. PARTIAL_VETO — нет: prev = PARTIAL_ONLY и prev_l_abs < 700
  5. 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

Результат

271 сегмент · ср −39,9
47
срезnср P&Limp %wr %улучш.
до 6 сен18+27,550,044,4+108,5
7 сен +29+74,555,255,2+101,4
весь47+56,553,251,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. Выходные дни вырезаются до построения профиля, ночные гэпы остаются.

Четыре отношения сигнала к сегменту

вход ━━━━━━ сегмент ━━━━━━ выход
before [вход − 60 мин, вход)
at вход ± 5 мин — подтверждение входа
inside (вход, выход) — подтверждение продолжения
after (выход, выход + 30 мин] — смена режима

Открытие сессии 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, концепция)

Было: зафиксированные пороги → натягиваем на инструмент.
Стало: процедура исследования → порождает пороги для каждого инструмента.

0

Загрузка

Ряд Width + segments.csv, проверка дат, пропусков, диапазона → base_info.

1

База

Распределение групп, базовый P&L и win rate, медианы Width и lag по группам.

2

Одиночные предикторы

Свипы lag, l/m/s_abs, spread, ratio отдельно по группам → пороги.

3

Запреты

FORBID, PARTIAL_VETO, REV_VETO — X, Y, Z через свип.

4

Приоритеты

PRIORITY_REV, PRIORITY_PARTIAL — свип и 2D-сетки.

5

Переходы

Матрица переходов, топ цепочек из 4, серии 3+ в одну сторону.

6

Удержание

TARGET → A/B, свип delta_l_abs, prevprev = REV.

7

Сигналы dh

Каналы A и B, джойн, H3.1–H3.7.

8

Комбинированный фильтр

Сборка правил, свип lag, три среза по времени.

9

Экспорт

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 (кроме первого).

Как прогнано

  1. Свечи и сделки цепочки → candles.csv (формат MOEX, как RI5M.csv) и segments.csv в полях enrich_events.py (research/protocol/prepare_contour.py)
  2. Скрипты автора без правок: 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
  3. 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. База: поток уже в плюсе

STOP_ONLY26 · −17792 · ср −684
TARGET21 · +28838 · ср +1373
REV_NO_PARTIAL9 · −3941 · ср −438
PARTIAL_ONLY5 · +2541 · ср +508

Всего +9646 пунктов, в среднем +158 на сделку (+0,45 STEP), прибыльных 41 %. У RIZ6 было −0,33 STEP на сделку. TARGET на BTC втрое чаще (34 % против 12 %). Поэтому задача протокола здесь другая: не отсеять убыточный поток, а не испортить прибыльный.

RIZ6 и BTCUSDT рядом

признакRIZ6 5MBTCUSDT 5Mчто значит
сегментов27161у BTC в 4,5 раза меньше, все пороги — наблюдения
средний P&L, STEP−0,33+0,45базовый поток BTC прибыльный
медиана l_abs у TARGET, STEP5,53,0сегмент BTC (8 STEP) крупнее своей 45-свечной ширины почти втрое
l_abs: TARGET / STOP660 / 7501040 / 1037на BTC ширина на входе исходы не различает
медиана lag: TARGET / STOP, мин7,5 / 40195 / 150у BTC 3 STEP проходятся часами, и быстрые входы хуже
lift TARGET после REV1,850,32противоположно
lift TARGET после TARGET0,531,66BTC — инерция, RIZ6 — возврат
FORBID, precision0,800,57 свой · 0,29 переносзапрет по ширине на BTC слабый
фильтр входа47 · +56,514 · +415 в выборке
9 · −73 на проверке
свой фильтр BTC не держится

Что показал прогон

  1. 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.
  2. Ширина на входе почти ничего не говорит. Медианы l_abs, s_abs, ratio и spread у TARGET и STOP совпадают. Свипы находят пороги, но только на 7–15 сделках, например ratio ≤ 0,25: 15 сделок, +712. Ни один не проверен вне выборки.
  3. Переходы — инерция. После TARGET следующий TARGET в 57 % случаев, после REV в 11 %. Поэтому TARGET-skip автора («после TARGET в ту же сторону не входить») на BTC вредит: он выкидывает 9 сделок на +1144. Лучшая цепочка из трёх предыдущих — TARGET → TARGET → TARGET: дальше 7 случаев, в среднем +545. После двух стопов подряд — 11 случаев, в среднем +390. После трёх — уже 4 случая, +21; «STOP×3 → TARGET» автора здесь не повторяется.
  4. Правило автора через STEP не переносится. LAG ≤ 10, FORBID и veto в пересчёте на STEP 350 пропускают 6 сделок, все в минус, в среднем −372. FORBID в этом пересчёте выкидывает 9 TARGET из 14 пойманных.
  5. Свой фильтр BTC — подгонка. На всех 61 он отбирает 14 сделок, +415 (lag ≤ 360, FORBID 1040 / 937 / 0,13, veto). Честно: пороги на первых 36, затем последние 25. В выборке 11 сделок, +386; на проверке 9 сделок, −73 против +161 у всего потока. Вердикт профиля: не применять.
  6. Сигналы dh. Из 9 каналов до входа на обеих половинах устоял один: B_st at, касание буфера 1/8 на коротком окне в пределах ±5 мин от входа. Первая часть: 11 сделок, +301 против +92 без сигнала. Вторая: 7 сделок, +444 против +51. кандидат — 18 случаев, и канал выбран как лучший по всей выборке. Ещё A_m before: 7 / +408 и 3 / +431, но это слишком мало.
  7. Сигнал inside — артефакт длины сделки. Сегменты с сигналом внутри живут медианно 100–210 свечей, без него 7–58. Чем дольше сделка, тем вероятнее в неё попадёт сигнал, а дольше всех живут TARGET. Поэтому «+930 при A_s inside» ничего не говорит о будущем. Это касается и правила №4 и PRIORITY_STRONG у RIZ6: их нужно проверять с учётом момента сигнала, а не по факту его наличия.
  8. Удержание за 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 — попытка увидеть начало импульса прямо по ширине, без уровней сегмента.

Что стоит учитывать, прежде чем переносить цифры

  1. 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-правил на первой половине не проверена.
  2. Это не настоящий out-of-sample. Пороги 850/550/0,22, 700, 600 подбирались на всём файле, потом этот же файл резался на две половины. Честная проверка — подобрать пороги на первой части и только потом применить ко второй. Как раз это и есть план oos_check.py (уровень 7).
  3. Малые выборки. PRIORITY_REV: n = 3, PRIORITY_PARTIAL: n = 1, «prevprev = REV → 5 из 5», «STOP×3 → TARGET»: n = 11. Это наблюдения, а не правила. Протокол сам это признаёт, но в рекомендации они уже попали.
  4. Lag считается по календарю. Это entry_time − exit_time предыдущего сегмента. Ночной перерыв MOEX попадает внутрь лага и делает его «длинным». Контроль lag_min_* есть у признаков Width, но не у самого lag.
  5. Пороги в пунктах РТС. 850, 600, 500 — это 7, 5 и 4 STEP при STEP = 120. На другом инструменте их надо выражать через STEP или через профиль. Часть IV об этом и говорит.
  6. Hold-mode пока только оценка. +1,77·STEP посчитаны по следующему сегменту, а не прогоном по свечам с реальным стопом.
  7. Документ склеен из нескольких сессий. «Сессия 3» встречается дважды. В плане enrich_events «доработать», в части IV — «уже доработан». Часть III числится в плане, хотя скрипты по ней уже есть. Нет «части V» с результатами inside-сигналов. Нет 6.4 «Данные».
  8. 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, ширина в пунктах, выгрузка ряда), поэтому взят он.