ЭКСПЕРИМЕНТ · ЗАДАЧА 2

Как строятся сегменты и вычисляется STEP

Разбор авторского кода S0 из пакета s0_crypto_bundle_20261002. Сегменты: engine/segment_visualization/core.py, rules.py, GEOMETRY_RULES.md. STEP: author_calibrator/step_protocol_v2_20261002.py и core.py. Проектная обвязка: scripts/s0_research.py, scripts/s0_trial.py. Числа в примерах взяты из сохранённых расчётов 02.10.2026.

Коротко

  • Сегмент — ценовой коридор высотой 8 STEP от точки S0 в одну сторону (LONG — вверх, SHORT — вниз). Внутри него фиксированные уровни: KEY (3), STOP (2), PARTIAL (6), TARGET (8).
  • Все решения принимаются только по close свечи. Тени и цвет свечи не используются.
  • Сегменты образуют цепочку: TARGET одного становится опорой следующего, откат на 3 STEP от экстремума close разворачивает цепочку в другую сторону.
  • STEP — единственный масштаб всей конструкции. Он подбирается один раз на начальном окне: перебором кандидатов, прогоном цепочки на том же окне и выбором максимального Score. Потом не меняется.
  • Диапазон перебора STEP задаёт типичный размер свечи (high−low) этого ТФ. Поэтому STEP ≈ размах обычной свечи, а сегмент ≈ 8 таких размахов.

1. Сегмент и уровни

TARGET = S0 + 8·STEP PARTIAL = S0 + 6·STEP KEY = S0 + 3·STEP STOP = S0 + 2·STEP стоп с буфером 1,5·STEP S0 KEY SHORT = S0 − 3·STEP 86320−3в STEP от S0 вход: close ≥ KEY 50% закрыто TARGET: остаток 8·STEP
Сегмент LONG. Для SHORT всё зеркально: TARGET = S0 − 8·STEP и т. д. Линия — условный путь close.
УровеньLONGSHORTЗачем
S0началоначалонижняя/верхняя граница сегмента
KEYS0 + 3·STEPS0 − 3·STEPclose на KEY или за ним активирует сегмент (равенство — тоже)
STOPS0 + 2·STEPS0 − 2·STEPуровень стопа; срабатывает с буфером 0,5·STEP
стоп с буферомS0 + 1,5·STEPS0 − 1,5·STEPclose здесь или за ним закрывает позицию
PARTIALS0 + 6·STEPS0 − 6·STEPзакрыть 50% первоначального объёма (один раз)
TARGETS0 + 8·STEPS0 − 8·STEPзакрыть остаток; конец сегмента

Геометрические границы сегмента — S0 и TARGET. Все уровни считаются от S0 и не пересчитываются от фактической цены входа.

Пока направления нет (самое начало), видны оба KEY: S0 + 3·STEP и S0 − 3·STEP. Какой close пробьёт первым, тот и задаёт направление.

2. Жизненный цикл сегмента

ОЖИДАНИЕнаправления нетвидны оба KEY:S0 ± 3·STEP АКТИВНЫЙ СЕГМЕНТLONG или SHORTуровни зафиксированы от S0идёт MAX/MIN closeс момента активации ПРИЦЕЛИВАНИЕопора Aдва ключа K,бюджет U + D ≤ 2 close на KEY TARGET → A = TARGET STOP (если открытатех. позиция) → A = MAX/MIN close close на K → новая S0 = K ∓ 3·STEP встречный KEY: откат 3·STEP от MAX/MIN close →сразу обратный сегмент, S0 = этот экстремум, тот же бар

Что проверяется на каждом close активного сегмента

Порядок важен, если один close задевает несколько уровней.

  1. Обновить экстремум. LONG — MAX close, SHORT — MIN close, считая со свечи активации. Тени и история до активации не входят.
  2. PARTIAL (только первый раз в этом сегменте): close ≥ S0 + 6·STEP (LONG) — закрыть 50% объёма.
  3. Встречный KEY: LONG — close ≤ MAX − 3·STEP; SHORT — close ≥ MIN + 3·STEP. Закрыть остаток, начать обратный сегмент с S0 = MAX (или MIN) на этом же close.
  4. TARGET: close ≥ S0 + 8·STEP — закрыть остаток, перейти к прицеливанию от A = TARGET.
  5. STOP: close ≤ S0 + 1,5·STEP — только при открытой технической позиции. Закрыть остаток, прицеливание от A = MAX close сегмента (точно, без округления к сетке).
для каждого close:
  если направления нет:
      close ≥ S0+3·STEP → LONG;  close ≤ S0−3·STEP → SHORT;  иначе ждать
  если активен:
      ext = max(ext, close)            # для SHORT — min
      PARTIAL (один раз) → 50%
      close ≤ ext − 3·STEP → разворот: S0' = ext, обратное направление, вход на этом close
      close ≥ TARGET      → конец, A = TARGET, прицеливание
      close ≤ S0+1.5·STEP и есть позиция → стоп, A = ext, прицеливание
  если прицеливание:
      dev = trunc((close − A) / STEP);  копим U (вверх) и D (вниз), U + D ≤ 2
      K_long = A + (3 − D)·STEP;  K_short = A − (3 − U)·STEP
      close ≥ K_long  → LONG,  S0 = K_long − 3·STEP
      close ≤ K_short → SHORT, S0 = K_short + 3·STEP

3. Переходы между сегментами

После TARGET → прицеливание

TARGET становится опорой A, но не новой S0. Дальше цена может уйти немного вверх или вниз, и ключи сдвигаются навстречу:

KLONG = A + (3 − D)·STEP
KSHORT = A − (3 − U)·STEP

U и D — сколько целых STEP цена отходила вверх/вниз от A (усечение к нулю), вместе не больше 2. Значит, коридор между ключами не уже 2 STEP. Как только close достигает K, найден новый сегмент: S0 = K ∓ 3·STEP.

Встречный KEY → разворот

В активном LONG постоянно стоит встречный ключ: MAX close − 3·STEP. Close на нём или ниже открывает SHORT на том же close, с S0 = MAX close.

Это происходит в любой момент: до PARTIAL, после него, с позицией и без. Так цепочка следует за ценой без пропусков.

STOP → прицеливание

Стоп — close на S0 ± 1,5·STEP (STOP с буфером 0,5·STEP). Срабатывает, только если открыта техническая позиция: сегмент, активированный гэпом до KEY, стопом не заканчивается.

Опора прицеливания — точный MAX close завершённого LONG (MIN — для SHORT), включая close активации.

4. Гэп (пропущенные свечи)

Любой ненулевой разрыв open − предыдущий close считается пропуском. Open первой свечи после разрыва обрабатывается как условный close (фаза virtual_close), затем на той же свече — её реальный close.

Куда попал условный closeДействие
между S0 и TARGETпродолжаем текущий сегмент
за TARGET по направлениюприклеиваем сегменты по 8·STEP (S0 = прежний TARGET), пока цена не окажется внутри; пройденные полностью сегменты получают номера, но без сделок
за S0 в обратную сторонуобратная цепочка от MAX/MIN close прежнего сегмента, так же склейкой по 8·STEP

Последний неполный сегмент после склейки активен геометрически даже до своего KEY. Сделка в нём откроется только по KEY.

У криптофьючерсов гэпы редки (торги 24/7), но правило срабатывает и тогда, когда один close перепрыгивает KEY и TARGET сразу: в коде это та же склейка (CLOSE_OVERSHOOT).

5. Две сделки на одной геометрии

ТехническаяРеальная (с фильтром)
входпервый close на KEY или за нимто же + до PARTIAL осталось ≥ 2·STEP: (PARTIAL − close)/STEP ≥ 2
нет входаесли сигнальный close уже на TARGET или за ним; после выхода в том же сегменте повторного входа нет
сопровождениеPARTIAL — 50% первоначального объёма; TARGET — остаток; стоп с буфером — остаток; встречный KEY — остаток и затем вход в обратную сторону
влияет на геометриюда: STOP срабатывает только при её открытой позициинет

Цена всех операций — сигнальный close. На сайте поверх этого считается PnL в USDT с комиссией и проскальзыванием.

6. Как вычисляется STEP

STEP подбирается авторским калибратором step_protocol_v2 («логика A») один раз на начальном окне истории. Затем S0 и STEP фиксируются, и график строится по всей дальнейшей истории без пересчёта.

1

Окно калибровки

70 свечей для S0 + профильное окно ТФ:

ТФ5м15м1ч4ч1Д1Н
профиль200080050030012575

В проекте окно берётся с 01.01.2026. Параметры известны после его последней свечи: 5м — 08.01, 15м — 10.01, 1ч — 24.01, 4ч — 03.03.

2

Стартовая S0

В первых 70 свечах находим абсолютные High и Low. Каждый уточняем до ближайшего open/close этой свечи и соседей ±1.

Опорный close — 71-я свеча. S0 = тот экстремум, который дальше от него. Если это Low, стартовое направление LONG; если High — SHORT.

3

Профиль волатильности

По последним N свечам профиля берём размахи high − low и раскладываем их на две нормальные группы (GMM из 2 компонент, EM): μA — обычные свечи, μB — крупные.

малый: [μA/4 … 1,5·μA]
крупный: [1,5·μA … 2·μB]

4

Перебор кандидатов

Шаг перебора = 10⌊lg((max−min)/50)⌋ — степень десяти, около 50–500 точек.

Для каждого кандидата прогоняется вся цепочка сегментов на окне от S0 до конца калибровки. По сделкам считаются результат в пунктах, win rate и просадка.

5

Score

Score = avgPnL · (0,5 + 0,5·WR) · DDpen
DDpen = 1 − 0,5·min(1, maxDD / (10·медиана размаха))

avgPnL — средний результат сделки в пунктах цены, WR — доля прибыльных, maxDD — максимум из просадки цепочки и худшей просадки внутри сделки.

6

Выбор

Берётся кандидат с максимальным Score в первом непустом диапазоне, а это почти всегда малый. Глобальный максимум по обоим диапазонам не ищется.

Проект дополнительно требует, чтобы STEP был кратен 0,125 (сетка базы графика). Если нет — тот же калибратор перезапускается с явной сеткой. Результат не округляется.

7. Пример: BTCUSDT 1ч

Окно и S0

Калибровка01.01.2026 00:00 – 24.01.2026 17:00 UTC (570 свечей = 70 + 500)
Опорный close (71-я свеча)90 555.0 · 03.01 22:00
High / Low окна S090 958.5 / 87 515.0
После уточнения90 325.0 / 87 555.8
Дальше от опорногоLow → S0 = 87 555.8, LONG (01.01 04:00)

Профиль (500 свечей)

Медиана размаха378.95
GMMμA = 331.8 (73%), μB = 875.6 (27%)
Малый диапазон82.9 … 497.6, шаг перебора 1 → 415 кандидатов
Крупный диапазон497.6 … 1751.1, шаг 10 → 126 кандидатов
ДиапазонЛучший STEPСделокWin ratePnL, пунктыScore/сделку
малый (выбран)160.947140.8%−736.95−3.65
крупный857.65475.0%+8 276.75+1 619.79
сетка 0,125, малый: 83 … 497.625, шаг 8.375158.3757436.5%−2 220.70−10.24

Итог: STEP = 158.375, сегмент = 8·STEP = 1 267 пунктов ≈ 1,4% цены. Score выбранного кандидата отрицательный, а у крупного диапазона он в сотни раз больше. Но там всего 4 сделки, и правило «первый непустой диапазон» его не рассматривает.

8. STEP по всем рядам (расчёт 02.10.2026)

ИнструментТФS0STEP без сеткиSTEP (сетка 0,125)Медиана размахаSTEP / медианаСегмент, % цены

Медиана размаха — по профильному окну калибровки. Сегмент = 8·STEP / S0.

9. Две модели: калибратор и график

STEP подбирается на одной версии ядра (author_calibrator/core.py, «Core v2»), а сегменты на графике и PnL сайта считаются другой (engine/segment_visualization, «Lab 01.10»). Правила близки, но не совпадают:

ПравилоКалибратор (Core v2)График (Lab 01.10)
S0 после прицеливанияостаётся опорой; уровни от неёS0 = найденный K ∓ 3·STEP
сдвиг ключей при прицеливанииокругление, коридор между KEY ≥ 2·STEPусечение к нулю, U + D ≤ 2
STOP после PARTIALне срабатываетзакрывает остаток
S0 после STOP/разворотаэкстремум close или open следующей свечи, если он дальшеточный экстремум close
разворотсо 2-й свечи сегмента; может сработать по openс первой свечи; только по close
выход по TARGETпо close свечипо уровню TARGET
гэпвыход/вход по open, GAP_FILLусловный close = open, склейка сегментов
сделкиоднатехническая + реальная (фильтр 2·STEP)

Поэтому STEP оптимален для модели калибратора, а не для того, что рисует график. Об этом же пишет docs/S0_STEP_DISPLAY.md: «его модель и график различаются».

10. Моё представление

Как я понимаю систему

  • Сегмент — единица движения цены. Цепочка сегментов — это «зигзаг по close» с фиксированной сеткой 8 STEP. Цена прошла 8 STEP в одну сторону — сегмент закрыт и тут же ищется следующий. Откатилась на 3 STEP от экстремума — направление сменилось.
  • STEP — масштаб, на котором смотрим рынок. Он одного порядка с размахом обычной свечи своего ТФ (STEP / медиана размаха от 0,3 до 1,3). Значит, сегмент ≈ 8 обычных свечей по высоте, а разворот — 3 таких свечи против движения.
  • S0 — точка привязки сетки. Её задают один раз (экстремум начального окна), дальше она переносится сама: TARGET → прицеливание → K, или экстремум при развороте.

Слабые места

  • STEP подбирается на коротком начале истории: от 7 дней (5м) до 9 недель (4ч) и дальше не меняется, хотя волатильность меняется.
  • Выбор «первый непустой диапазон» означает «лучший в малом диапазоне», даже с отрицательным Score (BTC 1ч: −3.65).
  • Сетка 0,125 — техническое требование базы, но перезапуск с шагом 8.375 меняет результат: BTC 15м 228.98 → 180, BTC 4ч 1000.56 → 809.25, BCH 5м 1.419 → 0.5, BCH 1ч 3.034 → 1.25. У дешёвых инструментов шаг 0,125 сравним с самим STEP, и кандидатов остаётся всего десяток.
  • Калибратор и график — разные модели (раздел 9).
  • Score считается в пунктах цены: его нельзя сравнивать между инструментами и ТФ.

Что это значит для «матрёшки» (задача 3)

  • STEP по ТФ не растёт монотонно: у BTC STEP 15м (180) больше, чем 1ч (158.375). Поэтому при нынешних STEP сегмент 1ч может оказаться ниже сегмента 15м, и «вложить» младший в старший не получится.
  • Естественная мера вложенности — отношение STEP: сегмент 4ч BTC (8·809.25 = 6 474) по высоте вмещает примерно 5 сегментов 1ч (1 267).
  • Варианты для матрёшки, которые я бы обсудил:
    1. Как есть: каждый ТФ со своим откалиброванным STEP и S0; рисуем все цепочки на одном графике и смотрим, как они пересекаются.
    2. Кратные STEP: STEP младшего ТФ = STEP старшего / k (например, k = 4 или 8), с общей S0. Тогда сетки совпадают, и каждый внешний сегмент точно делится на внутренние.
    3. Вложение по времени: внутренние сегменты строятся только внутри временного интервала активного внешнего сегмента и стартуют от его S0.
  • Для расчёта на странице эксперимента правила сегмента компактны: их можно считать прямо в браузере по свечам Bybit. Тогда лимит публикации не мешает.

Калькулятор уровней

УровеньЦенаОт S0

По умолчанию — параметры BTC 1ч из раздела 7.