Repository navigation
v0.4.0
Влияние: торговая логика (бот 1) · P&L · UI · настройки/данные - выпуск раздаётся
клиентам, стоящим на 0.3.1, вместе с непубликованными 0.3.2 и 0.3.3, поэтому для них действуют ТРИ
секции: 0.3.2, 0.3.3 и эта. Главное здесь: бот 1 перестал считать по пяти зашитым рынкам и собирает
вселенную живым отбором (на снимке 18.09 это 50 рынков из 151 плюс пять имён запаса), и это теперь
поведение ПО УМОЛЧАНИЮ. Замер расширения от 16.09: те же правила и тот же капитал $2500 дают около
$40 в год на двух монетах и около $560 на полусотне имён. Плюс аудит механики 18.09 и починка его
находок: живой тракт исполнял не то правило, которое стерегут книги, и разница стоила 9.8% годового
нетто.
Что увидит владелец открытой сделки при обновлении. На первом кадансе после перехода правило
выхода сравнит её не с четырьмя альтернативами, а с полусотней, и может переложиться. Убытком это
не является: перекладка требует, чтобы нетто альтернативы перебило брутто удержания на полный круг
издержек. Но момент такого решения назначает обновление, а не рынок. Кому нужна ровно старая пятёрка
до закрытия сделки, ставит FA_UNIVERSE_APPLY=0.
Добавлено
-
[Funding-Arb] Правило отбора вселенной рынков
src/engine/fa/universe-scan.js(фаза 1 плана
расширения от 2026-09-16). Чистая функцияselectUniverseпересекает живой список рынков GMX с
монетами Hyperliquid и отсекает по листингу, свободной ёмкости худшей стороны и доле нашего тикета
в открытом интересе рынка. Каждый отвергнутый рынок несёт код отказа (univ_not_perp,
univ_not_listed,univ_no_hl,univ_no_room,univ_oi_share,univ_too_young,univ_capped,
univ_no_ticket), и сумма инструментов и отказов равна числу поданных рынков: молчаливого
пропуска нет. Пороги живут замороженной константойFA_UNIVERSE_DEFAULTS, то есть решение
владельца это значение, а не правка кода. Ключ инструмента<SYM>-<цепь>-<пул>: у GMX несколько
рынков на один символ на одной цепи (у BTC на Arbitrum три, с открытым интересом $12.4 млн,
$3.67 млн и $2934), и ключ по символу схлопнул бы их молча; существующие ключиETH,BTCи
ETH-Avaxзакреплены за адресами рынков и не меняются. На снимке 16.09 (147 рынков GMX, 178 живых
монет биржи) при тикете $2500 порог 10% даёт 49 инструментов и 98 отказов, порог 100% даёт 84 и 63;
снимки обрезаны в фикстурыtest/fixtures/markets-info-*.jsonиhl-meta.json. Попутно замерено
и заведено значениями, по умолчанию выключенными: ворота покрытия истории новые имена НЕ держат
(самый молодой из 49 старше 216 суток, а долив баз закрывает 720 часов одним запросом), для этого
есть порог возраста рынкаminListingAgeDays; точное совпадение имён теряет четыре рынка, которые
Hyperliquid котирует в тысячах штук (kPEPE, kSHIB, kBONK, kFLOKI), для этого есть пустая таблица
псевдонимовhlCoinAliases, добавляющая при пороге 10% один рынок. Отбор НЕ ПОДКЛЮЧЁН:
universe.jsне тронут, автомат по-прежнему считает пять инструментов, книги побитово те же. -
[Funding-Arb] Снабжение живым списком вселенной под флагом
FA_UNIVERSE_SCAN=1(фаза 2 того же
плана). Список рынков перестал быть зашитым: он собирается отбором на кадансе решения, переживает
перезапуск в профиле (funding-arb-universe.json), и по нему идут снимки, наблюдение баз, стаканы,
прогрев и долив кадров, панели и запись. Автомат при этом продолжает решать по ПЯТИ именам:
срез правила входа остался наALL_MARKETS, применение это фаза 3. ПриFA_UNIVERSE_SCAN=0
поведение прежнее побитово - список становится ровноALL_MARKETS, ни одного лишнего запроса и ни
одного лишнего байта записи.
Развод схем сделан правиломresolveUniverse: отбор возвращает РЫНКИ, приложение торгует
ИНСТРУМЕНТЫ, и голая подстановка потеряла бы одноногую половину вселенной (ключейETH-Arbи
BTC-Arbотбор не выдаёт вовсе) и сменила бы схему ключуETH-Avaxс одноногой на двуногую, уведя
кадры и летопись баз из-под него. Запасuniverse.jsпобеждает по ключу, схема ключа не меняется
никогда, и новый рынок получает ТОЛЬКО двуногую схему: вся измеренная экономика расширения снята
двуногой схемой по одному инструменту на имя, одноногая для новых имён не измерена вовсе. На
снимке 16.09 это 49 рынков отбора, из них три под ключами запаса, то есть 51 инструмент приложения
(48 двуногих и 3 одноногих).
Удерживаемый инструмент ПРИКРЕПЛЁН к списку до закрытия сделки, а список поднимается с диска ДО
ловушки сирот на буте:closeOrphanedPositions()закрывает позицию, чей инструмент не опознан, и
при живом списке перезагрузка приложения закрыла бы живую сделку без единого решения правила.
Запись снимка получила блок составаu(источник, число инструментов, пороги в силе и перепись
отказов по кодам в каждой строке; полный перечень пар «ключ, код» только в строке пересборки).
Объём при 51 инструменте и опросе раз в пять минут 5.85 МБ в сутки, то есть 2.14 ГБ в год: число
3.66 МБ из плана относилось к 32 именам. Потолок пер-рыночных отказов на пульте поднят с 8 до 40 и
дополнен переписью по кодам без потолка. Источники получили вторые выходы (marketsу GMX,
universeу Hyperliquid): приведение теряетisListed,listingDateи признак делистинга монеты,
и отбор на приведённых строках отказал бы всем рынкам либо принял бы делистингованную монету за
годную ногу хеджа.
Стаканы переведены на каданс решения ТОЛЬКО на пустом слоте, и это поправка к плану по замеру:
порог свежести стакана у правила входа 30 секунд, а событие и сторож залога решают вне каданса и,
войдя в ветку решения, сдвигают метку решения безусловно, поэтому суточный каданс стаканов под
открытой сделкой не отложил бы форсированное решение, а съел бы событие. Оба форсирующих условия
требуют открытой позиции, поэтому правило точное: слот пуст - стаканы к решению, сделка есть -
каждый опрос. Цена измерена и мала: 40 монет параллельно стоят 296-521 мс против 277 мс на двух. -
[Funding-Arb] Применение живого списка в срезе правил под флагом
FA_UNIVERSE_APPLY=1(фаза 3
того же плана). Автомат перестал считать по пяти именам: срез правила входа и правила выхода
берётся с живого списка. Флаг ПО УМОЛЧАНИЮ ВЫКЛЮЧЕН и требует включённогоFA_UNIVERSE_SCAN
(просьба применить без сбора не исполняется молча, а называется в журнале); при выключенном срез
остаётся ровноALL_MARKETS, и живой бут это подтвердил: снабжение видело 50 инструментов, срез
оставался на 5. Складка среза вынесена из главного процесса в движок (src/engine/fa/slice.js) и
там же под тестом на полусотне инструментов: проверять срез по копии складки значило бы проверять
копию. Схема строки берётся уschemeOf, то есть второй точки правды о схеме больше нет.
Приёмка ФОРМЫ, а не чисел, и это поправка к плану: план требовал воспроизвести офлайн-прогоном
нетто $559.11 и 22 перекладки, но стенд воспроизводит их точно и о приложении не говорит ничего.
Срез приложения отличается от среза стенда ПО ПОСТРОЕНИЮ - у стенда нет полейbookMissingи
bookAgeSec(значит ворота стакана не работают вовсе), зато есть кривая удара GMX, которой у
приложения нет, и имя рынка у него голый токен против ключа инструмента. Совпадение чисел
означало бы, что срез приложения потерял ворота стакана, поэтому проверяется паритет формы:
рынок со свежим стаканом даёт побитово ту же кривую, что и он же без живых ворот, а кодыno_book
иstale_bookприходят только от ворот и взяться без них неоткуда.
Удерживаемый рынок, не прошедший ворота данных, проверен отдельно: брутто удержания стакана НЕ
требует вовсе (удар это издержка сделки, а не начисление), поэтому потеря стакана своей монеты
удержание не ослепляет и сравнение не портит; теряется ровно одна возможность - перекладка в тот
же рынок другим размером, и она отказывается честным кодомno_book.
Живая трасса расчёта перестала копировать себя на каждом проверенном размере. Замер на данных
стенда при капитале $2500: на 51 рынке решение стоило 3939 мс против 530 мс без трассы, то есть
3.4 секунды синхронного простоя главного процесса, и это без учёта 2537 отправок снимка общим
весом 294 МБ; на 63 рынках было 6481 мс. Трасса копится на месте
(applyFaEntryTraceEvent), а наружу уходит отсоединённым снимком не чаще 200 мс: решение на 51
рынке стоит 560 мс, отправок 3 общим весом 277 КБ. Записанная трасса от этого не теряет ни одного
образца и сверена побитово со старым способом на 5, 32, 51 и 63 рынках.
Журнал автомата получил строку состава решения: число рынков среза, годных по истории,
профинансированных, стоимость решения в миллисекундах и перепись отказов по кодам. Печатается на
решении, на смене исхода и на смене числа годных - последнее ради прогрева, в который исход не
меняется ни разу, а срез растёт с нуля до полусотни. -
[Funding-Arb] Интерфейс на полусотне рынков (фаза 4 того же плана). Автомат с фазы 3 решает по
полусотне, а вкладка писалась на пяти именах: живой замер дал 15 739 пикселей содержимого, из них
7797 одна карточка расчёта. Стало 8734 и 1935, то есть вкладка вдвое ниже, а карточка расчёта
вчетверо, и ни одно число с экрана при этом не ушло. Сделано четырьмя правками.
Состав вселенной едет в набор и стоит строкой над сводкой оценки: источник списка, просмотрено
и взято, пороги и перепись отказов ПО КОДАМ («доля интереса 56, нет на бирже 24» вместо сотни
строк). Это единственное место, где до экрана доходят восемь кодов отбора: рынок, отсечённый
отбором, в срез правила не попадает вовсе, и строки в сводке у него нет и быть не может, поэтому
без состава перевод этих кодов описывал бы недостижимое состояние. Все восемь названы словами в
обоих словарях, и сверка кодов с реестрами движка идёт теперь по ПЯТИ реестрам в обе стороны.
Сводка оценки получила поиск по имени, порядок по нетто (это критерий самого правила входа),
фильтр по исходу чипами с числами и свёртку хвоста: раскрыты первые десять строк плюс
удерживаемый рынок, остальные по кнопке, которая называет их число до нажатия. Отрисовка
по-прежнему не считает ничего: порядок это сравнение готового поля движка, а ранг печатается из
него же, и то и другое под тестом.
Трасса расчёта сворачивает в строки групп по причине те строки, в которых нет ни одного числа:
на полусотне это 77 строк из 97 (47 невыбранных ног A/B и 30 рынков, отсечённых воротами до
кривой). Строка с кривой, с рангом или с идущим расчётом не сворачивается никогда.
Повтор расчёта перестал расти вместе с вселенной: пейсинг был задан на рынок и давал 13 секунд
на пяти именах, 87 на полусотне и 109 на шестидесяти трёх. Теперь задан общий бюджет, доля рынка
считается из него, а при нехватке доли кадры прореживаются, причём последняя проверка размера
показывается всегда и полная кривая остаётся в раскрытии строки. На пяти именах доля упирается в
прежний потолок, и повтор идёт секунда в секунду как раньше; на полусотне часы показали 25.9 с
против 52.6 с до правки. Оценка стоимости кадра берётся из фактического промежутка между кадрами и
подстраивается под машину: замер показал, что кадр дорожает по ходу повтора с 22 до 100 мс, потому
что перечень точек собирался и для скрытой строки деталей; теперь он строится только для
раскрытой, а кривая считается один раз на набор точек.
Правил движка, порогов и книг фаза не касается: наружу добавлено одно поле набора, шесть книг
побитово те же. Харнесс сверки карточек расширен на новую форму (190 проверок), и числа всех
пятидесяти строк сверяются по-прежнему, на раскрытом хвосте.
Изменено
-
[Funding-Arb] Живой отбор вселенной ВКЛЮЧЁН ПО УМОЛЧАНИЮ (
src/main/main.js). Флаги
FA_UNIVERSE_SCANиFA_UNIVERSE_APPLYперестали быть выключателями «включить» и стали
выключателями «выключить»: значение0возвращает поведение пяти зашитых имён побитово, любое
другое значение или его отсутствие означает живой список. Решение владельца 18.09: «нам нужно
всегда использовать все новые монеты». Отказ снабжения бота без рынков не оставляет: список
поднимается из сохранённого файла профиля, а без него из тех же пяти строк, и источник назван в
журнале буга. Живой бут на изолированном профиле 18.09: 151 рынок просмотрен, 50 взято, в срез
ушло 52 инструмента, первое решение вошло в LINK с нетто $30.74 при том, что все пять старых имён
отказали (negative_at_every_sizeу четырёх,below_fund_ratioу BTC). -
[Funding-Arb] Руководства ru и en приведены к коду: живой отбор и его ворота с кодами отказа,
состав вселенной строкой над сводкой, поиск, порядок и свёртка в карточке оценки, новые коды
отказа (room_unknown,zero_base,src_implausible,held_missing), поправка ноги Hyperliquid
на текущую стоимость позиции, самолечение указателя слота после ручного закрытия и строкаclose
в архиве, замеренный объём записи на полусотне рынков (5.72 МБ в сутки против 0.63 МБ на пяти).
Исправлено
-
[Funding-Arb] Двенадцать механизмов, у которых цена сегодня ноль, а механизм реален: все они
становятся достижимы при живом отборе вселенной, поэтому починены ДО его включения. Книги не
двигаются ни у одного: это поведение в состояниях, которых на фикстурах не бывает.
Неизвестность называется, а не подменяется. Сторож залога досматривает ОБЕ ноги: цикл выходил
на первой ноге с непосчитанным запасом, и измеренная опасность на второй глушилась целиком (запас
43% при требуемых 50% не показывался даже числом). Теперь тонкая посчитанная нога решает
(ликвидация невосстановима), непосчитанная при здоровых остальных остаётся отказом снабжения, а
то, что ногу не видно, едет полемunknownLegs. Неизвестное место на рынке отказывает своим кодом
room_unknownвместо чтения как бесконечного: своя конвенция проекта в отборе вселенной ровно
обратная («неизвестная ёмкость это не бесконечная ёмкость»), и теперь они совпадают. Непроверенное
тождество баз перестало выдаваться за проверенное: ответ несётok(«не опровергнуто») иchecked
(«проверка состоялась») раздельно, а предикат покрытия переписан явно (число покрытых часов не
изменилось ни на один). Наблюдённый НОЛЬ базы получил свой кодzero_baseи свой счётчик времени:
две шапки обещали его дважды, а в реестре его не было.
Отказ называется своим именем. Тождество баз сторон сверяется ЖИВЬЁМ, как обещает SPEC 3.3: в
полеbaseIdentityOkехала совсем другая проверка (тождество ставок внутри ответа GMX), поэтому
оператору при сбое знаков говорили «база пришла не та», а защиты от подмены базы не было вовсе.
Ворота включены по замеру: 18 110 наблюдений живой записи дали невязку медиана 2.9e-10, максимум
1.3e-7 и ни одного выше строгого порога 1e-6, а подмену интереса в токенах они ловят (0.92% у BTC,
20.6% у ETH). Числам источника, не сходящимся самим с собой, заведён свой кодsrc_implausible.
Часы без базы, съедающие брутто, стали измеримы: кривая рынка несёт число посчитанных часов и
причины недосчёта, а ворота покрытия честно названы тем, что они выравнивают строки, а не
посчитанные часы (искажение не больше 5%).
Состояние сходится само. Отложенное решение (defer) больше не тратит ни каданс, ни снимок
событий: тратился он на отказ снабжения, а снимок переписывался уже сдвинутыми числами, и событие
исчезало без решения. Взвод автомата снимает метку решения и требует решения немедленно, как
обещает PLAN раздел 7 (до 24 часов простоя после каждого ручного включения). Удерживаемый рынок,
выпавший из среза целиком, назван своим кодомheld_missing: раньше тик получал от правила
defer("short_history")каждый каданс до перезагрузки, то есть сделка висела без пересмотра под
кодом «истории меньше горизонта» у рынка с историей 720 часов. Граница закона заморозки параметров
названа: значения он держит, а поля, которых при взводе не существовало, приезжают из умолчаний, и
тик возвращает их список (строгое чтение отключило бы сторож просадки, выкаченный после взвода).
Источники независимы. Отказ Hyperliquid останавливает ДВУНОГИЕ схемы, а не весь срез: у
одноногой схемы его ноги нет вовсе, круг не содержит тейкера биржи, узлы стакана для неё не
читаются. Починено в трёх местах, и без третьего первые два были бы косметикой: ворота данных
больше не спрашивают стакан у схемы без ноги Hyperliquid, иначе при недоступной бирже стаканы
протухали бы и одноногие рынки отказывали бы кодом протухшего стакана. Трасса входа приведена туда
же: она проекция правила и режет так же. Новые коды названы словами в интерфейсе и в обеих локалях. -
[Funding-Arb] Нога Hyperliquid книжится на СТОИМОСТЬ позиции, а не на ноционал входа. Находка 5
аудита механики 18.09. Конвенция биржи подтверждена первоисточником, её документацией:
«the funding payment at the end of the interval is position_size * oracle_price * funding_rate».
Настоящая короткая позиция держит фиксированное число монет, поэтому при ходе цены на 10% нога
платит и получает на 10% больше. У GMX конвенция обратная (sizeInUsdзаморожен при открытии), то
есть для ноги GMX ноционал входа это верное число, а леджер применял конвенцию GMX к обеим ногам.
Пересчёт закрытой сделки BTC/B по копии леджера с mb12 (368 расчётов, цена входа $77 337, ходила
$75 400..$81 453, средний множитель 1.0101): нога HL +$7.8559 вместо +$7.7760, то есть
занижение $0.0799 или 1.0% ноги, а сумма ног по-прежнему сходится сcumFundingдо шестого знака.
Ошибка была пропорциональна дрейфу цены (на альтах расширенной вселенной с ходом 30-50% это
30-50% ноги) и систематически ЗАНИЖАЛА величину: расчёт HL положителен там, где лонги платят
шортам, то есть в среднем на растущем рынке.
Множитель берётся марковой ценой, а биржа считает оракульной, и разница названа: оракульная цена в
приложение не доезжает вовсе, а ошибка от подмены это не сам базис, а его изменение между входом и
расчётом (замер живого контекста биржи 18.09 по 234 монетам: базис 4.2 базисного пункта у BTC, 2.0
у ETH, медиана 8.6). Историческая ветка начисления поправку применить НЕ МОЖЕТ: колонки цены в
часовой строке кадра нет вовсе, и это названо на месте, а не оставлено молча. Оттуда же следует,
что книги не двигаются: они идут исторической ветвью, и прогон охраны это подтвердил. Когда
множитель не равен единице, он едет в журнал начисления полемhlScale; при единице выражение
исполняется то же и в том же порядке, что до правки, побитово. -
[Funding-Arb] Сторона ноги (конфигурация A или B) выбирается по окну оценки, а не по одной
мгновенной строке опроса. Находка 2 аудита механики 18.09 и главный его вывод: живой бот
исполнял НЕ ТО правило, которое стерегут шесть книг. Обе книги бота 1, стенды исследования,
панель входа интерфейса иSPEC-bot1-sizing.md1.2 выбирают сторонуscanTwoLegпо обучающему
окну; срез правил (fa/slice.js) брал её изsnap.chosen, то есть из argmax ставки ОДНОЙ строки
текущего опроса. Увидеть это не могла ни одна из четырёх работающих проверок проекта: книги этот
код не трогают вовсе, а юнит-тест подавал сторону фикстурой и проверял её пронос. Цена, замеренная
на 63 рынках при капитале $2500: -$15.33 нетто за год (-1.8%) и минус 27% профинансированных
рынков на срез (26.04 против 35.70). Критерии расходятся на 33.1% часов; чаще теряется не знак
ставки, а МЕСТО: в 2.2% часов поданная сторона отказана (no_room321 раз из 467), а другая
годна, то есть рынок терялся целиком при медианном нетто потерянной стороны $16.88.
Доказательство починки это зелёная охрана: шесть книг побитово те же, потому что они и так
считали сторону окном, и приведён к ним живой тракт, а не наоборот. Замер частоты переворотов на
копии живой записи mb12 (3627 снимков за 12.6 суток) и на годовом часовом кадре: мгновенный
критерий переворачивался 3.8 раза в сутки у BTC и 3.9 у ETH, оконный на тех же данных 0.045 и
0.033 раза в сутки, то есть в 50 и 71 раз реже.
ЧЕГО НАРОЧНО НЕ СДЕЛАНО: перебора обеих сторон полным правилом с выбором лучшей по нетто. Это
выглядит как принцип «перебирать все варианты и брать лучший», но измерено и ХУЖЕ: $812.53 против
$840.30 у оконного критерия, потому что нетто на трейлинге это оценка внутри выборки, и сторона,
выигравшая по ней, чаще разворачивается (29 перекладок против 27).
Окно приходит в срез снаружи (autoWindowHот замороженных параметров сделки), своего числа у
среза нет: сторона, выбранная на одном окне, и брутто, посчитанное на другом, описывали бы разные
рынки. Кадра на окно не хватило (новое имя) - сторона берётся из снимка, и это видно полем
directionKnown, а в трассе входа источником стороны (windowвместоlive_rates). Приведены к
новому поведению: две подписи трассы входа и справка в обеих локалях, руководство бота 1 ru и en
в трёх местах каждое. -
[Funding-Arb] Ручное закрытие сделки больше не заклинивает автомат. Кнопка закрытия меняла
статус позиции, но не трогала указатель слота автомата, а обнуление указателя стоит только в
исполнении намерения внутри тика. Следующий тик позиции по указателю не находил, поднимал
orphan_position(третий по старшинству, то есть решает раньше любого правила) и выходил раньше,
чем доходил до обнуления: автомат вставал навсегда, перевзвод из интерфейса не лечил и вредил
(стирал счётчик непрерывности). Найдено 18.09 на живой машине при закрытии сделки BTC/B.
Указатель теперь ЛЕЧИТСЯ НА МЕСТЕ, и лечение разбирает два состояния, которые до этого назывались
одним кодом: сделка, закрытая мимо тика, в леджере лежит и лежит закрытой, то есть слот свободен
по факту; сделки, которой в леджере нет вовсе, могло случиться что угодно, и открывать вторую
поверх неизвестной первой нельзя, поэтому этот случай по-прежнему останавливает автомат. Отказ
при этом назван, а не проглочен: код едет в журнал тика с признакомhealedи отдельной строкой
в лог. Признак закрытой сделки считается по леджеру в главном процессе и отдаётся тику готовым:
движок леджера не видит вовсе.
Попутно ручное закрытие стало писать строкуcloseв потокfa-trade. Запись стояла только в
тике автомата, поэтому закрытая руками сделка оставалась в архиве открытием без закрытия: журнал
показывал её живой навсегда, а итог сделки в архив не попадал. Причина закрытия названа своим
словомmanual_close(свой реестр записи: это не вывод правила и не сработавший сторож, а
действие человека) и переведена в обеих локалях. Круг издержек на строке выхода не пишется: он
лежит на строке входа. Книги не двигаются, шесть штук побитово те же. -
[Funding-Arb] Двенадцать шапок и обоснований приведены к коду; поведение не тронуто ни в одном,
шесть книг побитово те же. Это находки аудита механики, у которых цена ноль, а свидетель в
репозитории ложный, и следующий аудит читал бы их как показания. Достижимость ветки кэша
обоснована числом «0 из 8041», снятым на 63 рынках исследования, тогда как на живых пяти именах
ветка СРАБАТЫВАЕТ (3 выхода в кэш за год, 162 часа простоя из 336 срезов), то есть «вырожденная
вселенная» шапки и есть вселенная живого бота. Потолок О2 берёт базу, взвешенную потоком ОКНА, SPEC
в псевдокоде пишет живую, а замер цены потолка сделан по медианной: три разные базы под одним
обоснованием, и отношение взвешенной к медианной по именам от 0.04 до 1.99. Вес взвешивания это
КОТИРУЕМАЯ ставка, а не поток получения, и подмена консервативна (потолок жёстче правильного).
Ограничение О3 названо последним ИЗМЕРЕННЫМ узлом кривой, а реализовано одной константой $500 000
на все рынки при неполной кривой у 21 рынка из 63 (цена на тикете $2500 ноль, появится при капитале
от ~$25 000). Ворота доли открытого интереса мерят сумму сторон, а их обоснование мерит базу
фандинга нашей стороны: на 551 655 часах ворота 10% проходят 59.3% часов, и в 20.9% из них тикет
$2500 больше 10% базы принимающей стороны. Ворота данных называют ПЕРВЫЙ сработавший код, тогда
как шапка автомата требует все применимые. Пресетfa-uniform-v1помечен калиброванным, а его
калибровка в живом тракте недостижима: он задаёт потолок тикета бесконечным, а автомат опускает
потолок до капитала сделки для любого пресета. Разнос круга от 07.09 не дошёл до кривой результата
сделки:equityNetсчитается на полный круг, и два числа об одной позиции расходятся на $4.375 всю
её жизнь. Окно долива баз названо горизонтом, а приходит в него окно (сегодня оба 720, разойдутся в
фазе 7). Круг у сторожа просадки ЛЕДЖЕРНЫЙ (без проходки стакана), у правила он другой, на BTC
разница $0.03. Второй порядок разбавления был назван только в выгодную сторону: в часы собственной
уплаты наш вход перекос УВЕЛИЧИВАЕТ (в живой сделке 124 часа из 191). Ссылка шапки снимка на охрану
живой базы снова верна, и это закрыто кодом, а не текстом. -
[Funding-Arb] Две шапки правила входа приведены к замеру; поведение не тронуто, шесть книг
побитово те же, 1106 тестов зелёные.
sizing.js,flowWeightedBase: шапка утверждала, что взвешенная потоком база «отвечает ровно на
тот вопрос, который определяет удержание». Замер по 63 именам за год: при размере, который
ограничение О2 РАЗРЕШАЕТ (S <= B_fw), фактическое удержание выше 50% не бывает НИ У ОДНОГО
имени, медиана 27.9%, ниже 25% у 28 имён, и даже у ETH 47.6%, у BTC 45.9%; разрыв с настоящим
порогом половинного удержания медиана x7.6, максимум x22 376. Причина структурная, а не в данных:
множительB/(B+S)вогнут по базе, поэтому среднее от множителя не превышает множителя от
среднего при ЛЮБОМ распределении базы, а величину разрыва задаёт разброс базы по часам. Шапка
переписана: О2 это потолок РАЗМЕРА (он не даёт стать рынком), а не обещание удержания; на расчёт
дохода это не влияет, доход считается почасово.
universe-scan.js, порогmaxOiSharePct: шапка называла цену ворот «около 27% дохода» и приводила
$724 без ворот, $455 при 25%, $526 при 10%. Эти числа получены на списке имён, проходящих ворота
СЕГОДНЯ, замороженном и прогнанном по году, то есть отвечали на вопрос «сколько заработали бы
сегодняшние ликвидные имена», а не «сколько заработали бы ворота»: из списка выпадали BERA,
RENDER, PEPE, WIF, S и SHIB, принёсшие за тот год основной доход, и 61% брутто оставался на одном
APT. Замер с пересборкой состава на КАЖДОМ решении по почасовому открытому интересу (62 имени,
8761 ч, тикет $2500) даёт без ворот $840.30 и при пороге 10% $729.04, то есть цена ворот $111.26 в
год, 13%. Замерено и то, что ворота покупают: по 8041 часу в позиции они убирают 36% часов с нашей
долей выше 10% и 43% часов выше 25%, но ХВОСТ не трогают вовсе (часов выше 100% при воротах 304
против 262 без них), потому что доля проверяется В МОМЕНТ ВХОДА, а интерес схлопывается под уже
открытой позицией: у APT база фандинга падает до $12.37, у BERA до $1.52 при тикете $2500. Порог
оставлен равным 10% решением владельца; зависимость дохода от порога не монотонна (25% даёт
$806.57, 5% даёт $775.66), поэтому «порог X лучше порога Y» из этих чисел не следует.
Опровергнуто замером и потому НЕ построено
-
[Funding-Arb] Быстрый выход из убыточной сделки (З9 и З10, 2026-09-18, стенды
exit9-cashwindow-money.mjsиexit10-rotate-on-negative.mjsвне репозитория). Повод: требование
владельца не торчать днями и неделями в невыгодной сделке. Сначала измерена цена самого сидения на
полной вселенной: 28 кругов в год, медиана удержания 264.5 часа, максимум 816, и 62 суточных
каданса из 335 приносят минус на общую сумму -$91.57 в год при капитале $2500, то есть 11%
нетто; число снято взглядом назад, поэтому это потолок приза, а не достижимая величина. Дальше
два способа выйти раньше. Своё короткое окно у ветки кэша (720, 336, 168, 120, 72, 48, 24 часа) НЕ
МЕНЯЕТ НИЧЕГО до цента: на полусотне рынков ветка кэша недостижима по построению, потому что уход
в кэш требует ещё и отсутствия положительной альтернативы, а их 35.7 на срез; выходов в кэш ноль
при любом окне. Принудительная ротация из кровоточащей сделки (перекладка разрешается, если своё
брутто за последние N часов отрицательно, а альтернатива положительна) убыточна на всех порогах:
медианы шести стартов $632.87 при N = 24 ч, $699.45 при 48 ч, $764.10 при 168 ч и $781.17 при
168 ч с обязательной сменой монеты против $812.69 у статус-кво. Механизм виден в счётчиках: лучшая
по «плохим дням» конструкция срезает утечку с $91.57 до $65.90 и платит за это 34 лишними кругами
по $7.27, то есть $248. Круг издержек при $2500 это около семи суток несущей (живой вход 18.09:
брутто $40.07 за горизонт 720 ч при круге $9.34), поэтому ускорять выход на этом депозите нечем.
У обоих стендов контроль: с выключенным добавлением обход даёт $840.30 и 27 перекладок побитово
как штатный. В правило выхода ничего не добавлено; защитой от затянувшегося убытка остаётся сторож
просадки в два круга (З6). -
[Markov-1D] Идея заказчика «адаптивная марковская модель 1D» по дневным свечам Binance (получена
2026-09-10, разбор 2026-09-13,scripts/markov-1d/): скрипты как получены лежат вoriginal/, рабочие
копии исправлены по коммиту на дефект учёта, стратегия не тронута (стоп по минимуму и максимуму дня
вместо сравнения с закрытием; незавершённая свеча отброшена; обучение только по прошлому: вся история с
кэшем, окно 200 свечей до каждой сделки; комиссия за круг 0,10% и проскальзывание на стопе; протухшие
данные без сигнала; по независимому аудиту 13.09 ещё: перекачка истории после закрытия нового дня UTC,
последняя закрытая пара в оценке комбинации, неполные дни и пропуски не торгуются), стенд-арбитр
markov_walkforward.pyгоняет оригинал и рабочую копию на одном кэше, сверяет их со своей опорой, в
режиме--strictзавершается кодом 1 при любом расхождении и сравнивает модель с монеткой в те же дни
сделок. Цифры заказчика (ETH +358%, SOL +226% за 200 свечей) сделаны стопом по закрытию: этот пол стоит
+0,46..+0,82% в день на любом сигнале, монетка через его же backtest() даёт +0,45..+0,76% в день и в плюсе у
100% семян, на перемешанных свечах модель «прибыльна» в 100% прогонов. С честным стопом монетка около
нуля; с обучением только по прошлому за 2018-2026 без комиссий BTC -63%, ETH +657%, SOL +92%, AVAX -76%,
XRP +98%, XMR -39%, TRX -54%, ARB -65% при доле побед 35-38% и просадках 45-90%, плацебо walk-forward в плюсе
у 15-50% перемешиваний; с комиссией 0,10% BTC -82%, ETH +238%, SOL +25%, AVAX -83%, XRP +2%, XMR -56%,
TRX -61%, ARB -81% против «купил и держи» +571% / +191% / +649% / -77% / +183% / +98% / +1790% / -83%;
монетка в те же дни сделок с той же комиссией (бросок спарен по дню и семени) обыгрывает модель на BTC
(модель лучше лишь 1% монеток), ARB (6%), TRX (20%), AVAX (23%), XRP (51%) и уступает ей на ETH (92%),
SOL (81%), XMR (67%); перестановка собственных направлений модели по её же дням даёт ту же картину, на TRX
модель лучше лишь 7% перестановок; лучшая комбинация меняется в 14-21% дней. Стенд под--strictловит
и всегда-лонг, и падение загрузчика (инъекции дают код 1). В botLab не строится; исправленный скрипт
возвращается заказчику как есть. -
[Funding-Arb] Перепрыгивание за знаком фандинга (З8, 2026-09-10,
scripts/funding-arb-study/exit-8-flip.mjs). Повод живой: сделка BTC/B теряет с 05.09 после
переворота ставки длинной стороны GMX, и встал вопрос, не выгоднее ли прыгать между сторонами за
положительным фандингом. На трёх периодах истории при размере $2500 замерены политики «трейлинг
N часов нетто своей конфигурации < 0, перекладка в противоположную или кэш» (N от 1 до 720 ч,
каданс 1 и 24 ч), те же с условием окупаемости круга, режимы знака почасового нетто и оракул с
предвидением (динамическое программирование по кэшу и двум конфигурациям с кругом и без) как
потолок; портфель на один слот по всем рынкам. Прыгать на каждом знаке это -$234k в год на 63
рынках по $2500 (круги $292k против брутто $59k), -$159k и -$112k на других периодах, ни один
рынок в плюсе; медианная плюс-полоса длится 3-4 часа и приносит $0.2-0.6 при круге $8.75, круг
окупают 1-6.5% полос. Окна 48 ч и короче в минусе на всех периодах, 168 ч в плюсе только на годе
1, 720 ч (окно правила) единственное в плюсе или у нуля везде. Оракул с кругом на один слот
$3.6k / $1.6k / $1.0k в год против правила $0.93k / $0.71k (З6, adv-15), без круга
$6.8k / $4.5k / $2.8k: издержки съедают половину и у того, кто знает будущее. На BTC даже оракул
даёт $130-220 в год, на живом кадре $59. Край стратегии в ширине вселенной (правило на 63 рынках),
а не в скорости реакции; в правило выхода ничего не добавлено.