Тема
Первая боевая сессия после выката правила ценовой сетки — 2026-08-21
Снимок улик за первые семь часов торговли после снятия дрейна. Документ фиксирует НАБЛЮДЕНИЯ, а не выводы о доходности: выборка (две позиции) меньше любого порога достаточности, и каждая подкоманда форензики сама об этом говорит («ВЕРДИКТА НЕТ»).
Улики сняты штатным инструментом (scripts/analysis/forensics.sh) и живыми запросами; кольца кадров и тиков конечны, поэтому снимок сделан сразу.
Обстановка
| Величина | Значение | Источник |
|---|---|---|
| Сборка в бою | b0e0bcf39a2f, dirty=false | deploy-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 ¢ | 1 | 50 % |
| −3 ¢ | 1 | 50 % |
| −5 ¢ | 1 | 50 % |
| −10 ¢ | 0 | 0 % |
Медиана просадки 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 после выката: признаков двойного счёта стоимости филла в окне нет.
Что этими уликами НЕЛЬЗЯ подкреплять
- вердикт о доходности стратегии: две позиции, из них одна закрыта;
- изменение порога стопа: один эпизод против порога достаточности в десять;
- изменение коридора входа или ранга: заявки появились только после того, как цены сами вошли в коридор, и распределение по сеткам ещё не набрано.