[CL-RADAR] radar-live: halving-retry при нехватке available balance (#514, направление 2) #516

Merged
andrei merged 1 commit from feature/claude-bw-halfqty-retry into master 2026-07-21 22:38:55 +00:00
Owner

Что сделано

  • backend/bot/radar_live.py: placement вынесен в _try_place (None ⟺ balance-insufficient; прочие исключения пролетают как раньше — «placing» остаётся для reconcile). При None — одна повторная попытка с qty/2 (через round_futures_qty, с гейтами инструментального минимума и MIN_EXCHANGE_NOTIONAL_USD ДО вызова). state.qty обновляется ДО повторного place (инвариант register-before-place). Обе неудачи → прежний INFO-скип с чисткой записи.
  • Тесты: _InsufficientOnceSession (первый place падает, второй проходит) → вход размещён половинным qty, state консистентен; половина ниже min-notional → ровно одна попытка, чистый скип.

Зачем

Продолжение #514/PR #515 по выбору CEO: не терять сигнал при гонке за баланс. Точный pre-check маржи требовал бы воспроизведения per-symbol leverage-математики Bybit; халвинг адаптируется к фактическому балансу без неё. Потолок: один retry на сигнал; upgrade path — wallet-balance pre-check (в комментарии кода).

План тестирования

  • TDD: red (халвинга нет) → green.
  • tests/test_radar_live.py — 45 passed; полный backend-suite — 7385 passed, 7 skipped.

Где могу ошибаться

  • Половинный размер меняет экспозицию пилота при дефиците баланса (риск/сделку падает ≤2×) — осознанный трейд-офф против полной потери сигнала; RISK_USD-модель не трогалась.
  • Один retry может не хватить при глубокой нехватке — тогда прежний скип; эскалация халвинга сознательно не делалась (потолок в комментарии).
## Что сделано - `backend/bot/radar_live.py`: placement вынесен в `_try_place` (None ⟺ balance-insufficient; прочие исключения пролетают как раньше — «placing» остаётся для reconcile). При None — одна повторная попытка с `qty/2` (через `round_futures_qty`, с гейтами инструментального минимума и `MIN_EXCHANGE_NOTIONAL_USD` ДО вызова). `state.qty` обновляется ДО повторного place (инвариант register-before-place). Обе неудачи → прежний INFO-скип с чисткой записи. - Тесты: `_InsufficientOnceSession` (первый place падает, второй проходит) → вход размещён половинным qty, state консистентен; половина ниже min-notional → ровно одна попытка, чистый скип. ## Зачем Продолжение #514/PR #515 по выбору CEO: не терять сигнал при гонке за баланс. Точный pre-check маржи требовал бы воспроизведения per-symbol leverage-математики Bybit; халвинг адаптируется к фактическому балансу без неё. Потолок: один retry на сигнал; upgrade path — wallet-balance pre-check (в комментарии кода). ## План тестирования - TDD: red (халвинга нет) → green. - `tests/test_radar_live.py` — 45 passed; полный backend-suite — **7385 passed, 7 skipped**. ## Где могу ошибаться - Половинный размер меняет экспозицию пилота при дефиците баланса (риск/сделку падает ≤2×) — осознанный трейд-офф против полной потери сигнала; RISK_USD-модель не трогалась. - Один retry может не хватить при глубокой нехватке — тогда прежний скип; эскалация халвинга сознательно не делалась (потолок в комментарии).
[CL-RADAR] radar-live: один halving-retry при нехватке available balance (#514 направление 2)
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 5m29s
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
5390ce4e2f
Вместо потери сигнала при «ab not enough»: одна повторная попытка с qty/2
(с проверкой инструментального минимума и min-notional до вызова). Точный
pre-check маржи дублировал бы leverage-математику Bybit — халвинг адаптируется
к фактическому балансу без неё. Потолок: один retry на сигнал; upgrade path —
wallet-balance pre-check. State-инвариант сохранён: qty в записи обновляется
ДО повторного place; transport-failure путь не тронут.
andrei force-pushed feature/claude-bw-halfqty-retry from 5390ce4e2f
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 5m29s
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
to 2b243e0cca
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 5m13s
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
2026-07-21 22:08:17 +00:00
Compare
andrei force-pushed feature/claude-bw-halfqty-retry from 2b243e0cca
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 5m13s
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
to 76169d2afc
Some checks failed
Arnold Forgejo CI / backend-tests (pull_request) Has been cancelled
Arnold Forgejo CI / frontend-audit (pull_request) Has been cancelled
Arnold Forgejo CI / secret-scan (pull_request) Has been cancelled
Forgejo Smoke Test / Smoke (pull_request) Has been cancelled
2026-07-21 22:24:44 +00:00
Compare
andrei force-pushed feature/claude-bw-halfqty-retry from 76169d2afc
Some checks failed
Arnold Forgejo CI / backend-tests (pull_request) Has been cancelled
Arnold Forgejo CI / frontend-audit (pull_request) Has been cancelled
Arnold Forgejo CI / secret-scan (pull_request) Has been cancelled
Forgejo Smoke Test / Smoke (pull_request) Has been cancelled
to fb9abe9d5b
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 5m16s
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
2026-07-21 22:33:29 +00:00
Compare
andrei scheduled this pull request to auto merge when all checks succeed 2026-07-21 22:33:34 +00:00
andrei merged commit bf1a80d3b4 into master 2026-07-21 22:38:55 +00:00
andrei deleted branch feature/claude-bw-halfqty-retry 2026-07-21 22:38:55 +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!516
No description provided.