[CL-RADAR] radar-live: wallet-balance pre-check — кламп qty до первого place (#514 upgrade path) #519

Merged
andrei merged 1 commit from feature/claude-bw-wallet-precheck into master 2026-07-21 23:04:42 +00:00
Owner

Что сделано

  • _clamp_qty_to_balance(session, symbol, qty, entry_px): totalAvailableBalance (UNIFIED-кошелёк) × leverage символа (из get_positions, работает при size=0) × буфер _BALANCE_SAFETY=0.9 (комиссии/дрейф цены) → потолок qty. Применяется ДО регистрации записи и первого place; результат прогоняется через round_futures_qty, дальше работают существующие гейты минимумов (кламп ниже минимума → чистый скип без единой попытки place).
  • Fail-open: любая ошибка API/парсинга → qty без изменений + INFO-лог; Bybit остаётся авторитетом — вниз по потоку сохраняются halving-retry (PR #516) и INFO-скип (PR #515). Три слоя обороны.
  • Тесты: кламп по балансу (6 USDT × 2x × 0.9 ≥ notional), fail-open при падении wallet-API, скип-до-place при клампе ниже минимума.

Зачем

Завершение лестницы #514: реактивный скип (#515) → адаптивный халвинг (#516) → проактивный кламп (этот PR). Сигнал сохраняется с максимально фондируемым размером без единого отказа биржи в штатном случае.

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

  • TDD: 2 red → green; tests/test_radar_live.py — 52 passed.
  • Полный backend-suite — 7393 passed, 7 skipped.

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

  • Формула маржи упрощена (notional/leverage, без initial-margin-rate тиров) — буфер 0.9 покрывает типовые случаи; промах ловится халвингом.
  • +2 API-вызова на сигнал (wallet + positions) — сигналы редкие, приемлемо; кэширование не делал (YAGNI).
## Что сделано - `_clamp_qty_to_balance(session, symbol, qty, entry_px)`: `totalAvailableBalance` (UNIFIED-кошелёк) × leverage символа (из `get_positions`, работает при size=0) × буфер `_BALANCE_SAFETY=0.9` (комиссии/дрейф цены) → потолок qty. Применяется ДО регистрации записи и первого place; результат прогоняется через `round_futures_qty`, дальше работают существующие гейты минимумов (кламп ниже минимума → чистый скип без единой попытки place). - **Fail-open**: любая ошибка API/парсинга → qty без изменений + INFO-лог; Bybit остаётся авторитетом — вниз по потоку сохраняются halving-retry (PR #516) и INFO-скип (PR #515). Три слоя обороны. - Тесты: кламп по балансу (6 USDT × 2x × 0.9 ≥ notional), fail-open при падении wallet-API, скип-до-place при клампе ниже минимума. ## Зачем Завершение лестницы #514: реактивный скип (#515) → адаптивный халвинг (#516) → проактивный кламп (этот PR). Сигнал сохраняется с максимально фондируемым размером без единого отказа биржи в штатном случае. ## План тестирования - TDD: 2 red → green; `tests/test_radar_live.py` — 52 passed. - Полный backend-suite — **7393 passed, 7 skipped**. ## Где могу ошибаться - Формула маржи упрощена (notional/leverage, без initial-margin-rate тиров) — буфер 0.9 покрывает типовые случаи; промах ловится халвингом. - +2 API-вызова на сигнал (wallet + positions) — сигналы редкие, приемлемо; кэширование не делал (YAGNI).
[CL-RADAR] radar-live: wallet-balance pre-check — кламп qty до первого place (#514 upgrade path)
All checks were successful
Arnold Forgejo CI / backend-tests (pull_request) Successful in 5m18s
Arnold Forgejo CI / frontend-audit (pull_request) Successful in 16s
Arnold Forgejo CI / secret-scan (pull_request) Successful in 3s
Forgejo Smoke Test / Smoke (pull_request) Successful in 1s
2d15cc29a6
_clamp_qty_to_balance: totalAvailableBalance (UNIFIED) x leverage символа
(из get_positions) x буфер 0.9 → потолок qty ДО регистрации и place.
Fail-open: любая ошибка API/парсинга возвращает qty без изменений — Bybit
остаётся авторитетом, вниз по потоку работают halving-retry и INFO-скип.
Кламп ниже биржевых минимумов → чистый скип существующими гейтами без
единой попытки place.
andrei scheduled this pull request to auto merge when all checks succeed 2026-07-21 22:59:21 +00:00
andrei merged commit bf70908b3a into master 2026-07-21 23:04:42 +00:00
andrei deleted branch feature/claude-bw-wallet-precheck 2026-07-21 23:04:42 +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!519
No description provided.