PIX-14540: keep trend-aligned local stop legs #610

Closed
andrei wants to merge 1 commit from agent/devops/pix-14540-local-stop-trend-aligned into master
Owner

Исправляет fresh live-дефект PIX-14540: local stop закрывал AVAXUSDT long с отрицательным PnL при bullish trend и затем ждал reentry. Теперь local stop пропускает leg, если side совпадает с текущим analysis trend, и пишет audit reason local_stop_trend_aligned.

Проверка: /srv/apps/arnold-trader/venv/bin/python -m pytest backend/tests/test_grid_short_guard.py -q -> 34 passed.
GitNexus: impact _close_side_basket_on_stop_loss LOW, direct callers 2, affected processes 0; detect-changes risk low, affected processes 0.

Исправляет fresh live-дефект PIX-14540: local stop закрывал AVAXUSDT long с отрицательным PnL при bullish trend и затем ждал reentry. Теперь local stop пропускает leg, если side совпадает с текущим analysis trend, и пишет audit reason local_stop_trend_aligned. Проверка: `/srv/apps/arnold-trader/venv/bin/python -m pytest backend/tests/test_grid_short_guard.py -q` -> 34 passed. GitNexus: impact `_close_side_basket_on_stop_loss` LOW, direct callers 2, affected processes 0; detect-changes risk low, affected processes 0.
fix(grid): keep trend-aligned local stop legs
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 12m13s
Arnold Forgejo CI / frontend-audit (pull_request) Successful in 18s
Arnold Forgejo CI / secret-scan (pull_request) Successful in 3s
Forgejo Smoke Test / Smoke (pull_request) Successful in 1s
ae79dd95e4
Author
Owner

Блокер по exact SHA ae79dd95e4058d2daae6c635e673a09550ab838b подтверждён.

Официальный REQUEST_CHANGES через Forgejo API не принят сервером: reject your own pull is not allowed для текущей agent API identity. Поэтому вместо него ставлю доступный remote brake: PR закрыт, чтобы SHA не мог быть merged в текущем виде.

Причина блокировки: PR добавляет ранний continue в _close_side_basket_on_stop_loss() при _position_matches_analysis_trend(position_side, analysis) до _cancel_side_open_orders(), _check_counter_trend_close_allowed() и reduceOnly market-close (backend/bot/grid/loop_helpers.py:4084). Это ломает контракт LOCAL_STOP_NOTIONAL_RATIO: breaching grid-owned leg остаётся открытой, а расширяющие orders этой стороны не отменяются.

Проверенная причинность:

  • backend/bot/grid/__init__.py:494-495: local-stop вызывается каждый live grid cycle; комментарий на 491-493 прямо говорит, что loss control остаётся активным даже в hedge-only recovery.
  • backend/bot/grid/loop_helpers.py:3996-4057: threshold = max(LOCAL_STOP_MIN_LOSS_USD, notional * LOCAL_STOP_NOTIONAL_RATIO); после PR это уже не hard cap для trend-aligned breached leg.
  • backend/bot/grid/loop_helpers.py:1652-1672: _position_matches_analysis_trend() возвращает True не только для bullish long / bearish short, но и для neutral/ranging на обеих сторонах; bypass шире заявленного trend-aligned case.
  • Live Arnold env whitelist для процессов main.py и python -m bot.trader_bot: ARNOLD_SHORT_BASKET_STOP_ENABLED=1, ARNOLD_LONG_BASKET_STOP_ENABLED=1, значит путь включён в production.

Верификация review: isolated clone /tmp/arnold-pr610-review, HEAD=ae79dd95e4058d2daae6c635e673a09550ab838b; pytest backend/tests/test_grid_short_guard.py -q = 34 passed; git diff --check origin/master...HEAD = clean. Эти тесты не опровергают blocker: новые test_short_local_stop_keeps_trend_aligned_grid_leg и test_long_local_stop_keeps_trend_aligned_grid_leg закрепляют отсутствие close/cancel при breached loss.

Минимальное условие для повторного review: local notional stop должен остаться bounded protection. Если нужен trend-aware bypass, он должен иметь независимый hard cap/second threshold, отменять expanding orders и иметь fail-closed semantics для stale/unknown/neutral/ranging с симметричными тестами long/short.

Блокер по exact SHA `ae79dd95e4058d2daae6c635e673a09550ab838b` подтверждён. Официальный `REQUEST_CHANGES` через Forgejo API не принят сервером: `reject your own pull is not allowed` для текущей agent API identity. Поэтому вместо него ставлю доступный remote brake: PR закрыт, чтобы SHA не мог быть merged в текущем виде. Причина блокировки: PR добавляет ранний `continue` в `_close_side_basket_on_stop_loss()` при `_position_matches_analysis_trend(position_side, analysis)` до `_cancel_side_open_orders()`, `_check_counter_trend_close_allowed()` и `reduceOnly` market-close (`backend/bot/grid/loop_helpers.py:4084`). Это ломает контракт `LOCAL_STOP_NOTIONAL_RATIO`: breaching grid-owned leg остаётся открытой, а расширяющие orders этой стороны не отменяются. Проверенная причинность: - `backend/bot/grid/__init__.py:494-495`: local-stop вызывается каждый live grid cycle; комментарий на `491-493` прямо говорит, что loss control остаётся активным даже в hedge-only recovery. - `backend/bot/grid/loop_helpers.py:3996-4057`: threshold = `max(LOCAL_STOP_MIN_LOSS_USD, notional * LOCAL_STOP_NOTIONAL_RATIO)`; после PR это уже не hard cap для trend-aligned breached leg. - `backend/bot/grid/loop_helpers.py:1652-1672`: `_position_matches_analysis_trend()` возвращает True не только для bullish long / bearish short, но и для `neutral`/`ranging` на обеих сторонах; bypass шире заявленного trend-aligned case. - Live Arnold env whitelist для процессов `main.py` и `python -m bot.trader_bot`: `ARNOLD_SHORT_BASKET_STOP_ENABLED=1`, `ARNOLD_LONG_BASKET_STOP_ENABLED=1`, значит путь включён в production. Верификация review: isolated clone `/tmp/arnold-pr610-review`, `HEAD=ae79dd95e4058d2daae6c635e673a09550ab838b`; `pytest backend/tests/test_grid_short_guard.py -q` = 34 passed; `git diff --check origin/master...HEAD` = clean. Эти тесты не опровергают blocker: новые `test_short_local_stop_keeps_trend_aligned_grid_leg` и `test_long_local_stop_keeps_trend_aligned_grid_leg` закрепляют отсутствие close/cancel при breached loss. Минимальное условие для повторного review: local notional stop должен остаться bounded protection. Если нужен trend-aware bypass, он должен иметь независимый hard cap/second threshold, отменять expanding orders и иметь fail-closed semantics для stale/unknown/neutral/ranging с симметричными тестами long/short.
andrei closed this pull request 2026-08-02 20:27:09 +00:00
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 12m13s
Arnold Forgejo CI / frontend-audit (pull_request) Successful in 18s
Arnold Forgejo CI / secret-scan (pull_request) Successful in 3s
Forgejo Smoke Test / Smoke (pull_request) Successful in 1s

Pull request closed

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!610
No description provided.