Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 29 Jul 21:58
· 382 commits to main since this release

[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».