Repository navigation
v0.3.0
[0.3.0] - 2026-07-30
Крупный выпуск: BotLab становится мультиботовой оболочкой. Второй бот «BTC-опционы» (бумажный
крылатый стрэддл с дельта-хеджем) и третий бот-таб «Сканер OTM» (только наблюдение: сигналы входа
по волатильности, без ордеров) выходят вместе со светлой темой оформления. Отдельный проход по
отказоустойчивости закрыл потери данных при внезапном завершении приложения и долгих перерывах в
работе машины.
Влияние: торговая логика · P&L · UI · настройки/данные - добавлены движок опционных структур
с дельта-хеджем и движок сигналов сканера OTM (оба бумажные/наблюдательные, реальные ордера нигде
не выставляются); интерфейс перестроен в оболочку с тремя вкладками, добавлена светлая тема.
Пресеты дедбэнда и выбор исполнения в BTC-опционах теперь реально управляют хедж-движком (ранее
выбор не покидал конструктор); структура, дожившая до экспирации, теперь рассчитывается
автоматически. Funding-arb получил фикс долгого перерыва в начислениях и честные строки лога
сна/пробуждения машины - его основная логика и P&L не изменены, существующие позиции и журнал
не затронуты.
Добавлено
- [App] Оболочка-переключатель модулей: верхние вкладки «Обзор · Funding-arb · BTC-опционы» и
стартовый экран «Обзор» со сводкой по ботам (готовые модули, открытые позиции, суммарный P&L).
Funding-arb вынесен в отдельный вид без изменения его логики; навигация - по паттерну
WAI-ARIA tabs с полной поддержкой клавиатуры. - [App] Светлая тема оформления: сегмент-переключатель в шапке - луна/солнце, активная тема
подсвечена; выбор сохраняется в настройках и применяется до первой отрисовки окна - без вспышки
при старте. Палитра «бумажный
терминал» сохраняет идентичность тёмной: те же оттенки зон и семантики прибыль/убыток/нейтрально,
контраст ключевых пар текст/фон не ниже WCAG AA; графики перерисовываются в цветах темы при
переключении. Тёмная тема осталась прежней и по умолчанию. - [BTC-Options] Новый бот «BTC-опционы»: крылатый стрэддл на линейных USDC-опционах BTC
(длинные ATM колл и пут, короткие OTM-крылья, один экспиратор не позднее 3 дней) с дельта-хеджем
инверсным перпетуалом BTC-PERPETUAL. Данные - публичный REST Deribit, только чтение, без ключей
и без ордеров (paper); бумажный депозит по умолчанию 100 USD. Движок изолирован от funding-arb:
отдельный IPC-мост и отдельные файлы состояния. - [BTC-Options] Хедж-движок: триггеры дельта/цена/время, фильтр издержек (сделка только при
ожидаемой выгоде не ниже λ·издержек), пауза в окне расчёта 08:00 UTC и в последние 30 минут перед
экспирацией. Панель решения (ХЕДЖ / ПРОПУСК / ПАУЗА), разнесённый P&L (MTM опционов, реализованный
хедж, комиссии, фандинг перпа, нетто), таблица четырёх ног с греками, диаграммы payoff и
дельта-коридора, журнал операций с экспортом CSV/XLSX/JSON. - [BTC-Options] Сравнение «хедж против без-хеджа»: параллельный теневой расчёт без перпа показывает,
окупает ли хедж собственные издержки. - [BTC-Options] Метрики прогона: Sharpe по цикловым доходностям, доля прибыльных циклов,
максимальная просадка, число и средний размер хеджей; графики P&L-траектории с атрибуцией и
справочной цены BTC с маркерами исполнения хеджей. - [BTC-Options] Реальная маржа Deribit (стандартная маржа коротких ног, без неттинга): начальная и
поддерживающая маржа, текущая и худшая утилизация, честный флаг превышения депозита и алерт
поддерживающей маржи с порогом 80 %. - [BTC-Options] Стресс-сценарии: сдвиги цены ±5 % и ±10 %, скачок IV ±25 vol, фандинг ×3 за горизонт;
каждая строка помечена режимом оценки (мгновенный / на экспирацию / за горизонт), сдвиги цены
дублируются метками на диаграмме payoff. - [BTC-Options] Авто-конструирование: кнопка «Старт (авто)» сама выбирает ближайшую живую экспирацию
(не позднее 3 дней, минуя предэкспирационное окно) и страйки по офсету; подтверждение - тем же
тикетом. Структурированные пре-трейд проверки: блокирующие причины (минимальный лот, кратность
шагу, блэкаут расчёта) запрещают открытие; предупреждение «начальная маржа больше депозита»
открытие не блокирует - решение остаётся за пользователем. - [BTC-Options] Сигнал входа по волатильности: источник опрашивает ATM-полосу (стрэддл и крылья
±5/10/15 %), IV-ранг считается по скользящему окну 24 часа, индекс DVOL кэшируется с 48-часовой
историей; карточка «IV-режим · сигнал входа» отвечает, благоприятен ли вход сейчас. - [BTC-Options] Свип параметров: честный реплей накопленной истории снапшотов через чистый движок по
сетке «крылья × дедбэнд × ценовой триггер × λ» (108 комбинаций), ранжирование по Sharpe, отметка
комбинаций, не помещающихся в депозит; двухшаговое применение лучших параметров к конструктору
(открытая структура и её замороженные параметры не затрагиваются). - [BTC-Options] Телеметрия REST-канала: замер круговой задержки и серверного времени биржи; штамп
подключения показывает канал и RTT. WebSocket-транспорт оценён и отложен: REST не показывает
давления на лимиты, шов источника оставлен готовым к замене. - [OTM-Scanner] Подготовка обкатки S3b: суточная статистика обкатки в
otm-scanner-telemetry.json
(аддитивный ключstats) - распределения значений всех условий чеклиста и экономики лучшего
кандидата (издержки round-trip, минимальный капитал против депозита), доля тиков «нет кандидатов»
(материал вопроса Д8 об окнах экспираций), счётчики рестартов/деградации/блэкаутов; отчёт-скрипт
npm run report:scan- markdown-отчёт по воротам обкатки (вычислимость условий с поправкой Д8,
pass-rate и вырожденность порогов, экономика, журнал сигналов, материал калибровки слота
«Калиброванный»). Скрипт читает файлы профиля только на чтение и не ходит в сеть; PURE-движок
не тронут, funding-arb и бот 2 не задеты. - [OTM-Scanner] UI «Сканер» (фаза S3a): третья вкладка и карточка «Обзора» (в сводку позиций и
P&L сканер не входит - позиций у него нет), зона «Сигнал OTM» (токен состояния с dwell/TTL/
кулдаун/блэкаут-полосой, чеклист 14 условий У1–У14 tri-state «да/нет/н-д» с ядром У1+У10+У14,
кандидаты σ-окна с вердиктами У9–У14, экономика сделки лучшего кандидата: факты гейта У14 плюс
подписанная модельная аналитика P(ITM) и сценариев, журнал сигналов с полным CSV-экспортом),
зона «Настройка и качество» (пресеты Дмитрий v1/v2.0 и слот «Калиброванный», редактор порогов
с blur-валидацией и скретч-пресетом «Калиброванный*» для несохранённых правок, флаг события с
пунктирной рекомендацией пресета, панель честности pass-rate с CSV, кластер качества данных с
бюджетом GET/тик и авто-деградацией, канвас «RV против IV» с зоной недооценки и маркерами
сигналов), автостарт опроса при первом показе вкладки (решение А4), обе темы, e2e-сценарий. - [OTM-Scanner] Интеграция в main-процесс (фаза S2, живые данные без UI): собственный источник
опроса Deribit (перп + ATM-пары near/far + крылья ±1σ + кандидаты σ-окна, пересборка набора при
дрейфе спота 2%/ролловере/смене стороны; стаканы только финалистам, не более 2 на тик), кэши
свечей 1h (бэкфилл 10 дней) / DVOL (базлайн 90 дней) / цепочки опционов, IPC-неймспейсscn:*
с пушемscn:pushи мостомwindow.scn(start/stop/refreshNow/настройки/пресеты/флаг события/
экспорт журнала сигналов и pass-rate телеметрии в CSV/JSON), персист в изолированные файлы
otm-scanner{,-settings,-telemetry}.json(ACTIVE-сигнал переживает рестарт; битые файлы
карантинятся), авто-деградация каданса x2 при серии ошибок с автоматическим выздоровлением,
счётчик GET на тик как доказательная база бюджета запросов, живой самотестSCN_SMOKE=1.
Опрос живёт строго между start и stop - в простое ноль трафика. Funding-arb и бот 2 не задеты. - [BTC-Options] Сверка расчёта экспирации с официальной delivery-ценой Deribit: строки расчёта
теперь несут метаданные (страйки, размер), и как только биржа публикует delivery-цену дня,
в журнал добавляется строка «сверка» с поправкой реализованного P&L (расчёт по снапшоту индекса -
прокси; официальная цена - 30-минутный TWAP индекса перед 08:00 UTC). Работает и на буте, если
приложение было закрыто в момент экспирации. - [OTM-Scanner] Движок условий и сигнала (фаза S1, чистый и без UI): чеклист У1-У14 с tri-state
вердиктами (да/нет/н/д/выкл), режимами инфо/гейт и гистерезисом; экономика сделки по фактам
(комиссия 0.0003 индекса с кэпом 12.5% премии, спред по модели исполнения, breakeven,
минимальный капитал, кэп размера от глубины); агрегатор «строгий И»/«скоринг» с жёстким ядром
У1+У10+У14; жизненный цикл сигнала (дожим, TTL, инвалидация, кулдаун, заморозка в блэкаут,
ревалидация после рестарта); sizing с честными отказами; телеметрия pass-rate (сессия +
суточные вёдра UTC); контракт сигнала §8.1 заморожен фикстурой. 60 новых тестов. - [OTM-Scanner] Фундамент данных (фаза S0): клиент свечей (
get_tradingview_chart_data) и
delivery-цен (get_delivery_prices) с живой верификацией форм ответов; модуль реализованной
волатильности (RV7d/RV3d, σ1d, импульс за 24ч, EMA20) по закрытым часовым барам; пресеты порогов
SCAN_PRESETS («Дмитрий v1», «Дмитрий v2.0», «Калиброванный-черновик») с валидацией настроек;
отбор инструментов-кандидатов в σ-окне и окне экспираций; сетевой смоукnpm run smoke:scan. - [BTC-Options] Расчёт на экспирации: дожившая до экспирации структура автоматически
рассчитывается по внутренней стоимости на цене индекса (приближение расчётной цены Deribit,
зафиксировано в примечании строки журнала), перпетуал выравнивается, в журнале - событие
«расчёт на экспирации». Ранее позиция замирала: ноги исчезали из данных, гейт греков падал,
а переоценка показывала ложный ноль. - [BTC-Options] Метрики прогона переживают следующую сделку: при закрытии или расчёте структуры
сводка завершённого прогона замораживается; экспорт JSON и XLSX содержит метрики текущего и
последнего завершённого прогонов (CSV остается чистой таблицей событий). - [BTC-Options] Строка «гейт греков не пройден» в тикете называет инструменты, по которым не
хватает данных; полный список и детали ошибок - в подсказке при наведении.
Изменено
- [App] Заголовок окна «Funding-Arb Paper Simulator» → «BotLab».
- [App] «Обзор» суммирует оба бота (готовые модули, открытые позиции и структуры, суммарный P&L).
Кластер интервала опроса и LIVE стал специфичным для funding-arb; у BTC-опционов собственный
кластер подключения к Deribit.
Исправлено
- [BTC-Options] Тринадцать исправлений по итогам pre-merge ревью и сквозного UI-прогона (2026-07-11).
Критические: изменение настроек при работающем источнике останавливало опрос Deribit до
перезапуска приложения; гейт греков пропускал хедж по заниженной дельте при полностью выпавшей из
снапшота ноге; повторное открытие структуры молча затирало текущую вместе с её нереализованным
результатом. Существенные: неверный знак фандинга в модели издержек хеджа для короткой целевой
позиции; перекрывающиеся тики REST-источника могли записывать устаревшие снапшоты поверх свежих;
кнопка подтверждения тикета оставалась активной после блокирующего отказа движка; превью
конструктора не пересчитывалось после закрытия структуры; свип исключал все комбинации, если
источник был запущен до первого обращения к цепочке инструментов; применённые настройки не
доходили до движка до перезапуска. Прочие: Escape закрывает тикет опционов из любого фокуса;
причины пре-трейд проверки экранируются перед выводом; точки безубытка не рисуются за пределами
крыльев, где кривая уже плоская; поллинг ATM-полосы больше не останавливается после закрытия
структуры. - [App] Один профиль - один процесс: второй запуск BotLab больше не становится вторым писателем
тех же файлов, а завершается с записью в лог и поднимает окно уже работающего приложения. Раньше
две копии писали позиции, состояние ботов и телеметрию через общий временный путь, и последняя
запись молча побеждала. - [App] Сон и пробуждение машины видимы в логе, а работающие источники опрашиваются сразу после
пробуждения, не дожидаясь своего интервала. Строки честно оговаривают, что «сон» не сплошной:
macOS чередует его с тёмными пробуждениями, в которых опрос продолжается, поэтому величина
называется окном с момента объявления о засыпании, а не длительностью сна. - [OTM-Scanner] Счётчики непрерывности не переживают рестарт: дожим сигнала (N подряд
подтверждающих тиков) и память гистерезиса условий сбрасываются при запуске с записью причины в
лог. Раньше сигнал, начатый до закрытия приложения, мог дозреть одним свежим тиком через разрыв
любой длины, а протухшее «условие проходило» смягчало первый свежий отказ. Активный сигнал при
этом не трогается - его по-прежнему проверяет первый живой тик (TTL, исчезнувший инструмент,
сменившаяся экспирация). - [BTC-Options] Испорченный файл состояния бота отправляется в карантин (
.corrupt-<метка>) и
заменяется чистым вместо того, чтобы молча уничтожаться. Раньше нечитаемыйbtc-options.json
приводил к тихой перезаписи: журнал сделок, открытая структура и реализованный результат
исчезали без следа. Файлы funding-arb и сканера так вели себя и раньше. - [BTC-Options] Пропуск начисления фандинга сверх защитного ограничения (5 минут) больше не
невидим: состояние перпа несёт сумму пропущенных секунд, а в журнал добавляется строка с
нулевыми суммами и причиной. Само ограничение не менялось - оно защищает от разового
«догоняющего» начисления после долгого перерыва. - [Funding-Arb] Долгий перерыв в работе больше не съедает часы начислений: если разрыв превысил
предел одного шага, недостающий отрезок сначала дозабирается историей с биржи и только потом
рассчитывается. Так уже работал путь загрузки приложения; теперь то же самое делает и работающее
приложение, и закрытие позиции после перерыва. - [BTC-Options] Пресет дедбэнда меняет фактическую ширину коридора (агрессивный ±0.0005 BTC,
нормальный ±0.001, консервативный ±0.002), а не только подпись: ранее движок продолжал работать
шириной по умолчанию при любом выборе. Несогласованные пары пресет/ширина в сохранённых
настройках разово выправляются при запуске; параметры открытой структуры, как и прежде,
заморожены до следующего открытия. - [BTC-Options] Выбор «Исполнение» доезжает до хедж-движка и честно моделируется: рыночное -
пересечение спреда с комиссией 0.05%, лимитное - исполнение по середине спреда с комиссией 0%
(компромисс за немоделируемый риск неисполнения); проскальзывание сохранено в обеих ветках как
ненулевой пол издержек. Ранее выбор не покидал конструктор, а все исполнения шли по рыночной
модели. - [BTC-Options] Сверка журнала (ledgerReconciles) не требует строк фандинга (начисление -
сознательно только в аккумуляторе) и сводит реализованный результат против суммы обоих
аккумуляторов - перпа и опционов; ранее проверка гарантированно расходилась на любом прогоне
с фандингом или после первого закрытия структуры. - [BTC-Options] Временной триггер в карточке «Хедж-движок · решение» больше не называется
«интервалом реприса»: подпись говорит «интервал хеджа» и показывает его значение (60 с
по умолчанию). Это отдельный параметр движка, не связанный с интервалом опроса источника;
справка панели уточнена. - [BTC-Options] Интервал реприса по умолчанию - 15 секунд, как в селекторе (5/15/30). Ранее
скрытый дефолт равнялся 3 секундам: селектор не мог его ни показать (ни одна кнопка не
подсвечивалась), ни вернуть после первого изменения. Профили со старым дефолтом разово
выправляются при запуске; выбранные вручную значения не затрагиваются. - [BTC-Options] Сбой вспомогательного инструмента (дежурный набор для сигнала IV) больше не
переводит статус источника из LIVE в ПРЕДУПР.: здоровье источника оценивается по
перпетуалу и ногам открытой структуры, как и задумано; ошибки band-инструментов остаются
видимыми в подсказке статуса. Гейт греков и логика хеджа и ранее оценивались корректно -
деградировал только бейдж. - [BTC-Options] Открытие структуры защищено от гонки котировок: страйки теперь выбираются по той
же цене, по которой опрашивались ноги, а нога без котировки стала блокирующей причиной
«нет котировки (mark)» в тикете. Ранее при движении цены между подбором ног и открытием
структура могла открыться с непрокотированной ногой, и её премия молча выпадала из
нетто-дебета и оценки максимального убытка. - [BTC-Options] Закрытие структуры при снимке без цены перпетуала откладывается с ошибкой
«нет цены перпетуала в снимке», а не исполняется наполовину. Ранее опционная часть
фиксировалась, структура очищалась, а невыровненный хедж превращался в неуправляемую
позицию: кнопка закрытия прячется вместе со структурой, фандинг продолжал начисляться. - [BTC-Options] Кнопка «закрыть структуру» требует свежих данных: при остановленном источнике
или статусе «УСТАРЕЛО» закрытие возвращает ошибку «данные устарели - дождитесь LIVE», а не
молча фиксирует P&L по последнему (возможно, давно устаревшему) снимку. - [BTC-Options] Изменение параметров движка (λ, дедбэнд, триггер, исполнение, блэкаут) при
работающем источнике больше не пересоздаёт опрос: источник перезапускается только при смене
интервала реприса или testnet. Ранее любая правка обнуляла дедуп-базлайн и на мгновение
показывала статус «УСТАРЕЛО». - [BTC-Options] Офсет крыльев и количество контрактов сохраняются в настройках наравне с
остальными параметрами конструктора: выбор переживает перезапуск приложения, а свип
использует фактическое количество пользователя. «Применить лучшие параметры» теперь переносит
и крылья - ранее применённый свипом офсет терялся при перезапуске. Быстрая серия правок
тулбара больше не теряет промежуточные патчи (дебаунс сливает их в один). - [BTC-Options] Пустая таблица свипа называет фактическую причину исключения комбинаций
(из результатов свипа), а не всегда «нет котировок ног»: при исключении из-за блэкаута или
отсутствия опционов экспирации подпись раньше вводила в заблуждение. - [BTC-Options] Вердикт свипа «в лимите / IM > деп.» сверяется с текущим equity счёта
($100 + накопленный P&L) - тем же лимитом, что и предупреждение тикета. Ранее свип сравнивал
маржу с константой стартового депозита, и после заметного P&L его вердикт мог расходиться
с проверкой при открытии. - [BTC-Options] Параметры движка, замораживаемые в открытой позиции, берутся из фактических
параметров подтверждённого тикета (кол-во, офсеты, стиль исполнения) поверх настроек. Ранее
подтверждение, догнавшее только что переключённый контрол (пуш настроек идёт с задержкой),
могло заморозить устаревший стиль исполнения - позиция хеджировалась не так, как показывал
тикет. - [BTC-Options] Карточка «Модель издержек хеджа», разбивка фильтра и справка теперь прямо
говорят, что комиссия в фильтре оценивается за полный оборот (вход + будущий выход хеджа) и
потому вдвое больше комиссии одного исполнения в журнале. Сама модель не менялась - устранено
расхождение между показанной цифрой и строками журнала. - [BTC-Options] Предупреждение о марже в превью-тикете при уже открытой структуре считает equity
с учётом живой переоценки её ног: ранее превью опрашивало только ноги новой структуры, и MtM
открытой позиции выпадал из equity (ноги падали на цены входа). - [BTC-Options] Поле λ валидируется: принимаются только конечные значения ≥ 1, невалидный ввод
помечается и не сохраняется, blur возвращает последнее принятое значение. Ранее пустое поле
молча сохраняло 1.25, а значения вроде 0.5 или −2 проходили в движок и вырождали фильтр
издержек (для следующего открытия). - [BTC-Options] Бейдж «реприс Nс» в шапке хедж-движка показывает действующий интервал опроса,
а не значение, замороженное при открытии структуры: реприс - живая настройка источника и
меняется сразу (руководство §3), в отличие от остальных параметров шапки. Справка панели
уточнена.
Известные проблемы
- [App] Этот выпуск - снова только Windows: секретов подписи Apple в CI по-прежнему нет (см.
известные проблемы 0.2.0). Код и ресурсы для macOS (иконка, entitlements, цель electron-builder)
уже готовы - подключение ждёт только сертификата Developer ID. - [OTM-Scanner] Пресет «Калиброванный» - пустой черновик: реальные пороги появятся по итогам
тестирования с Дмитрием. Пока отправная точка - пресеты «Дмитрий v1» / «Дмитрий v2.0».