ЭКСПЕРИМЕНТ · ЗАДАЧА 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. Сегмент и уровни
| Уровень | LONG | SHORT | Зачем |
|---|---|---|---|
| S0 | начало | начало | нижняя/верхняя граница сегмента |
| KEY | S0 + 3·STEP | S0 − 3·STEP | close на KEY или за ним активирует сегмент (равенство — тоже) |
| STOP | S0 + 2·STEP | S0 − 2·STEP | уровень стопа; срабатывает с буфером 0,5·STEP |
| стоп с буфером | S0 + 1,5·STEP | S0 − 1,5·STEP | close здесь или за ним закрывает позицию |
| PARTIAL | S0 + 6·STEP | S0 − 6·STEP | закрыть 50% первоначального объёма (один раз) |
| TARGET | S0 + 8·STEP | S0 − 8·STEP | закрыть остаток; конец сегмента |
Геометрические границы сегмента — S0 и TARGET. Все уровни считаются от S0 и не пересчитываются от фактической цены входа.
Пока направления нет (самое начало), видны оба KEY: S0 + 3·STEP и S0 − 3·STEP. Какой close пробьёт первым, тот и задаёт направление.
2. Жизненный цикл сегмента
Что проверяется на каждом close активного сегмента
Порядок важен, если один close задевает несколько уровней.
- Обновить экстремум. LONG — MAX close, SHORT — MIN close, считая со свечи активации. Тени и история до активации не входят.
- PARTIAL (только первый раз в этом сегменте): close ≥ S0 + 6·STEP (LONG) — закрыть 50% объёма.
- Встречный KEY: LONG — close ≤ MAX − 3·STEP; SHORT — close ≥ MIN + 3·STEP. Закрыть остаток, начать обратный сегмент с S0 = MAX (или MIN) на этом же close.
- TARGET: close ≥ S0 + 8·STEP — закрыть остаток, перейти к прицеливанию от A = TARGET.
- 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 фиксируются, и график строится по всей дальнейшей истории без пересчёта.
Окно калибровки
70 свечей для S0 + профильное окно ТФ:
| ТФ | 5м | 15м | 1ч | 4ч | 1Д | 1Н |
|---|---|---|---|---|---|---|
| профиль | 2000 | 800 | 500 | 300 | 125 | 75 |
В проекте окно берётся с 01.01.2026. Параметры известны после его последней свечи: 5м — 08.01, 15м — 10.01, 1ч — 24.01, 4ч — 03.03.
Стартовая S0
В первых 70 свечах находим абсолютные High и Low. Каждый уточняем до ближайшего open/close этой свечи и соседей ±1.
Опорный close — 71-я свеча. S0 = тот экстремум, который дальше от него. Если это Low, стартовое направление LONG; если High — SHORT.
Профиль волатильности
По последним N свечам профиля берём размахи high − low и раскладываем их на две нормальные группы (GMM из 2 компонент, EM): μA — обычные свечи, μB — крупные.
малый: [μA/4 … 1,5·μA]
крупный: [1,5·μA … 2·μB]
Перебор кандидатов
Шаг перебора = 10⌊lg((max−min)/50)⌋ — степень десяти, около 50–500 точек.
Для каждого кандидата прогоняется вся цепочка сегментов на окне от S0 до конца калибровки. По сделкам считаются результат в пунктах, win rate и просадка.
Score
Score = avgPnL · (0,5 + 0,5·WR) · DDpen
DDpen = 1 − 0,5·min(1, maxDD / (10·медиана размаха))
avgPnL — средний результат сделки в пунктах цены, WR — доля прибыльных, maxDD — максимум из просадки цепочки и худшей просадки внутри сделки.
Выбор
Берётся кандидат с максимальным 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 окна S0 | 90 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 rate | PnL, пункты | Score/сделку |
|---|---|---|---|---|---|
| малый (выбран) | 160.94 | 71 | 40.8% | −736.95 | −3.65 |
| крупный | 857.65 | 4 | 75.0% | +8 276.75 | +1 619.79 |
| сетка 0,125, малый: 83 … 497.625, шаг 8.375 | 158.375 | 74 | 36.5% | −2 220.70 | −10.24 |
Итог: STEP = 158.375, сегмент = 8·STEP = 1 267 пунктов ≈ 1,4% цены. Score выбранного кандидата отрицательный, а у крупного диапазона он в сотни раз больше. Но там всего 4 сделки, и правило «первый непустой диапазон» его не рассматривает.
8. STEP по всем рядам (расчёт 02.10.2026)
| Инструмент | ТФ | S0 | STEP без сетки | 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).
- Варианты для матрёшки, которые я бы обсудил:
- Как есть: каждый ТФ со своим откалиброванным STEP и S0; рисуем все цепочки на одном графике и смотрим, как они пересекаются.
- Кратные STEP: STEP младшего ТФ = STEP старшего / k (например, k = 4 или 8), с общей S0. Тогда сетки совпадают, и каждый внешний сегмент точно делится на внутренние.
- Вложение по времени: внутренние сегменты строятся только внутри временного интервала активного внешнего сегмента и стартуют от его S0.
- Для расчёта на странице эксперимента правила сегмента компактны: их можно считать прямо в браузере по свечам Bybit. Тогда лимит публикации не мешает.
Калькулятор уровней
| Уровень | Цена | От S0 |
|---|
По умолчанию — параметры BTC 1ч из раздела 7.