Сохранять originating strategy для native SL/TP закрытий #501

Closed
opened 2026-07-21 16:07:30 +00:00 by andrei · 2 comments
Owner

Сейчас futures_position_sync_daemon присваивает unaudited native SL/TP закрытию bucket exchange_sl_tp_close даже когда positions.strategy_name известен. Это ломает Radar/grid/другую стратегическую PnL-аналитику и performance guard. Исправить priority resolver: валидный owner позиции → audited close strategy → generic; placeholder owner не считать валидным. Механизм выхода хранить отдельно в безопасном metadata. Без дополнительных trade rows и без изменения gross/net convention.

Сейчас futures_position_sync_daemon присваивает unaudited native SL/TP закрытию bucket exchange_sl_tp_close даже когда positions.strategy_name известен. Это ломает Radar/grid/другую стратегическую PnL-аналитику и performance guard. Исправить priority resolver: валидный owner позиции → audited close strategy → generic; placeholder owner не считать валидным. Механизм выхода хранить отдельно в безопасном metadata. Без дополнительных trade rows и без изменения gross/net convention.
Author
Owner

Preflight перед изменением:

  • 30d generic exchange_sl_tp_close: 23 live close rows, net -$12.99.
  • Строгий read-only replay по Radar state/journal сопоставил 14/23 строк по exact symbol + short side + qty + bounded close time.
  • stop в Radar journal является наблюдением исчезновения позиции, а не доказанным типом биржевого триггера; поэтому metadata сохраняет честный exit_reason=exchange_sl_tp_or_external и отдельный radar_terminal_event=stop. Для собственного horizon close сохраняется exit_reason=exit_horizon.
  • В исторической таблице обнаружено 42 duplicate non-empty order_id по всем trade-типам; среди закрытий за 30д дубли затронули 4 grid rows. В этот PR уникальный индекс/удаление истории не включаются: автоматическая чистка могла бы исказить PnL. Текущий order_id check и single-row insertion сохраняются.
  • Focused suite: 73 passed.
  • py_compile, git diff --check, diff-scoped gitleaks: clean.
  • Full backend regression запущен повторно на финальном контракте.
Preflight перед изменением: - 30d generic `exchange_sl_tp_close`: 23 live close rows, net -$12.99. - Строгий read-only replay по Radar state/journal сопоставил 14/23 строк по exact symbol + short side + qty + bounded close time. - `stop` в Radar journal является наблюдением исчезновения позиции, а не доказанным типом биржевого триггера; поэтому metadata сохраняет честный `exit_reason=exchange_sl_tp_or_external` и отдельный `radar_terminal_event=stop`. Для собственного horizon close сохраняется `exit_reason=exit_horizon`. - В исторической таблице обнаружено 42 duplicate non-empty order_id по всем trade-типам; среди закрытий за 30д дубли затронули 4 grid rows. В этот PR уникальный индекс/удаление истории не включаются: автоматическая чистка могла бы исказить PnL. Текущий order_id check и single-row insertion сохраняются. - Focused suite: 73 passed. - py_compile, git diff --check, diff-scoped gitleaks: clean. - Full backend regression запущен повторно на финальном контракте.
Author
Owner

Production verification завершена:

  • PR #503 merged, production SHA 36097e1851f7fd569700ba22fa7bbe3ab6953947.
  • Deploy validator: ALL CHECKS PASSED; API/DB healthy.
  • PM2: API, trading daemons и Telegram bot — online, restart counter 0 после deploy.
  • Новых daemon Traceback/CRITICAL/Unhandled/Exception нет.
  • Выполнен строгий historical backfill с rollback backup: 14/23 generic close rows переведены в radar_live, net -$9.49; 9 недоказуемых строк оставлены generic.
  • DB verification: radar_live n=14, backfilled=14, origin_match=14; повторный dry-run дал candidates=0, то есть операция идемпотентна.
  • Backup: /srv/apps/arnold-trader/shared/backups/radar-attribution-1784654258.json, mode 600.
  • Production repo clean.
Production verification завершена: - PR #503 merged, production SHA `36097e1851f7fd569700ba22fa7bbe3ab6953947`. - Deploy validator: `ALL CHECKS PASSED`; API/DB healthy. - PM2: API, trading daemons и Telegram bot — online, restart counter 0 после deploy. - Новых daemon Traceback/CRITICAL/Unhandled/Exception нет. - Выполнен строгий historical backfill с rollback backup: 14/23 generic close rows переведены в `radar_live`, net `-$9.49`; 9 недоказуемых строк оставлены generic. - DB verification: `radar_live n=14`, `backfilled=14`, `origin_match=14`; повторный dry-run дал `candidates=0`, то есть операция идемпотентна. - Backup: `/srv/apps/arnold-trader/shared/backups/radar-attribution-1784654258.json`, mode 600. - Production repo clean.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/arnold-trader-app#501
No description provided.