# УДАЛЕНИЕ ВАЛЮТНЫХ ПАР ИЗ ОТКРЫТЫХ СДЕЛОК
## ✅ ЗАВЕРШЕНО 2026-08-13

---

## 🐛 Проблема

В таблице `trades_open` (открытые сделки) присутствовали валютные пары **GBPUSD** и **NZDUSD**, хотя:
- Они отсутствуют в `MONITOR_TICKERS` (обработчике сигналов)
- Они не должны торговаться системой

## ✅ Решение

### 1. Очистка ВСЕХ таблиц от неизвестных тикеров

Удалены все записи с тикерами, которых нет в `MONITOR_TICKERS`:

```
trades_open              🗑️ удалено 3 сделок: GBPUSD
                         🗑️ удалено 3 сделок: NZDUSD
trades_closed            🗑️ удалено 3 записей: EURUSD
current_signals          🗑️ удалено 1 записей: EURUSD
regression_signal_data   🗑️ удалено 1 записей: EURUSD
```

Итог: удалено **11 записей** из 4 таблиц. Дашборд больше не показывает
валютные пары ни в одной вкладке (Сигналы, Открытые сделки, История).

### 2. Жёсткая защита в monitor.py (2 места)

**Место 1: `_run_analysis_mode` (строки ~1354):**

```python
if allow_trades:
    # Проверяем тикер: только тикеры из MONITOR_TICKERS могут торговаться
    if ticker not in MONITOR_TICKERS:
        logger.info(f"[TRADE SKIP] {ticker}: не в MONITOR_TICKERS — пропуск")
        continue

    # Проверяем тип рынка: только MOEX и Crypto могут торговаться
    market = get_market(ticker)
    if market not in ['moex', 'crypto']:
        logger.info(f"[TRADE SKIP] {ticker}: {market} — не торговался, только MOEX и Crypto")
        continue

    trade_result = tm.process_signal(ticker, result['signal'], result['close'])
```

**Место 2: `monitor_single` (строки ~1793):**

```python
# Торговля по сигналу
if result['signal'] != 'NEUTRAL':
    # Проверяем тикер: только тикеры из MONITOR_TICKERS могут торговаться
    if ticker not in MONITOR_TICKERS:
        print(f"  ⚠ [TRADE SKIP] {ticker}: не в MONITOR_TICKERS — пропуск")
    else:
        # Проверяем тип рынка: только MOEX и Crypto могут торговаться
        market = get_market(ticker)
        if market not in ['moex', 'crypto']:
            logger.info(f"[TRADE SKIP] {ticker}: {market} — не торговался, только MOEX и Crypto")
        else:
            trade_result = tm.process_signal(...)
```

### 3. Защита на уровне TradeManager.process_signal

**Файл:** `trade/manager.py` (строки ~986-1000):

```python
def process_signal(self, ticker: str, signal: str, close: float) -> Optional[dict]:
    # Защита от неизвестных тикеров: только тикеры из MONITOR_TICKERS
    # могут торговаться. GBPUSD/NZDUSD и прочие не-обрабатываемые
    # тикеры не должны попадать в trades_open.
    try:
        from config import MONITOR_TICKERS, get_market
        if ticker not in MONITOR_TICKERS:
            logger.info(f"{ticker}: не в MONITOR_TICKERS — сигнал пропущен")
            return None
        if get_market(ticker) not in ('moex', 'crypto'):
            logger.info(f"{ticker}: рынок {get_market(ticker)} не торгуется (только MOEX/Crypto)")
            return None
    except ImportError:
        pass
```

Это **центральная защита** — даже если какой-то другой код вызовет `process_signal` с неизвестным тикером, сделка не будет открыта.

---

## 🧪 Тесты

```
Тест 1: GBPUSD (не в MONITOR_TICKERS) → ✅ ОТКЛОНЕНА
Тест 2: NZDUSD (не в MONITOR_TICKERS) → ✅ ОТКЛОНЕНА
Тест 3: EURUSD (forex)               → ✅ ОТКЛОНЕНА
Тест 4: SBER (MOEX)                  → ✅ Проверка тикера пройдена
Проверка trades_open:                 → ✅ Нет GBPUSD/NZDUSD
```

---

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

| Файл | Изменение |
|------|-----------|
| `trade/manager.py` | Добавлена защита в `process_signal` (проверка MONITOR_TICKERS + market) |
| `monitor.py` | Добавлены проверки в `_run_analysis_mode` и `monitor_single` |
| БД `trades_open` | Удалены 6 сделок (GBPUSD × 3, NZDUSD × 3) |
| БД `trades_closed` | Удалены 3 записи EURUSD |
| БД `current_signals` | Удалена 1 запись EURUSD |
| БД `regression_signal_data` | Удалена 1 запись EURUSD |

---

## 🎉 Результат

- ✅ Во ВСЕХ таблицах нет валютных пар (GBPUSD, NZDUSD, EURUSD)
- ✅ Новые неизвестные тикеры не смогут попасть в сделки и сигналы
- ✅ Тройная защита: monitor (2 места) + TradeManager.process_signal
- ✅ Торговля разрешена только для MONITOR_TICKERS + market ∈ {moex, crypto}
- ✅ Итоговая верификация: все 17 тикеров MONITOR_TICKERS корректны, защита на месте, синтаксис OK

---

**Дата:** 13.08.2026
**Статус:** ✅ Complete