Исправить attribution native SL/TP к исходной стратегии #503

Merged
andrei merged 1 commit from fix/close-strategy-attribution into master 2026-07-21 17:15:37 +00:00
Owner

Closes #501

Что исправлено

  • PnL native exchange SL/TP/внешнего close сохраняется за стратегией, открывшей позицию (positions.strategy_name).
  • exchange_sl_tp_close остаётся только fallback, когда владелец действительно неизвестен.
  • Для placeholder syncer_imported добавлен строгий Radar resolver: exact symbol + short side + qty + bounded lifecycle time.
  • Механизм закрытия хранится отдельно в bounded metadata (exit_source, exit_reason, close_strategy, reconciled_by, Radar event/time).
  • Radar journal читается fail-closed и bounded последними 256 KiB/1000 events.
  • db_save_trade() получил optional JSON metadata без изменения canonical accounting columns.
  • Дедупликация по order_id до INSERT сохранена; отдельный audit race/dedup вынесен в #502.

Проверка

  • Focused: 73 passed.
  • Full backend: 7367 passed, 7 skipped (exit 0).
  • py_compile: clean.
  • git diff --check: clean.
  • diff-scoped gitleaks: no leaks.
  • Production read-only replay: 23 generic close rows за 30d, 14 строго сопоставлены Radar; dry-run backfill net -$9.49, без записи в DB.

Риск

Торговая логика, sizing и entry/exit orders не меняются. Меняется только attribution закрытых ghost/native positions и metadata.

Closes #501 ## Что исправлено - PnL native exchange SL/TP/внешнего close сохраняется за стратегией, открывшей позицию (`positions.strategy_name`). - `exchange_sl_tp_close` остаётся только fallback, когда владелец действительно неизвестен. - Для placeholder `syncer_imported` добавлен строгий Radar resolver: exact symbol + short side + qty + bounded lifecycle time. - Механизм закрытия хранится отдельно в bounded metadata (`exit_source`, `exit_reason`, `close_strategy`, `reconciled_by`, Radar event/time). - Radar journal читается fail-closed и bounded последними 256 KiB/1000 events. - `db_save_trade()` получил optional JSON metadata без изменения canonical accounting columns. - Дедупликация по `order_id` до INSERT сохранена; отдельный audit race/dedup вынесен в #502. ## Проверка - Focused: `73 passed`. - Full backend: `7367 passed, 7 skipped` (exit 0). - `py_compile`: clean. - `git diff --check`: clean. - diff-scoped `gitleaks`: no leaks. - Production read-only replay: 23 generic close rows за 30d, 14 строго сопоставлены Radar; dry-run backfill net `-$9.49`, без записи в DB. ## Риск Торговая логика, sizing и entry/exit orders не меняются. Меняется только attribution закрытых ghost/native positions и metadata.
fix(trading): preserve close strategy attribution
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 5m17s
Arnold Forgejo CI / frontend-audit (pull_request) Successful in 17s
Arnold Forgejo CI / secret-scan (pull_request) Successful in 3s
Forgejo Smoke Test / Smoke (pull_request) Successful in 2s
43063a83a1
andrei merged commit 36097e1851 into master 2026-07-21 17:15:37 +00:00
andrei deleted branch fix/close-strategy-attribution 2026-07-21 17:15:37 +00:00
Sign in to join this conversation.
No reviewers
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!503
No description provided.