Skip to content

Первая боевая сессия после выката правила ценовой сетки — 2026-08-21 ​

Снимок улик за первые семь часов торговли после снятия дрейна. Документ фиксирует НАБЛЮДЕНИЯ, а не выводы о доходности: выборка (две позиции) меньше любого порога достаточности, и каждая подкоманда форензики сама об этом говорит («ВЕРДИКТА НЕТ»).

Улики сняты штатным инструментом (scripts/analysis/forensics.sh) и живыми запросами; кольца кадров и тиков конечны, поэтому снимок сделан сразу.

Обстановка ​

ВеличинаЗначениеИсточник
Сборка в боюb0e0bcf39a2f, dirty=falsedeploy-vps.sh verify
Выкат2026-08-21T00:48:34Zманифест релиза
Дрейнснят (drain_mode=false)/api/local/seed
Заявок размещено47 (35 buy + 12 sell)pm_engine_orders_placed_total
Филлов3/api/local/seed
Позиций2 (одна закрыта стопом, одна открыта)forensics.sh positions --engine
Бюджет$1000, задействовано $0 на момент снимка/api/local/seed

Настройки эпохи 49, существенные для чтения ниже: entry_price_base=BestBid, entry_price_offset_milli=0, коридор [0.450, 0.750], min_probability_rank=3, exit_target=absolute 0.990, budget_per_market=$5.

Правило ценовой сетки: испытано, нарушений нет ​

  • отказов биржи по правилу минимального шага — НОЛЬ при 47 заявках. reject-reasons --engine знает ровно три отказа, все три — balance_settling (продажа сразу после филла);
  • обе сетки пройдены живыми деньгами: …hong-kong…-31c торгуется с шагом 0.001, …sao-paulo… — с шагом 0.01;
  • каждая наблюдаемая цена кратна шагу своего рынка: попытки входа по Сан-Паулу — ровно 75 центов, фактические входы 0.74 и 0.73, шесть целей выхода 0.99, лимит сработавшего стопа 0.32;
  • фиксирующая проверка шва не срабатывала: счётчиков pm_engine_order_price_grid_refusal_total и pm_engine_tick_size_seed_rejected_total в /metrics нет вовсе, ступени воронки blocked_no_tick_size / blocked_no_exit_target — ноль;
  • смена шага в бою происходит: pm_engine_ws_events_received_total{ event_type="tick_size_change"} = 24 за сессию. Запись состояния шага обрабатывает эти события штатно — отказов по шагу при этом нет.

Позиция 241 — стоп сработал и спас деньги ​

0x32d88b38… (Гонконг 31°C, NO, шаг 0.001): вход 0.74, выход 0.3091, результат −$2.5853, причина stop_loss_trade_confirmed.

Цепочка выходов (stops --engine): шесть SELL с лимитом 0.99 (первый REJECTED по balance_settling, остальные CANCELLED), затем стоп-SELL с лимитом 0.32 — FILLED 6.0/6.0. Покрытие полное.

Кадр решения: bid 0.32 / ask 0.38, спред 0.06, порог 0.35, семь принтов ленты, глубочайший 0.33, класс confirmed_corroborated — лента подтвердила пробой, а не одиночная котировка.

Контрфактуал (stop-counterfactual --engine): цена через час после решения — 0.03. Ветка «держали ещё час» стоила бы −$1.67 сверх зафиксированного (Δ$вых = −1.6746). То есть на этом эпизоде стоп СПАС деньги, а не срезал восстановление.

Достаточность: один эпизод при пороге десять. Подкоманда отказывается от вердикта, и это не формальность — второй половины сравнения («стоп НЕ сработал») в выборке нет вовсе.

Позиция 242 — открыта и защищена ​

0x2209e149… (Сан-Паулу 27°C, NO, шаг 0.01): вход 0.73, размер 6 долей, цель выхода 0.99 стоит живой заявкой.

exit-protection --engine: PROTECTED_LOCAL, живой SELL покрывает все шесть долей, тревог нет. coverage_state=NOT_CHECKED — on-chain проверка владения по этой позиции ещё не отрабатывала.

Замечание о чтении /seed: mid_price там равен цене входа, а unrealized_usd — нулю ПО КОНТРАКТУ эндпоинта (sse/seed.rs:202-206) — величины пересчитывает SPA из живого потока котировок. Не читать сырой /seed как оценку позиции: на момент снимка рынок NO стоял 0.49/0.53 против входа 0.73.

Провал сразу после входа ​

entry-dip --engine, окно 900 с, охват 2 из 2 входов (100 %):

порогпроваловдоля
−1 ¢150 %
−3 ¢150 %
−5 ¢150 %
−10 ¢00 %

Медиана просадки 400 pip. Провалившийся вход — ровно тот, что закрылся стопом. Вердикта нет: измеренных входов два при пороге десять.

Отказы биржи классифицированы ​

Три отказа несут код balance_settling с дословным телом ответа (not enough balance / allowance … balance: 0, order amount: 6000000), а не legacy, unclassified. Это первый боевой эпизод для форвард-приёмки exit-sizing-from-sellable-balance и подтверждение, что таксономия отказов (order-reject-taxonomy-observability) на живом трафике различает причины.

Оба отказа по позиции 241 пришли в первые две секунды после филла входа (1787296580115 и 1787296581190 против филла 1787296579968) — то есть это задержка оседания баланса, а не отсутствие долей.

Учёт денег входа: расхождений нет ​

accounting-preconditions --engine по окну сессии (2 позиции, из них одна открыта):

  • A — риск гидрации накопителя выхода: строк, несущих одновременно записанный realized PnL и накопленный выход, НЕТ. Оговорка подкоманды сохраняется: окно ограничено последним сбросом сессии, поэтому это «не наблюдалось», а не «недостижимо»;
  • B — комиссия налитого BUY: оба независимых источника (колонка orders.fees_micro_usd и разность entry_cost − filled_value) дают ноль на обеих сопоставимых позициях и согласованы между собой. Расхождение fee-inclusive / fee-excluded в этих данных не проявляется; структурная причина — post_only у BUY.

Это первый форвард-срез для fill-accounting-idempotency после выката: признаков двойного счёта стоимости филла в окне нет.

Что этими уликами НЕЛЬЗЯ подкреплять ​

  • вердикт о доходности стратегии: две позиции, из них одна закрыта;
  • изменение порога стопа: один эпизод против порога достаточности в десять;
  • изменение коридора входа или ранга: заявки появились только после того, как цены сами вошли в коридор, и распределение по сеткам ещё не набрано.