07.4.3.19.1 - Position-aware Flip Protection

This commit is contained in:
2026-05-10 09:48:55 +03:00
parent c3cf446143
commit 38e8472942
6 changed files with 307 additions and 11 deletions

View File

@@ -0,0 +1,137 @@
# 07.4.3.19.1 — Position-aware Flip Protection
## Цель этапа
Добавить первый защитный слой качества execution-сигналов: запретить быстрые и слабые flip-сделки, когда уже открыта paper-позиция.
До этапа логика была слишком простой:
LONG + SELL = FLIP
SHORT + BUY = FLIP
Из-за этого SCALP мог часто переворачивать позицию на рыночном шуме.
## Что изменено
### 1. Добавлены execution-поля в AutoTradeState
В `app/src/trading/auto/state.py` добавлены поля:
last_execution_action
last_execution_reason
last_flip_block_reason
last_flip_at
Они нужны для хранения последнего execution-действия и причины блокировки flip.
### 2. Добавлена flip-защита в ExecutionEngine
В `app/src/trading/execution/engine.py` добавлены параметры:
_min_flip_confidence = 0.75
_min_flip_repeat_count = 3
_min_flip_hold_seconds = 60
_loss_flip_confidence = 0.9
Теперь flip проходит только если:
- противоположный сигнал подтверждён;
- confidence >= 0.75;
- repeat_count >= 3;
- позиция открыта не меньше 60 секунд;
- если позиция в минусе, confidence должен быть >= 0.9.
### 3. Добавлен paper_flip_blocked
Если flip заблокирован, создаётся событие:
paper_flip_blocked
В payload пишется:
execution_type
symbol
position_side
signal
confidence
repeat_count
reason
unrealized_pnl_usd
opened_at
updated_at
### 4. Добавлена защита от спама одинаковых блокировок
В `ExecutionEngine` добавлен `_last_flip_block_key`.
Одинаковая причина блокировки с теми же параметрами не пишется в журнал каждую итерацию.
### 5. Сброс block-state после успешных execution-событий
После успешных событий очищаются:
execution_block_reason
last_flip_block_reason
_last_flip_block_key
Это сделано для:
paper_position_opened
paper_position_flipped
paper_position_closed
## Проверено на ночном прогоне
Ночной прогон подтвердил:
- paper position opened работает;
- paper flip blocked сработал при repeat_count = 2;
- flip прошёл только после repeat_count = 3;
- flip не спамил журнал повторяющимися блокировками;
- UI и position state не разошлись;
- PnL и reserved balance отображались корректно.
Пример подтверждённой последовательности:
paper_flip_blocked
reason: Flip blocked: repeat count 2 < 3.
paper_position_flipped
repeat_count: 3
## Результат
Execution стал position-aware на уровне flip-защиты.
Система больше не должна мгновенно переворачивать позицию на первом слабом противоположном сигнале.
## Следующий этап
Следующий логичный подэтап:
07.4.3.19.2 — Journal Noise Reduction & Position-aware Signal Logging
Основная цель следующего шага:
- сократить шум в журнале;
- убрать лишние auto_screen_refresh_* события;
- не слать одинаковые same-direction strong signal alerts при уже открытой позиции;
- разделить сигналы на reversal candidate и position reinforced.
## Roadmap update
#### 07.4.3.19.1 — Position-aware Flip Protection
- added execution-state tracking fields
- added flip confidence gate
- added flip repeat-count gate
- added minimum position hold-time gate
- added negative-PnL flip protection
- added paper_flip_blocked journal event
- added duplicate flip-block suppression
- reset flip block state after open / flip / close
- validated flip protection with overnight paper runtime
## Commit
git add app/src/trading/auto/state.py app/src/trading/execution/engine.py app/src/telegram/handlers/auto/ui.py
git commit -m "07.4.3.19.1 — Position-aware Flip Protection"