# Stage 07.4.3.4 — Telegram Strong Signal Alerts via EventBus

## Цель этапа

Добавить отдельные Telegram-уведомления для сильных торговых сигналов автоторговли.

Уведомление должно отправляться только тогда, когда сигнал действительно готов к действию:

- сигнал `BUY` или `SELL`;
- `decision_status = READY`;
- `is_signal_ready = True`;
- событие пришло через `EventBus`;
- уведомление не дублируется на каждом цикле анализа.

---

## Что реализовано

### 1. EventBus-событие для READY-сигналов

В `AutoTradeService` событие `auto_decision_changed` теперь передаёт расширенный payload:

```python
EventBus.emit(
    "auto_decision_changed",
    {
        "previous_decision_status": previous_decision_status,
        "decision_status": state.decision_status,
        "signal": state.last_signal,
        "repeat_count": state.last_signal_repeat_count,
        "confidence": state.last_signal_confidence,
        "symbol": state.symbol,
        "strategy": state.strategy,
        "leverage": state.leverage,
        "reason": state.last_signal_reason,
    },
)
```

Это позволяет runner-слою принимать решение об отправке уведомления без прямой связи со стратегией.

---

### 2. AutoTradeRunner обрабатывает важные события

В `AutoTradeRunner` добавлена обработка последнего события из `EventBus`.

Runner проверяет:

```text
event_type == auto_decision_changed
decision_status == READY
signal in BUY / SELL
```

Если условия выполнены — отправляется отдельное Telegram-сообщение.

---

### 3. Отдельное Telegram-уведомление

Формат уведомления:

```text
🚨 Сильный сигнал 🟢 BUY

BTC/USD_LEVERAGE · TREND · x2
Confidence: 0.90
Repeats: 2

Причина: DEBUG FORCE BUY
```

Для `SELL` используется красный индикатор.

---

### 4. Защита от дублей

Добавлен ключ последнего уведомления:

```python
_last_strong_alert_key
```

Ключ строится из:

```text
symbol + strategy + signal + repeat_count + confidence + decision_status
```

Если такой же alert уже был отправлен — повторная отправка блокируется.

---

### 5. Логирование уведомлений

При успешной отправке уведомления пишется событие журнала:

```text
auto_strong_signal_alert_sent
```

Payload содержит:

- symbol;
- strategy;
- signal;
- repeat_count;
- confidence;
- leverage;
- reason.

---

### 6. Debug-команды для проверки

Для проверки сильных сигналов без ожидания рынка добавлены debug-команды.

Добавлен флаг:

```env
DEBUG_ENABLED=true
```

Команды:

```text
/debug_signal BUY
/debug_signal SELL
/debug_ready
/debug_state
```

При выключенном debug mode команды не выполняются:

```env
DEBUG_ENABLED=false
```

---

### 7. Мгновенная обработка debug-события

Добавлен публичный метод runner-а:

```python
AutoTradeRunner.process_last_event_now()
```

Он нужен для debug-сценариев, чтобы событие `READY BUY / SELL` было обработано сразу, а не ожидало следующего цикла автоторговли.

---

## Изменённые файлы

```text
app/src/trading/auto/service.py
app/src/trading/auto/runner.py
app/src/core/config.py
app/src/telegram/handlers/debug.py
app/src/telegram/routers.py
```

---

## Проверка

### 1. Включить debug mode

```env
DEBUG_ENABLED=true
```

### 2. Запустить приложение

```bash
python -m src.main
```

### 3. Открыть экран автоторговли

Нужно, чтобы `AutoTradeRunner` зарегистрировал `bot` и `chat_id`.

### 4. Выполнить команду

```text
/debug_signal BUY
```

Ожидаемый результат:

```text
🚨 Сильный сигнал 🟢 BUY

BTC/USD_LEVERAGE · TREND · x2
Confidence: 0.90
Repeats: 2

Причина: DEBUG FORCE BUY
```

Также приходит подтверждение debug-команды:

```text
✅ Debug signal forced
Signal: BUY
Decision: READY
Confidence: 0.90
Repeats: 2
```

### 5. Проверить журнал

В журнале должно появиться событие:

```text
auto_strong_signal_alert_sent
```

---

## Важное замечание по безопасности

Debug-команды можно оставлять в коде, но в боевом режиме они должны быть выключены:

```env
DEBUG_ENABLED=false
```

Это важно, потому что debug-команды могут вручную выставлять `READY BUY / SELL`.

---

## Ограничения текущего этапа

Пока не реализовано:

- cooldown между alert-ами;
- настройка включения/выключения alert-ов из UI;
- разные уровни сигналов;
- подписки на отдельные типы уведомлений;
- уведомления по закрытию позиции.

---

## Результат

Этап добавил полноценный механизм Telegram-уведомлений для сильных сигналов через событийную архитектуру.

Теперь цепочка работает так:

```text
Strategy
↓
AutoTradeService
↓
EventBus
↓
AutoTradeRunner
↓
Telegram alert
```

---

## Следующий этап

Рекомендуемый следующий этап:

```text
Stage 07.4.3.5 — Position lifecycle and PnL
```

Цели следующего этапа:

- закрытие paper-позиции;
- пересчёт PnL;
- логирование закрытия;
- обновление UI позиции;
- подготовка к Risk Engine.
