Skip to content

Режимы рынка — механизм, который существует, но не используется ​

Состояние на 2026-07-30: ВЫКЛЮЧЕН в бою и ни разу не включался. В форме настроек стратегии этих параметров нет намеренно. Документ описывает все 24 настройки на случай, когда механизм решат включать.

Для кого этот документ ​

Для оператора системы, а не для автора кода. Ниже нет ни имён функций, ни путей к файлам: только что механизм делает, из чего он собран, что каждая настройка меняет и что нужно, чтобы его включить.

Если вы ищете настройки, которыми управляют каждый день, — их здесь нет, они в форме настроек стратегии. Здесь описано то, чего в форме нет.


1. Чем подтверждается, что механизм выключен ​

Три независимых наблюдения, снятых с боевого узла 2026-07-30 (только чтение):

  1. Движок сам пишет об этом при каждом запуске. В журнале работы боевого инстанса, строка от 2026-07-30 09:55:35 UTC (последний перезапуск) и та же строка от 2026-07-28 10:10:25:

    INFO pm_engine::config::loader: effective regime config
         regime=regime engine: disabled (config.regime=None;
         hot loop bit-identical with pre-TCHS baseline)

    Строка эмитится ВСЕГДА, в том числе в выключенном состоянии, — именно чтобы состояние было видно, а не подразумевалось.

    Учтите при повторной проверке: журнал боевого контейнера ротируется (5 файлов по 100 МБ), а движок пишет очень плотно — в хранимой истории остаются примерно последние десять минут. Через час после перезапуска стартовой строки в docker logs уже НЕ будет. Это ротация, а не отсутствие записи; ловить строку надо сразу после перезапуска либо опираться на наблюдения 2 и 3, которые от журнала не зависят.

  2. В настройках нет самого раздела. В боевой базе настроек ни одна из трёх строк стратегий (harvester-engine-v2 — единственная включённая, плюс две выключенные строки эпохи pm-bot) не содержит раздела regime.

  3. Ни один расчёт не выполняется. Раздела нет ⇒ хранилище состояния рынков собирается без признаков режима, а задача-оценщик вообще не запускается. Горячий цикл при этом побайтово совпадает с поведением до появления механизма — то есть выключенный механизм не стоит ни времени, ни памяти.

Почему выключение выражено отсутствием раздела, а не отдельным переключателем. Это осознанное решение: отдельное значение «выключено» рано или поздно рассогласовалось бы с фактом («в настройках выключено, а расчёт всё ещё крутится»). Раздела нет — значит нет и механизма. Обратная сторона: у раздела нет умолчаний, все 24 значения обязательны, и неполный раздел движок не примет — он откажется стартовать.


2. Что механизм делает ​

Задача одна: определить, определился ли рынок с исходом, и не пускать покупку раньше этого.

Каждый рынок непрерывно относится к одному из семи состояний. Пять из них лежат на одной шкале «насколько рынок сошёлся к исходу»:

СостояниеСмыслПокупка разрешена
Поиск (discovery)Рынок только начал торговаться, цена гуляетнет
Волатильное (volatile)Идёт борьба, цена скачетнет
Переход (transition)Появился перевес, но неустойчивыйнет
Схождение (locking)Рынок сходится к одному исходуда
Терминальное (terminal)Исход практически определёнда

Ещё два состояния — аварийные, вне шкалы:

СостояниеСмыслПокупка разрешена
Ложное терминальное (false_terminal)Цена высокая, как у определившегося рынка, но при этом резко растёт волатильность — сочетание, которого у настоящего терминального рынка не бываетнет
Разлад (unstable)Неопределённость подскочила до пределанет

Аварийные состояния распознаются в обход всех задержек и подтверждений: опасность обязана регистрироваться немедленно.

Полярность: механизм только ЗАПРЕЩАЕТ покупку ​

Он не продаёт, не отменяет аварийную продажу, не мешает забрать выигрыш. Всё, что он умеет, — не дать открыть новую позицию. Это важно: включение механизма не может создать новый риск для уже открытых позиций, оно может только сократить число покупок.

Как считается положение на шкале ​

  1. По потоку событий биржевого стакана считаются четыре признака: сжимается ли спред, насколько рынок сконцентрировался на одном исходе, затухает ли волатильность, устойчива ли ликвидность.
  2. Каждый признак приводится к шкале от 0 до 1, где 1 — «максимально сошёлся».
  3. Признаки складываются со своими весами в одну оценку схождения (тоже от 0 до 1).
  4. Оценка сравнивается с четырьмя границами — получается уровень на шкале.
  5. Уровень опускается двумя независимыми потолками: отдельными порогами по каждому признаку и стадией внешней оценки «рынок уже определился». Потолок только опускает уровень, никогда не поднимает.
  6. Найденный уровень проходит через выбранную модель подавления дребезга — она решает, менять ли состояние прямо сейчас или подождать.

Пункт 5 существует потому, что общая оценка — это среднее: слабый признак в ней компенсируется сильным. Для решения «пускать ли деньги» такая компенсация недопустима, поэтому отдельные пороги требуют, чтобы КАЖДЫЙ нужный признак прошёл свою планку сам по себе.


3. Как считать 24 настройки ​

Раздел regime содержит 24 настройки. Два из них — не одиночные числа, а таблицы: «границы шкалы» (4 строки по два числа) и «пороги по признакам» (4 строки по два числа). Если считать каждое число отдельно, получится 38 чисел; в машинном описании конфигурации — 26 путей (таблицы там представлены одной парой путей на все строки). Все три числа верны, они просто считают разное. Ниже используется счёт «24 настройки» — тот, которым удобно пользоваться.


4. Все 24 настройки ​

Группа A. Управление механизмом (2) ​

1. Режим работы (mode) — одно из двух значений.

  • shadow («тень») — движок вычисляет состояния и сообщает о них, но покупку НЕ запрещает. Единственно правильное значение на первое время: видно, что бы механизм запретил, но ни одна сделка не потеряна.
  • enforce («в силе») — движок запрещает покупку везде, кроме состояний «схождение» и «терминальное».

Третьего значения «выключено» нет: выключение — это отсутствие всего раздела.

2. Модель подавления дребезга (hysteresis) — одно из трёх значений. Все три реализованы; какая лучше — вопрос, который решается сравнением на данных одного рынка, а не выбором «по умолчанию». Код специально не отдаёт предпочтения ни одной.

  • confirmation_dwell («подтверждения и выдержка») — состояние меняется, когда новое состояние подтвердилось заданное число раз подряд И в текущем состоянии рынок пробыл не меньше заданного времени. Подавление ВО ВРЕМЕНИ: зависит от того, как часто идёт переоценка.
  • threshold_band («полосы») — у каждой границы шкалы своя пара порогов: чтобы подняться выше, оценка должна превысить верхний порог; чтобы опуститься — упасть ниже нижнего. Между ними — мёртвая зона, в которой ничего не происходит. Подавление ПО ВЕЛИЧИНЕ: число подтверждений и выдержка не используются вовсе.
  • hybrid («совмещённая») — те же полосы плюс требование минимальной выдержки в текущем состоянии.

Группа B. Темп и задержки (5) ​

3. Как часто переоценивать (eval_interval_ms), миллисекунды.

Период работы оценщика. Больше — реже пересчёт, ниже нагрузка, позже замечается смена состояния. Меньше — быстрее реакция и выше нагрузка. Влияет и на модель confirmation_dwell: число подтверждений считается в этих тактах, поэтому изменение периода меняет фактическое время подтверждения.

4. Минимальное время в состоянии (min_dwell_ms), миллисекунды.

Сколько рынок обязан пробыть в текущем состоянии, прежде чем ему разрешат перейти в другое. Работает в моделях «подтверждения и выдержка» и «совмещённая». Больше — состояния устойчивее, реакция на настоящую смену режима запаздывает. Меньше — состояния дребезжат.

5. Сколько подтверждений подряд (required_confirmations), штук.

Сколько раз подряд переоценка должна выдать одно и то же новое состояние, чтобы переход состоялся. Работает только в модели «подтверждения и выдержка». Больше — меньше ложных переходов, позже реакция. Меньше — наоборот. Ноль недопустим: это отключило бы подавление дребезга молча.

6. Сколько событий накопить перед разрешением покупки (warmup_min_events), штук.

Защита от холодного старта. Пока по рынку не набралось столько событий стакана, механизм НЕ переведёт его в состояние, разрешающее покупку, — сколько бы хорошо ни выглядели признаки на пустых средних. Больше — надёжнее, но по свежим рынкам покупка начинается позже. Меньше — раньше, но на недостоверных оценках. Аварийные состояния под эту защиту не попадают: опасность обязана регистрироваться сразу.

7. Пауза после аварийного состояния (emergency_recovery_cooldown_ms), миллисекунды.

После ЛЮБОГО попадания рынка в аварийное состояние новые покупки по этому исходу запрещены на это время. Отсчёт перезапускается на каждой новой аварии. Больше — надёжнее защита от возврата в рынок, который только что вёл себя опасно; но в восстановившийся рынок мы уже не вернёмся. Меньше — быстрее возврат, выше риск купить в середине продолжающейся аварии. Запрет действует ТОЛЬКО на покупку: продажа, аварийная продажа и получение выигрыша его не видят.

Группа C. Окна усреднения признаков (7) ​

Все окна задаются в числе событий стакана, а не в секундах. Это выбрано намеренно: при затухании во времени долгое затишье выглядело бы как «успокоившийся рынок» — ровно тогда, когда риск ложного «терминального» состояния максимален. При счёте по событиям тишина просто не обновляет оценку, и она держится на последнем достоверном значении.

У каждого из трёх признаков — короткое и длинное окно; признак считается по их отношению. Короткое обязано быть меньше длинного, иначе движок не стартует.

8-9. Волатильность: короткое и длинное окно (volatility_short_window, volatility_long_window).

Признак «волатильность затухает» = короткая волатильность делить на длинную. Значение меньше 1 означает затухание.

Короткое больше — оценка спокойнее, резкие перемены замечаются позже. Короткое меньше — реакция мгновенная и шумная. Длинное больше — базой служит более долгая история, признак устойчивее, но медленнее реагирует на смену характера рынка.

10-11. Спред: короткое и длинное окно (spread_short_window, spread_long_window).

Признак «спред сжимается» = короткий средний спред делить на длинный. Чем меньше отношение, тем сильнее сжатие и тем ближе рынок к определившемуся.

12-13. Глубина стакана: короткое и длинное окно (depth_short_window, depth_long_window).

Признак «ликвидность устойчива» — насколько ровно держится объём у лучших цен.

14. Насколько резкое падение глубины считать аварией (emergency_depth_drop_ratio), доля от 0 до 1.

Если новый объём заявок на покупку упал ниже, чем (1 − эта доля) от короткого среднего, срабатывает грубый признак «глубина обвалилась». Это одна из двух причин немедленной аварийной переоценки (вторая — полное исчезновение лучшей заявки на покупку; у неё настройки нет).

Больше (ближе к 1) — тревога только на почти полном исчезновении покупателей. Меньше — тревога на умеренных просадках, и аварийные переоценки становятся частыми. Значение должно быть строго больше нуля и не больше единицы.

Группа D. Пороги аварийных состояний (3) ​

15. Цена, выше которой рынок выглядит определившимся (false_terminal_high_price_milli), тысячные (0…1000).

Первое из двух условий «ложного терминального» состояния. Больше — «дорогим» считается меньше рынков, ложное терминальное объявляется реже. Меньше — чаще.

16. Волатильность, выше которой это противоречие (false_terminal_volatility_min).

Второе условие. «Ложное терминальное» объявляется, только когда выполнены ОБА: рынок выглядит определившимся, но волатильность при этом высокая. Настоящий определившийся рынок так себя не ведёт, поэтому сочетание считается признаком подвоха.

Больше — требуется более вопиющее противоречие, срабатываний меньше. Меньше — срабатываний больше, часть из них на обычном шуме.

17. Неопределённость, выше которой это разлад (unstable_entropy_jump).

Мера неопределённости рынка: 0 — рынок полностью определился, 1 — исход пятьдесят на пятьдесят. Значение выше этого порога переводит рынок в состояние «разлад».

Обратите внимание: мера в принципе не превышает 1. Порог больше 1 сделал бы состояние «разлад» недостижимым, то есть отключил бы его молча.

Группа E. Веса признаков в общей оценке (5) ​

Четыре веса складывают четыре признака в одну оценку схождения. Оценка — взвешенное среднее, поэтому важны не абсолютные величины, а их соотношение: 1/1/1/1 и 10/10/10/10 дадут одинаковый результат. Ноль у одного веса означает «этот признак в общую оценку не входит»; все четыре нуля недопустимы — оценка стала бы бессмысленной, и движок откажется стартовать.

18. Вес сжатия спреда (spread_compression). 19. Вес концентрации на исходе (entropy_concentration). 20. Вес затухания волатильности (volatility_decay). 21. Вес устойчивости ликвидности (liquidity_stability).

Больше вес — сильнее влияние признака на положение рынка на шкале. Меньше — слабее.

22. Предел неопределённости для нормализации (entropy_max_bits).

Служебное число: на него делится мера неопределённости, чтобы привести признак к шкале от 0 до 1. Для меры, которой пользуется движок, естественное значение — 1.0. Меньше 1 сделает признак «концентрации» насыщенным (все рынки будут выглядеть предельно неопределёнными); больше 1 — наоборот, заниженным.

Группа F. Границы шкалы (1 настройка, 4 строки по два числа) ​

23. Границы перехода между уровнями (threshold_band.boundaries).

Четыре границы разделяют пять уровней шкалы: поиск / волатильное / переход / схождение / терминальное. У каждой границы два числа:

  • порог входа вверх — оценка схождения должна его достичь, чтобы рынок поднялся на уровень выше;
  • порог выхода вниз — оценка должна упасть ниже него, чтобы рынок опустился.

Между ними — мёртвая зона, в которой состояние не меняется. Она и подавляет дребезг: без неё рынок с оценкой ровно на границе перескакивал бы туда-сюда на каждом обновлении цены.

Правила, которые движок проверяет при старте (нарушение = отказ стартовать):

  • оба числа каждой границы лежат в диапазоне от 0 до 1;
  • порог входа не ниже порога выхода;
  • они не равны между собой — равенство схлопнуло бы мёртвую зону и тихо отключило подавление дребезга;
  • границы упорядочены: чем глубже уровень, тем выше требуемая оценка.

Границы ближе друг к другу — переходы между уровнями чаще. Дальше — реже, но между «переход» и «схождение» рынок может застревать надолго.

Группа G. Пороги по каждому признаку отдельно (1 настройка, 4 строки по два числа) ​

24. Обязательные пороги признаков (structural_floors).

Четыре строки в фиксированном порядке — по одной на признак:

СтрокаПризнак
1сжатие спреда
2концентрация на исходе
3затухание волатильности
4устойчивость ликвидности

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

Правило применения (это алгоритм, а не настройка):

  • чтобы рынок мог попасть в «схождение», обязаны пройти свои пороги первые ТРИ признака — все одновременно;
  • чтобы попасть в «терминальное» — те же три плюс четвёртый, устойчивость ликвидности;
  • если условие не выполнено, уровень принудительно опускается, каким бы высоким ни было среднее.

У каждого порога, как и у границ шкалы, два числа — вход и выход, с той же мёртвой зоной и теми же правилами проверки при старте. Одиночный порог здесь дребезжал бы самим разрешением на покупку.

Эти пороги — предохранители, а не настройка под доходность. Их не подбирают перебором вместе с остальными: смысл в том, чтобы они держали планку, когда всё остальное подстроено.


5. Что нужно, чтобы включить механизм ​

Механизм не «забыли включить» — он не включён, потому что не пройден ни один шаг из четырёх.

Шаг 1. Выбрать модель подавления дребезга и границы на данных. Три модели — не вопрос вкуса. Их сравнивают на записанном потоке одного рынка: сколько переходов даёт каждая, сколько из них ложных, насколько запаздывает реакция на настоящую смену режима. До этого сравнения любой набор из 24 чисел будет выдуманным.

Шаг 2. Добавить раздел целиком. Умолчаний нет ни у одного из 24 значений. Неполный раздел движок не примет — он откажется стартовать с указанием, какого именно значения не хватает. Это сделано намеренно: настройка, влияющая на допуск денег в рынок, не должна появляться из умолчания, которого никто не выбирал.

Шаг 3. Пожить в режиме «тень». С mode = shadow движок считает состояния и сообщает о них, но покупку не запрещает. Смотреть надо на одно: сколько покупок механизм запретил БЫ и чем эти покупки закончились. Если запрещённые покупки в среднем оказывались прибыльными — пороги выбраны неверно, и включение в силу стоило бы денег.

Шаг 4. Только потом перевести в enforce. И только после того, как ответ на вопрос шага 3 получен на достаточном числе случаев, а не на трёх.

Отдельно — про откат. Раздел добавляется вперёд свободно. Убрать его тоже можно в любой момент: отсутствие раздела для движка — штатное состояние. Никакой миграции для отката не нужно.


6. Почему этих настроек нет в форме ​

Решение оператора от 2026-07-30. Причины, в порядке значимости:

  1. Механизм не работает. Экран настроек — операторская поверхность, а не витрина возможностей. 24 поля неработающего механизма занимали бы место рядом с полями, которыми управляют каждый день.
  2. Заполнить их наугад нельзя. Модель подавления дребезга и границы шкалы выбираются сравнением на данных (шаг 1 выше). Форма, позволяющая ввести их «на глаз», подталкивала бы ровно к тому, чего делать нельзя.
  3. Скрывать их тоже нельзя — отсюда этот документ и ссылка на него в инструкции для агентов. Разница между «нет в форме, но описано» и «нет нигде» — это разница между осознанным решением и потерянным знанием.

Когда механизм будут включать, настройки переезжают в форму, а исключение из проверки соответствия формы и конфигурации снимается. Проверка эта живая: любая НОВАЯ настройка конфигурации, не выведенная в форму, красит тест — не попасть в форму молча она не может.

Сохранность вручную добавленного раздела. Раздела нет в форме, поэтому единственное, что защищает его от затирания при любой правке через дашборд, — послойное слияние: дашборд сохраняет ключи, которых форма не производит. Это закреплено тестом; без него первое же изменение бюджета через дашборд стёрло бы весь раздел.


7. Связанные документы ​

  • directional-harvester.md — стратегия целиком (PRD + FSD).
  • parameters-reference.md — классификация параметров стратегии. Настройки этого документа относятся к классу ENTRY-policy: они влияют только на допуск к покупке.
  • ../target/risk-and-emergency.md — три канонических предела риска. Механизм режимов к ним НЕ относится: он не ограничивает суммы, он запрещает покупку по состоянию рынка.