# 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"
