07.4.3.12 — Real Risk Engine (execution-level)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
130
docs/stages/stage-07_4_3_12-real_risk_engine-execution_level.md
Normal file
130
docs/stages/stage-07_4_3_12-real_risk_engine-execution_level.md
Normal 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)
|
||||||
Reference in New Issue
Block a user