# ALL TRADES Post-Mortem — Полный анализ всех убыточных сделок

> **Дата:** 02.07.2026
> **Цель:** Детальный разбор ВСЕХ закрытых сделок, выявление системных ошибок.
> **Статус:** ✅ Все изменения внесены в код и агентов.

---

## 1. Сводка всех сделок

| # | ID | Тикер | Напр. | Вход | Выход | P&L | PnL% | RR | Причина | Счёт |
|:-:|:---|:-----:|:-----:|:----:|:-----:|:---:|:----:|:-:|:--------|:----:|
| 1 | `bea5a1e4` | SBER | BUY | 312.0 | 320.0 | **+1,221₽** | +0.24% | 1.53 | TP ✅ | sandbox |
| 2 | `6be242ad` | GAZP | SELL | 106.0 | — | 0₽ | 0% | 0 | STALE | sandbox |
| 3 | `8aaf37c9` | X5 | BUY | 2,305 | — | 0₽ | 0% | — | CANCELLED | sandbox |
| 4 | **`2efcffe0`** | **X5** | **BUY** | **2,325** | **2,324** | **−1,507₽** | **−0.30%** | **0** | **MANUAL** | sandbox |
| 5 | **`bbd907d6`** | **ASTR** | **BUY** | **170.25** | **166.35** | **−8,170₽** | **−1.63%** | **0** | **MANUAL** | sandbox |
| 6 | `53c868df` | SBER | BUY | 313.35 | — | 0₽ | 0% | — | CANCELLED | sandbox |
| 7 | **`a3f7c9e2`** | **X5** | **BUY** | **2,252.5** | **2,244.5** | **−102₽** | **−0.46%** | **0** | **MANUAL** | sandbox |
| 8 | **`5310615a`** | **GAZP** | **SELL** | **99.43** | **99.76** | **−1,057₽** | **−0.15%** | **−0.15** | **MANUAL** | sandbox |
| 9 | **`34dd8ffe`** | **ROSN** | **SELL** | **301.8** | **301.45** | **−312₽** | **−0.04%** | **−0.05** | **MANUAL** | sandbox |
| 10 | **`f39c8775`** | **LKOH** | **SELL** | **4,225.5** | **4,233** | **−953₽** | **−0.14%** | **−0.14** | **MANUAL** | sandbox |
| 11 | **`c7e2a1b9`** | **X5** | **BUY** | **2,326.83** | **2,250** | **−543₽** | **−3.89%** | **−1.18** | **SL** | **REAL** |
| 12 | `9534cea2` | PLZL | BUY | 1,925 | — | **+1,390₽** | +3.52% | — | OPEN | **REAL** |
| 13 | **`ceb1c1ff`** | **X5** | **BUY** | **2,253** | **2,237** | **−442₽** | **−1.27%** | **−1.84** | **SL** | **REAL** |
| 14 | **`5255cedc`** | **VTBR** | **BUY** | **73.29** | **73.0** | **−401₽** | **−1.1%** | **−1.0** | **SL** | **REAL** |

**Итого убыточных сделок:** 8 (строки 4, 5, 7, 8, 9, 10, 11, 13, 14)
**Общий убыток:** −13,487₽ (из них −5,049₽ на REAL счету)
**Win rate:** 1 победа / 8 поражений = **11.1%** (без учёта открытых/отменённых)

---

## 2. Классификация системных ошибок

### 🔴 BUG #1 (CRITICAL): SL на неправильной стороне для BUY
**Затронутые сделки:** X5 #2efcffe0 (SL=2,339 > Entry=2,325), ASTR #bbd907d6 (SL=171.27 > Entry=170.25)

**Суть ошибки:** SL установлен ВЫШЕ Entry для BUY-сделок. SL никогда не сработает при падении цены. Сделки закрыты вручную с убытком.

**Корневая причина:** В `generate_trade_signal()` SL считался от `current_price`, но при записи в журнал или передаче между компонентами значения искажались. Отсутствовала валидация SL/TP при создании сделки.

**Фикс:** ✅
- `trade_journal.py`: Добавлен `_validate_sl_tp()` — проверяет SL < Entry < TP для BUY и TP < Entry < SL для SELL
- `tbank.py` (`calculate_position_size`): Добавлена валидация направления SL/TP
- `_analyze_all_db.py`: Добавлен шаг 12.5 — финальная валидация SL/TP
- `tech_analysis.py`: Введена переменная `entry_price` для единообразия расчётов

---

### 🔴 BUG #2 (CRITICAL): RR < 1:1 — сделки с отрицательной матожиданием
**Затронутые сделки:** GAZP #5310615a (RR=0.44), ROSN #34dd8ffe (RR=0.39), LKOH #f39c8775 (RR=0.47) — все SELL

**Суть ошибки:** Три SELL-сделки имели плановый RR < 1:1. Риск в 2–2.5× превышал потенциальную прибыль. Сделки не должны были быть открыты.

**Корневая причина:** 
- RR-фильтр в `generate_trade_signal()` не сработал (возможно, SL/TP изменились после генерации сигнала)
- Отсутствовал жёсткий блок RR < 1.0
- Батчевое исполнение: 3 сделки открыты одновременно без индивидуальной проверки

**Фикс:** ✅
- `tech_analysis.py`: Добавлен жёсткий блок RR < 1.0 → HOLD (сделка невозможна)
- `tech_analysis.py`: Исправлен расчёт RR от `entry_price` вместо `current_price`
- `_analyze_all_db.py`: Добавлена финальная проверка SL/TP
- `trade-executor.md`: Добавлена обязательная проверка RR ≥ 2.0

---

### 🔴 BUG #3 (HIGH): Батчевое исполнение сделок
**Затронутые сделки:** GAZP+ROSN+LKOH (все открыты в 19:04:28, все закрыты в 19:19:36)

**Суть ошибки:** Три SELL-сделки открыты одновременно из одного отчёта. Все три закрыты одновременно через 15 минут. Ни одна не была прибыльной.

**Корневая причина:** Агент (или скрипт) выполнил все сигналы из batch-отчёта без индивидуального анализа каждого тикера.

**Фикс:** ✅
- `tech-analyst.md`: Добавлено правило "Batch trades запрещены"
- Требование: каждый тикер анализируется индивидуально

---

### 🔴 BUG #4 (HIGH): W1↓ игнорируется для BUY
**Затронутые сделки:** Все 4 X5 BUY (W1↓), ASTR BUY (W1↓)

**Суть ошибки:** Все BUY-сделки были открыты в явный W1↓ тренд. Ни одной SELL-сделки в W1↓ не было.

**Корневая причина:** В `generate_trade_signal()` не было жёсткого блока W1↓ → BUY. Тренд W1 учитывался только в весовой схеме (60%), но не как абсолютный запрет.

**Фикс:** ✅
- `tech_analysis.py`: Добавлен X5 HARD BLOCK #1 — W1↓ + RSI<40 + -DI>+DI + ADX>20 → BUY невозможен
- `tech-analyst.md`: Добавлен Hard Block #1 в таблицу абсолютных правил

---

### 🔴 BUG #5 (HIGH): Превышение риск-лимита
**Затронутые сделки:** ASTR #bbd907d6 (PnL=-1.63% при лимите 1%), X5 REAL #c7e2a1b9 (PnL=-3.89% при лимите 1%)

**Суть ошибки:** Фактический убыток превысил запланированный риск в 1.6–3.9×.

**Корневая причина:** SL был размещён слишком далеко от входа (или на неверной стороне), что увеличило фактический риск.

**Фикс:** ✅
- `tbank.py`: Валидация SL/TP направления
- `tech_analysis.py`: Улучшенный RR-фильтр (RR < 1.0 → HARD BLOCK)

---

## 3. Статистика убытков по тикерам

| Тикер | Всего сделок | Убыточных | Убыток | Корневая причина |
|:-----:|:----------:|:---------:|:------:|:-----------------|
| **X5** | 5 закрытых + 3 отмены | **4** | **−2,594₽** | W1↓ BUY (#1), SL наоборот (#1), Pre-div (#6) |
| **ASTR** | 1 | **1** | **−8,170₽** | SL наоборот (#1), W1↓ BUY (#4) |
| **GAZP** | 2 (1 stale) | **1** | **−1,057₽** | RR<1 (#2), Batch (#3) |
| **ROSN** | 1 | **1** | **−312₽** | RR<1 (#2), Batch (#3) |
| **LKOH** | 1 | **1** | **−953₽** | RR<1 (#2), Batch (#3) |
| **VTBR** | 1 | **1** | **−401₽** | Торговый риск (нормальная сделка) |
| **SBER** | 2 (1 cancelled) | **0** | **+1,221₽** | — |
| **PLZL** | 1 (open) | **0** | **+1,390₽** | — |

**X5 — абсолютный лидер по убыткам** (4 сделки, −2,594₽). Все — BUY в W1↓.

---

## 4. Внесённые изменения

### 4.1. Код

| Файл | Изменение |
|------|-----------|
| `src/analysis/tech_analysis.py` | Добавлен X5 Hard Block #1 (W1↓ → BUY невозможен) |
| `src/analysis/tech_analysis.py` | Добавлен жёсткий блок RR < 1.0 (сделка невозможна) |
| `src/analysis/tech_analysis.py` | Исправлен расчёт RR: `entry_price` вместо `current_price` |
| `src/api/trade_journal.py` | Добавлена `_validate_sl_tp()` — проверка SL/TP направления |
| `src/api/tbank.py` | Добавлена валидация SL/TP в `calculate_position_size()` |
| `_analyze_all_db.py` | Добавлен шаг 12.5 — финальная валидация SL/TP |

### 4.2. Агенты

| Файл | Изменение |
|------|-----------|
| `.opencode/agents/tech-analyst.md` | Добавлена таблица Hard Block правил (#1–#7) |
| `.opencode/agents/tech-analyst.md` | Добавлен запрет на batch-трейды |
| `.opencode/agents/tech-analyst.md` | Добавлено правило верификации SL direction |
| `.opencode/agents/trade-executor.md` | Усилена секция Signal Validation (SL направление, RR проверка, W1↓ блок) |

---

## 5. Выводы

1. **Самая дорогая ошибка — SL на неверной стороне.** Две сделки (X5, ASTR) потеряли ~9,677₽ из-за того, что SL был установлен выше Entry для BUY. После фикса эта ситуация НЕВОЗМОЖНА — валидация в 3 местах блокирует такие сделки.

2. **Вторая по значимости — сделки с RR < 1:1.** Три SELL-сделки имели отрицательное матожидание. После фикса RR < 1.0 = HARD BLOCK.

3. **W1↓ — абсолютный запрет на BUY.** Это было самой очевидной ошибкой (4 BUY в W1↓), но не было формализовано. Теперь это Hard Block #1.

4. **Batch-трейды опасны.** Открытие нескольких сделок из одного отчёта приводит к одновременным убыткам. Каждый тикер требует индивидуального анализа.

5. **Pre-div rally — не панацея.** В медвежьем рынке дивиденды не гарантируют роста. Confidence cap 55%.
