# 07.4.4.1.3 — Journal Runtime Cleanup & Event Titles Layer

## Цель этапа

Привести журнал runtime-событий к единому, читаемому и пригодному для анализа виду.

После этапов Market State Engine и Market State Journal Events журнал уже начал фиксировать состояние рынка, сигналы, настройки и runtime-события. Но в экспорте и UI оставались проблемы:

- заголовки часто дублировали сообщения;
- часть сообщений была слишком длинной;
- часть event_type отображалась технически;
- market_state_changed и market_trend_changed часто писали один и тот же смысл;
- в экспорт попадали эмодзи;
- в сообщениях встречались лишние технические маркеры вроде [AUTO];
- торговые инструменты отображались в сыром виде, например BTC/USD_LEVERAGE;
- EVENT_TITLES дублировались в разных файлах.

Этап 07.4.4.1.3 сделал журнал более чистым, компактным и пригодным для дальнейшей аналитики.

---

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

## 1. Унифицирована логика заголовков журнала

В журнале была закреплена новая модель:

- `event_type` — технический код события;
- `Заголовок` — короткая сущность события;
- `Сообщение` — конкретное действие или факт.

Теперь заголовок больше не повторяет текст сообщения.

Пример итогового формата:

- `auto_settings_updated` → `Автоторговля` → `Плечо изменено: x3.`
- `risk_settings_updated` → `Защита` → `Параметры защиты позиции изменены: SL=1%, TP=1%, ML=off.`
- `market_state_changed` → `Рынок` → `Состояние рынка изменено: снижение.`
- `market_stream_connected` → `Рынок` → `Поток рыночных данных подключён.`

Такой формат стал понятнее и для пользователя, и для будущих фильтров / поиска / аналитики.

---

## 2. EVENT_TITLES подготовлены к централизации

Была согласована новая компактная карта заголовков событий.

Ключевые группы:

- `Сигнал`
- `Позиция`
- `Автоторговля`
- `Защита`
- `Рынок`
- `Журнал`
- `Уведомление`
- `Приложение`
- `Система`
- `Портфель`
- `Биржа`
- `Баланс`

Также принято архитектурное решение вынести `EVENT_TITLES` в отдельный общий файл:

```text
app/src/core/event_titles.py
```

Это правильнее, чем хранить заголовки в `trading/journal`, потому что события относятся не только к торговле, но и к системе, журналу, рынку, уведомлениям, портфелю и бирже.

---

## 3. Убрано дублирование market_state_changed и market_trend_changed

До правки одно изменение рынка могло писать сразу два события:

- `market_state_changed` — «Рынок перешёл в рост»
- `market_trend_changed` — «Направление рынка изменилось на рост»

Для пользователя это выглядело как дублирование.

Теперь `market_trend_changed` исключён из обычного журналирования, потому что направление уже включено в market state:

- `TREND_UP` уже означает рост;
- `TREND_DOWN` уже означает снижение;
- `RANGE` уже означает отсутствие выраженного направления.

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

```text
market_state_changed → Рынок → Состояние рынка изменено: снижение.
```

Это сделало market-analysis feed значительно чище.

---

## 4. Аналитические market-сообщения приведены к единому стилю

Market-analysis сообщения были переписаны в одинаковом формате:

- `Состояние рынка изменено: рост.`
- `Состояние рынка изменено: снижение.`
- `Состояние рынка изменено: нет выраженного направления.`
- `Состояние рынка изменено: высокая волатильность.`
- `Состояние рынка изменено: низкая активность.`

Сообщения волатильности также приведены к компактному виду:

- `Волатильность изменена: низкая.`
- `Волатильность изменена: нормальная.`
- `Волатильность изменена: высокая.`

Это важно для дальнейшей аналитики: сообщения теперь имеют одинаковую структуру и легче читаются в CSV / XLSX.

---

## 5. Market trend оставлен в payload, но убран из отдельного журнала

Поле `market_trend` не удалялось из состояния и payload.

Оно по-прежнему может использоваться:

- в UI;
- в стратегии;
- в debug;
- в будущей аналитике;
- в explainability layer.

Но отдельное событие `market_trend_changed` больше не нужно для обычного журнала, потому что оно дублировало `market_state_changed`.

Итог:

- данные не потеряны;
- журнал стал чище;
- future analytics сохранила нужный контекст.

---

## 6. Улучшено отображение состояния рынка в Auto UI

Формулировка `Рынок · Падение` была признана неоднозначной.

Она могла восприниматься как «цена прямо сейчас падает», хотя фактически отображался более широкий режим рынка по анализатору.

Поэтому UI wording был уточнён:

- `TREND_UP` → `Тренд · Восходящий`
- `TREND_DOWN` → `Тренд · Нисходящий`
- `RANGE` → `Тренд · Нет выраженного направления`
- `HIGH_VOLATILITY` → `Рынок · Высокая волатильность`
- `LOW_VOLATILITY` → `Рынок · Низкая активность`
- `UNKNOWN` → `Рынок · Идёт анализ`

Это снизило риск неправильной интерпретации графика пользователем.

---

## 7. Сообщения настроек автоторговли приведены к единому стилю

Сообщения настроек были сокращены и стандартизированы.

Теперь используется формат:

- `Стратегия изменена: TREND.`
- `Актив изменён: BTC.`
- `Риск на сделку изменён: 1%.`
- `Плечо изменено: x3.`
- `Лимит на сделку изменён: 50%.`

Ранее сообщения были длиннее и местами дублировали заголовок.

---

## 8. Символы активов очищены для journal messages

В пользовательских сообщениях журнала убраны технические торговые символы вида:

```text
BTC/USD_LEVERAGE
ETH/USD_LEVERAGE
LTC/USD_LEVERAGE
XRP/USD_LEVERAGE
```

Теперь в сообщениях отображаются короткие имена активов:

```text
BTC
ETH
LTC
XRP
```

Пример:

```text
[DEMO] Актив изменён: BTC.
```

В payload при этом сохраняется полный технический symbol, поэтому аналитика и отладка не теряют точность.

---

## 9. Risk-control logging приведён к единому формату

Сообщение `Параметры защиты позиции обновлены` было заменено на более информативное:

```text
Параметры защиты позиции изменены: SL=1%, TP=1%, ML=25 USD.
```

Теперь в одном сообщении видно состояние всех ключевых protective rules:

- Stop Loss;
- Take Profit;
- Max Loss.

Это удобно для просмотра истории настроек в журнале и экспорте.

---

## 10. Уведомления приведены к единой модели событий

Notification layer был очищен от legacy event_type.

Теперь используется единая схема:

- `notification_sent`
- `notification_error`

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

```text
Telegram-уведомление отправлено.
```

Ошибки отправки также пишутся в один event_type `notification_error`, а детали уходят в payload.

---

## 11. Убран лишний runtime-префикс [AUTO]

Сообщения market runtime раньше выглядели так:

```text
[DEMO] [AUTO] Поток рыночных данных подключён.
```

Префикс `[AUTO]` был признан избыточным, потому что контекст уже хранится в колонках `Экран`, `Действие` и payload.

Теперь сообщение выглядит чище:

```text
[DEMO] Поток рыночных данных подключён.
```

---

## 12. Экспорт очищен от эмодзи

CSV / XLSX экспорт был очищен от эмодзи.

Эмодзи могут быть удобны в Telegram UI, но в экспортных файлах они мешают:

- сортировке;
- фильтрации;
- чтению в Excel;
- будущей BI-аналитике;
- машинной обработке.

Теперь экспорт содержит чистые текстовые значения.

---

# Изменения в архитектуре

## Core Layer

Подготовлено выделение общего файла:

```text
src/core/event_titles.py
```

Он должен стать единым источником event-title mapping для:

- journal UI;
- CSV export;
- XLSX export;
- будущих filters/search layer.

---

## Journal UI Layer

`journal_ui.py` подготовлен к использованию централизованного `event_title()`.

Локальный `EVENT_TITLES` больше не должен дублироваться после вынесения в core.

---

## Journal Export Layer

`exporter.py` подготовлен к использованию того же `event_title()`.

Это гарантирует, что UI и экспорт будут показывать одинаковые заголовки.

---

## Auto Runtime Layer

В `AutoTradeService` улучшена логика market logging:

- убрано избыточное `market_trend_changed`;
- сохранено `market_state_changed`;
- сохранено `market_volatility_changed`;
- market trend оставлен в payload;
- сообщения приведены к единому стилю.

---

## Market UI Layer

Auto UI стал точнее отображать market state:

- вместо «Падение» используется «Нисходящий тренд»;
- вместо «Рост» используется «Восходящий тренд»;
- вместо «Без направления» используется «Нет выраженного направления».

---

# Что изменилось для пользователя

Журнал стал выглядеть как нормальная событийная лента:

```text
Рынок        | Состояние рынка изменено: снижение.
Рынок        | Волатильность изменена: нормальная.
Автоторговля | Плечо изменено: x3.
Защита       | Параметры защиты позиции изменены: SL=1%, TP=1%, ML=off.
Журнал       | Журнал очищен.
```

Пользователь теперь быстрее понимает:

- что изменилось;
- где изменилось;
- относится ли событие к рынку, настройкам, защите, позиции или журналу;
- какой был конкретный результат.

---

# Что подготовлено дальше

Этап подготовил основу для следующих работ:

- централизованный `event_titles.py`;
- фильтры журнала по сущностям;
- поиск по event_type;
- группировка событий по доменам;
- журнал действий пользователя;
- market transition statistics;
- аналитика частоты смены market state;
- AI-комментарии к журналу;
- подготовка runtime-журнала к реальной торговле.

---

# Итог этапа

Этап 07.4.4.1.3 завершил важную часть подготовки журнала к реальной эксплуатации.

Журнал больше не выглядит как набор технических сообщений. Он стал ближе к операционной ленте автоторговли, где каждая строка имеет понятную структуру:

```text
что произошло → где произошло → конкретное действие
```

Это важный шаг перед переходом к более серьёзной аналитике стратегий и дальнейшей подготовке к real trading.
