Skip to content

v0.4.3

Latest

Choose a tag to compare

@github-actions github-actions released this 24 Sep 13:36
· 4 commits to main since this release

[0.4.3] - 2026-09-24

Влияние: торговая логика · UI · данные. Меняется одно торговое правило, стоп по марже
бота 2. Схема продавца закрывает сделку, когда поддерживающая маржа проданных опционов достигает 60%
капитала счёта, а в 0.4.2 правило считало эту долю неверно и ошибалось в обе стороны: у первой сделки
живого прогона почти всё время показывало ниже настоящей, на срезе 23.09 выше (24.94% при настоящих
24.01%). Теперь оно видит ту же долю, что и счёт, поэтому на том же ходе рынка 0.4.3 может закрыть
сделку в другой момент, чем 0.4.2. Ещё стоп срабатывает при капитале ноль и ниже, а если закрыть
сделку не удалось, следующий тик решает заново, а не молчит до экспирации. Правило входа и размер
сделки прежние: фильтр по волатильности и наклон размера добавлены в движок выключенными.

В интерфейсе бота 2 карточка непрерывности показывает минуты, когда бот держал позицию без цены
перпа и хедж не мог исполниться, а карточка режима IV больше не выносит вердикт. В данных у леджера
бота 2 появилась строка blind, одна на такой эпизод, а у записи решения тика поле skip_reason.
Настройка ivEntryMaxRank из движка убрана: в старом профиле она просто не читается, миграции нет.

Бот 1 и сканер не затронуты: правки интерфейса касаются только карточек бота 2, а сканер из общих
правил схемы продавца зовёт только сборку настройки, размер по марже и зону продавца, и их поведение
прежнее. Остальное в выпуске это замеры и стенды схемы продавца, они запускаются из scripts/ и в
приложении не исполняются. Шесть книг охраны снялись побитово теми же.

  • [BTC-Options] Бот считает слепоту хеджа и пишет её в леджер. 18 сентября аудит нашёл на
    живом прогоне 83.7 минуты, в которые бот держал позицию без цены перпа и хедж не мог исполниться:
    пять эпизодов, крупнейшие 36.0 минуты 05.09 и 38.3 минуты 15.09, оба от отказа биржи 503 ровно в
    09:00Z. Счётчик непрерывности показывал в это время два перерыва по 75-111 секунд совсем другого
    дня, потому что перерывом он считает пропуск ТИКА, а тики все эти минуты приходили исправно.
    Теперь слепой тик (структура открыта, цены перпа в снимке нет) считается отдельно от перерыва
    опроса, эпизод слепоты закрывается зрячим тиком и оставляет одну строку леджера типа blind с
    длительностью и числом слепых тиков, а решение цикла несёт поле skip_reason: SKIP при живом
    превышении полосы из-за отсутствия цены больше неотличим от SKIP внутри полосы. Строка на
    ЭПИЗОД, а не на тик: 36 минут при опросе раз в 15 секунд это 144 тика.

  • [BTC-Options] Строка разрыва фандинга называет то, что было. Часы начисления стоят и
    когда приложения не было, и когда оно шло слепым, а строка funding-gap называла любой такой
    интервал «разрывом тиков». На живом прогоне это врало дважды. Теперь причину называет счётчик
    тиков с последнего оценённого начисления, а не догадка.

  • [BTC-Options] Карточка непрерывности показывает слепоту и больше не прячется от неё.
    Карточка скрывалась как здоровая, если перерывов опроса нет, поэтому в те 83.7 минуты оператор не
    видел ни числа, ни карточки: покрытие было около 100%. Добавлены клетка «слепота хеджа» с числом
    слепых тиков, своя таблица эпизодов (начало, длительность, тиков вслепую, причина) и отдельный
    тег. Полоса покрытия красит слепые минуты штриховкой: сплошь зелёная полоса рядом с клеткой
    «слепота 36 мин» спорила сама с собой. Идущая прямо сейчас слепота видна живой строкой, не
    дожидаясь конца эпизода.

  • [BTC-Options] Карточка режима IV перестала выносить вердикт чужой схемы. Она считала вход
    благоприятным, когда подразумеваемая волатильность у НИЗА своего суточного окна: суждение схемы,
    которая волатильность ПОКУПАЕТ (исходная Strategy One, длинный стрэддл). Живой бот её ПРОДАЁТ с 4
    сентября, то есть зелёный горел ровно наоборот. Признак favorable и настройка ivEntryMaxRank
    убраны из движка, карточка осталась наблюдением: те же числа, суждения нет. Вердикт не развернули
    намеренно: разворот утверждал бы «вход выгоден, когда IV у верха окна», а такого замера нет, и
    ближайший замер (22.09, пять лет) дал отрицательный ответ по обеим формам действия. Заголовок,
    метка и справка карточки переписаны на обоих языках, тест стережёт, что вердикт не вернётся молча.

  • [BTC-Options] Фильтр по волатильности на входе схемы продавца замерен на боевой
    конфигурации и ОТКЛОНЁН.
    Живая цепочка открывает сделку, как только в окне срока 336-672 часа
    нашлась нога с нужной дельтой, и о волатильности не спрашивает вовсе, хотя результат продавца
    решает разница между проданной подразумеваемой волатильностью и той, что реализуется за время
    удержания. Замерены обе формы ответа на эту величину, критерий записан до первого прогона
    (протокол bot2-предрегистрация-фильтра-волатильности-2026-09-22.md, внутренний каталог проекта
    вне репозитория). Запрет входа:
    база 84 сделки ×4.12, все шесть клеток сетки порогов ниже (лучшая ×4.08), время вне рынка растёт
    с 0.5% до 21.9%, средняя сделка не двигается, то есть гейт отбирает те же сделки, просто меньше.
    Изменение размера: ни одна из 27 клеток не взяла планку, а клетки, обгоняющие базу, делают это
    пробитым потолком загрузки маржи (89-103% против 80%) и двумя ликвидациями счёта. Нулевой
    контроль постоянным множителем той же средней величины берёт тот же рост при пике маржи на 10-14
    процентных пунктов ниже и без ликвидаций: вклад самого сигнала 1.020 по медиане. Вывод устоял в
    обеих половинах записи и под тремя стрессами издержек. Отчёт:
    ОТЧЁТ-бот2-фильтр-волатильности-2026-09-22.md там же.

  • [BTC-Options] Правило наклона размера от разрыва IV-RV добавлено в движок ВЫКЛЮЧЕННЫМ.
    sizeTiltMult и parseSizeTiltSpec в otmscan/sellhedge.js, дефолт sizeTilt: null, при нём
    ни одна ветка не исполняется и арифметика протяжки прежняя до бита, тем же приёмом, каким в
    схеме живёт выключенное правило досрочного выхода. Нужно затем, чтобы отрицательный вывод можно
    было перепроверить на новой записи или пересчитать после правки издержек: до августа такой вывод
    жил в проекте цитатой, которую перепроверить было нечем.

  • [BTC-Options] Починена таблица автономного правила размера: с 28.08 она печатала шапку без
    единой строки.
    Ключ, под которым цепочка кладётся в память, и ключ, под которым таблица её
    оттуда достаёт, собирались в двух разных местах eval-accel.mjs. 28.08 вместе с замером
    досрочного выхода к первому приписали подпись правила, второй остался прежним, промах поиска
    гасился подстановкой пустого значения, и строка молча пропускалась. Второго ключа больше нет:
    строки цепочки лежат под собственным ключом варианта, а промах роняет прогон с ошибкой. На
    выбранные 26.08 константы X=45 cap=0.8 дефект не повлиял, их считали до его появления.

  • [BTC-Options] Стенд eval-accel.mjs научился мерить фильтр: флаги --gate,
    --gate-sweep, --tilt, --tilt-sweep, столбцы «вне рынка» и «средняя сделка» в таблице
    размера, нулевой контроль постоянным множителем рядом с каждой клеткой наклона. Разбор условия
    гейта, сравнение и счётчик отклонённых входов зовутся из движкового hist-gate.js, второй
    реализации не заведено. Формула доли времени вне позиции вынесена туда же из
    hist-sellhedge.mjs: её печатают два стенда, а две копии одной формулы расходятся молча.

  • [BTC-Options] Стенд продавца научился идти мелким кадансом, и часовая запись оказалась
    оптимистичной втрое.
    Полоса хеджа 0.03 BTC на контракт выбрана перебором по ЧАСОВОЙ записи, а
    живой бот переоценивает позицию раз в 15 секунд: часовая сетка не может дать больше 24
    пересечений полосы в сутки по построению. Ключ --fine подаёт протяжке наблюдённый путь индекса
    из кэша поштучных сделок (index_price на каждом принте), а волатильность и базис форварда
    по-прежнему берутся из часовой записи: полосу пересекает движение индекса, а греки меняются
    медленно. Дельта на мелком шаге ПЕРЕСЧИТЫВАЕТСЯ Блэком-76 от наблюдённого индекса, а не
    протягивается между часами: протяжка монотонна по построению, а перекладки создаёт ровно
    немонотонность внутри часа. Выход сделки оценивается часовым снимком, то есть той же ценой, что
    у часового прогона, поэтому между двумя прогонами меняется ТОЛЬКО хедж: статья «премия минус
    выкуп» в обоих 14811 до доллара.

    Что это показало на пяти годах при живой мейкерской ставке 0.015%: рост залога ×32.84 на часовом
    шаге против ×9.36 на настоящем, перекладок 5996 против 17842. Но подорожали не комиссии, а
    ГАММА: комиссии выросли на $2765, а сама нога хеджа упала с +35142 до +24267, то есть на $10875.
    Часовая сетка не видит внутричасовых разворотов, за которые короткий опцион платит, и потому
    показывает хедж лучше, чем он есть.

    Восстановление сверено с живой записью тиков: на окне сделки 2 оно даёт 634 перекладки против
    633 у бота и оборот 1.212 BTC на контракт в сутки против 1.187, а восстановленная дельта против
    дельты биржи на одних метках расходится на 0.00066 по медиане при суммарном движении
    шаг-к-шагу 41.57 против 39.91, то есть лишнего дрожания 4.2%.

    Цена: два новых стенда (hist-index-path.mjs разбирает 568 МБ принтов в таблицу пути один раз,
    hist-fine-band.mjs считает пересечения полосы для произвольной позиции), сетка стоимостей в
    --band-sweep дополнена живой ставкой 0.015%, просадка в ней читается там же, а не при нуле.
    Без ключа --fine ни одна новая ветка не исполняется: шесть книг охраны снялись побитово теми
    же, тестов 1177.

  • [BTC-Options] Оценщик ускорения оборота тоже пошёл мелким кадансом, и заголовочный
    пятилетний рост боевой схемы уполовинился.
    eval-accel.mjs получил тот же ключ --fine, что и
    эталон, плюс ключ --band: полоса хеджа это константа схемы, и проверить её на БОЕВОМ правиле
    размера (автономная стресс-маржа X=45, cap=0.8) иначе было нечем, потому что у эталона правило
    размера другое. Протяжка мелкой сеткой добавлена обоим путям стенда, одиночной ноге и стрэнглу; у
    пары обе ноги считаются от одного наблюдённого индекса и складываются тем же движковым
    stranglePrice, каким их складывает часовой прогон.

    Перенос проверен двумя способами, а не обещанием. При выключенном ключе вывод ВСЕХ четырёх
    режимов на двух записях совпал с версией до правки, кроме двух строк, добавленных в сам отчёт
    (название каданса и подсказка про ключ). А часовой путь воспроизводит канонические числа проекта:
    при нулевой комиссии и стресс-размере X=45 cap=0.8 выходит ×4.12 при пике маржи 73.9% и нуле
    ликвидаций, то есть ровно константа из шапки схемы, а при живой ставке 0.015% выходит ×3.56, то
    есть ровно число аудита 22.09.

    Что показала база стрэнгла (84 сделки, пять лет, счёт $20 000, стресс-размер X=45 cap=0.8):
    ×4.12 при нуле и часовом шаге, ×3.56 при живой ставке и часовом шаге, ×3.08 при нуле и настоящем
    кадансе, ×2.15 при живой ставке и настоящем кадансе. То есть заголовочное число держалось на ДВУХ
    допущениях сразу: бесплатный перп стоит 13.6% результата, каданс 25.2%, вместе 47.8%. Хвост при
    этом не ухудшается: пик маржи 74.5% против 73.9%, ликвидаций ноль, тиковая просадка даже меньше
    (7.7-8.1% против 9.0-9.1%), потому что частый хедж держит дельту ближе к нулю.

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

    Цена: без ключа --fine ни одна новая ветка не исполняется, шесть книг охраны побитово те же,
    тестов 1177.

  • [BTC-Options] Разбор таблицы пути индекса сведён в один модуль на оба стенда. Ключ
    --fine появился сперва у эталона одной ноги (hist-sellhedge.mjs), потом у оценщика ускорения
    (eval-accel.mjs), и чтение двоичной таблицы пути индекса оказалось скопировано в оба скрипта
    слово в слово. Формат неразмеченный: если одна копия однажды прочтёт поле другой ширины, прогон
    не упадёт, а напечатает другие цены и другую частоту перекладок. Поэтому разбор и поиск шага по
    метке времени вынесены в otmscan/hist-index-path.js, и оба стенда его импортируют. Чужой или
    оборванный файл теперь называет себя в сообщении об ошибке: сколько шагов обещает заголовок, на
    сколько хватает байт и какой это файл. Числа обоих стендов после переноса те же, что в записях
    выше, а в приложении этот модуль не исполняется.

  • [BTC-Options] Три направления, где у схемы продавца могла уцелеть премия за волатильность,
    замерены и закрыты ситами.
    С 2024 года разница между проданной подразумеваемой волатильностью и
    реализованной у BTC сжалась, и база стрэнгла даёт на истории 4-6% в год. Проверялось, осталась ли
    премия на стороне путов, на опционах эфира или только после встрясок. Планка записана до первого
    прогона (протокол bot2-предрегистрация-трёх-направлений-2026-09-24.md, внутренний каталог проекта
    вне репозитория): живое ожидание не ниже 10% годовых, то есть на стенде не ниже 16.8% годовых на
    второй половине записи (2024-02-10..2026-08-12) при мелком кадансе, мейкерской комиссии и боевом
    стресс-правиле размера. Доходность стенда переводится в живую поправкой на обратную цепочку (×0.69)
    и на простой линейной цепочки (×0.864).

    Путы. На второй половине пут соло при боевом размере потерял на |дельте| 0.45 и 0.25 (×0.99 и
    ×0.94 за 2.5 года) и заработал ×1.06 на 0.35, а колл соло на тех же дельтах дал ×1.14-1.17.
    Стресс-правило берёт худшую из двух сторон хода спота, поэтому любая смесь коллов и путов
    зарабатывает на единицу стресса не больше чем вдвое против лучшей одиночной ноги; лучшая нога дала
    6.5% в год, и граница с запасом на неттинг хеджа, 14.9%, ниже планки. Скос на входе итог пута не
    предсказывает.

    Эфир. Премия DVOL над реализованной за следующие 30 суток по одним и тем же дням: +0.6 пункта у
    эфира против +3.3 у BTC на второй половине записи, выше у эфира только в 2026 году.

    После встрясок. Шесть сигналов на входе (процентиль DVOL за 90 суток, изменение DVOL за 7 и 14
    суток, DVOL минус реализованная за прошлые 30 суток, наклон кривой сроков, скос); ни один не держит
    ранговую корреляцию +0.30 с итогом сделки на обеих половинах записи, а процентиль за 90 суток даёт
    +0.34 на первой и -0.21 на второй. Даже гейт, заранее знающий итог каждой сделки, при боевом
    размере дал бы 15.8% в год.

    Для замера eval-accel.mjs получил ключ --delta: целевая |дельта| всех цепочек прогона, то есть
    существующий параметр схемы deltaTarget, правило выбора ноги прежнее. Посделочная выгрузка
    дополнена спотом и ногами на входе, стресс-маржой на контракт при ходе ±45% и долей счёта в залоге
    при стресс-правиле базы, без округления лотов. Без ключа вывод совпадает с прежним до строки, с
    --delta 0.45 таблицы и дамп те же; тестов 1181, шесть книг охраны побитово те же. Отчёт:
    ОТЧЁТ-бот2-три-направления-2026-09-24.md там же.

  • [BTC-Options] Стоп по марже судит по капиталу счёта, не сгорает на неудачном закрытии и
    срабатывает при капитале ниже нуля.
    Живое правило выхода закрывает сделку, когда поддерживающая
    маржа проданных опционов достигает 60% капитала счёта. Внешняя проверка выгрузки бота 2 от 23.09
    нашла в нём три дефекта, все три воспроизведены движком на копии живого состояния.

    Знаменатель. Правило делило маржу на капитал, в котором результат сделки уже учтён, и прибавляло к
    нему ещё раз реализованную часть результата. На срезе 23.09 оно видело 24.94% вместо 24.01%, у
    сделки 1 держалось ниже настоящей загрузки на 2.5 пункта, а при распродаже хеджа перед экспирацией
    04.09 показывало 66.8% при настоящих 98.8%. Теперь в предикат идут капитал на начало сделки и её
    полный МтМ, как в офлайн-замере, и их сумма равна капиталу из account(). Тик без цены перпа при
    открытом хедже правило, читающее капитал, больше не судит: в таком тике account() теряет
    переоценку хеджа.

    Закрытие. Затвор записывался сработавшим до попытки закрыть сделку, и если у перпа не было цены,
    правило молчало до экспирации без строки в журнале. Теперь сработавший затвор записывается только
    вместе с исполненным выходом, и следующий тик решает заново.

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

    Комментарий правила описывает то, что происходит: затвор band считает шаги, и живой бот выходит
    через 15 секунд после первого пробоя, а не через два часа, как в часовом замере 2026-08-28.
    Поведение не менялось. Прогон пяти лет по пути индекса с шагом 15 секунд дал у стрэнгла те же 4
    выхода из 84 сделок, что и два часовых наблюдения, при росте 0.972 от базы против 0.980. Тестов
    1187, шесть книг охраны побитово те же. Отчёт ОТЧЁТ-бот2-проверка-внешнего-аудита-2026-09-24.md
    во внутреннем каталоге проекта вне репозитория.