07.4.3.12 — Real Risk Engine (execution-level)

This commit is contained in:
2026-05-05 20:28:43 +03:00
parent 3c3f0e846a
commit b1513a28ef
6 changed files with 157 additions and 9 deletions

View File

@@ -287,7 +287,7 @@ async def reset_risk(callback: CallbackQuery, state: FSMContext) -> None:
) )
await callback.answer() await callback.answer()
await asyncio.sleep(5.5) await asyncio.sleep(2.5)
if getattr(AutoTradeRunner, "_current_screen", None) != "auto_risk": if getattr(AutoTradeRunner, "_current_screen", None) != "auto_risk":
return return

View File

@@ -343,6 +343,8 @@ class AutoTradeRunner:
f"{payload.get('old_size')}:" f"{payload.get('old_size')}:"
f"{payload.get('new_size')}:" f"{payload.get('new_size')}:"
f"{payload.get('pnl')}" f"{payload.get('pnl')}"
f"{payload.get('risk_reason')}:"
f"{payload.get('is_forced')}:"
) )
@classmethod @classmethod
def _build_execution_alert_text( def _build_execution_alert_text(

View File

@@ -275,6 +275,14 @@ class ExecutionEngine:
price_move_percent = self._calculate_price_move_percent(current_price) price_move_percent = self._calculate_price_move_percent(current_price)
unrealized_pnl = self._calculate_pnl(current_price) unrealized_pnl = self._calculate_pnl(current_price)
if self._is_max_loss_hit(state, unrealized_pnl):
return self._close_position(
state,
forced_reason="MAX_LOSS",
forced_exit_price=current_price,
forced_pnl=unrealized_pnl,
)
if self._is_stop_loss_hit(state, price_move_percent): if self._is_stop_loss_hit(state, price_move_percent):
return self._close_position( return self._close_position(
state, state,
@@ -291,14 +299,6 @@ class ExecutionEngine:
forced_pnl=unrealized_pnl, forced_pnl=unrealized_pnl,
) )
if self._is_max_loss_hit(state, unrealized_pnl):
return self._close_position(
state,
forced_reason="MAX_LOSS",
forced_exit_price=current_price,
forced_pnl=unrealized_pnl,
)
return None return None
def _is_stop_loss_hit( def _is_stop_loss_hit(

View File

@@ -215,6 +215,13 @@
- единая навигация: Auto ↔ Settings ↔ Risk - единая навигация: Auto ↔ Settings ↔ Risk
- UX-подсказки и валидация ввода - UX-подсказки и валидация ввода
#### 07.4.3.12 — Real Risk Engine (execution-level) ✅
- risk checks внутри ExecutionEngine
- SL / TP / ML закрывают позицию
- forced close с risk_reason
- интеграция в основной цикл автоторговли
- Telegram execution alerts с причиной риска
- единая точка принятия решений (execution layer)
### 07.4.4 ### 07.4.4
⏳ Grid Strategy ⏳ Grid Strategy

View File

@@ -199,6 +199,15 @@
- единая навигация: Auto ↔ Settings ↔ Risk - единая навигация: Auto ↔ Settings ↔ Risk
- UX-подсказки и валидация ввода - UX-подсказки и валидация ввода
#### 07.4.3.12 — Real Risk Engine (execution-level) ✅
- risk checks внутри ExecutionEngine
- SL / TP / ML закрывают позицию
- forced close с risk_reason
- интеграция в основной цикл автоторговли
- Telegram execution alerts с причиной риска
- единая точка принятия решений (execution layer)
--- ---
### 07.4.4 ### 07.4.4

View File

@@ -0,0 +1,130 @@
# 07.4.3.12 — Real Risk Engine (execution-level)
## 📌 Цель
Перенести risk-логику (Stop Loss, Take Profit, Max Loss)
с уровня UI/настроек на уровень execution engine.
Теперь риск не просто отображается, а **влияет на реальные торговые действия**.
---
## ⚙️ Что реализовано
### 1. Risk checks внутри ExecutionEngine
Добавлен блок:
- `_risk_close_decision()`
- вызывается **до execution логики (open / flip)**
Порядок проверок:
1. MAX_LOSS (USD)
2. STOP_LOSS (%)
3. TAKE_PROFIT (%)
---
### 2. Принудительное закрытие позиции (forced close)
При срабатывании риска:
```
_close_position(
forced_reason="STOP_LOSS" | "TAKE_PROFIT" | "MAX_LOSS"
)
```
Добавлено:
- risk_reason
- is_forced=True
---
### 3. Telegram execution alerts
Добавлено в alert:
```
Risk: STOP_LOSS
Risk: TAKE_PROFIT
Risk: MAX_LOSS
```
Работает для:
- paper_position_closed
- forced close событий
---
### 4. Интеграция в цикл автоторговли
Risk engine:
- встроен в ExecutionEngine.process()
- вызывается на каждом цикле
- не требует отдельного триггера
---
### 5. Поддерживаемые типы риска
- STOP_LOSS: % движения цены
- TAKE_PROFIT: % движения цены
- MAX_LOSS: P&L в USD
---
### 🧠 Архитектурные принципы
* Risk проверяется до входа в позицию
* Risk не дублируется в UI
* Все решения централизованы в ExecutionEngine
* UI только отображает состояние
---
### ⚠️ Ограничения текущей версии
1. Position size пока не связан с риском
2. MAX_LOSS — paper-based (USD), не account-based
3. Нет связи с балансом аккаунта
4. Нет partial close / trailing logic
---
### ✅ Тест-кейсы (пройдены)
TAKE_PROFIT
- LONG → TP → позиция закрывается
- Telegram: Risk: TAKE_PROFIT
STOP_LOSS
- LONG → SL → позиция закрывается
- Telegram: Risk: STOP_LOSS
MAX_LOSS
- позиция → убыток → закрытие
- Telegram: Risk: MAX_LOSS
---
### 📊 Итог
Risk engine теперь:
* работает на уровне execution
* влияет на реальные торговые решения
* синхронизирован с Telegram alerts
---
## Это первый шаг к production-grade risk management.
---
## Следующий шаг — 07.4.3.13 Position sizing (realistic)