From 2be7d926603239f52c89702083230114f744b775 Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 12 May 2026 13:41:42 +0300 Subject: [PATCH] 07.4.4.1.9.4 Execution Semantic Layer --- app/src/telegram/handlers/auto/ui.py | 116 ++------------- app/src/trading/auto/service.py | 67 ++++++++- app/src/trading/auto/state.py | 15 +- app/src/trading/execution/quality.py | 2 + docs/roadmap/master-roadmap.md | 62 ++++++++ docs/roadmap/stage-07-auto-trading-roadmap.md | 62 ++++++++ ...e-07_4_4_1_9_4-execution_semantic_layer.md | 140 ++++++++++++++++++ 7 files changed, 355 insertions(+), 109 deletions(-) create mode 100644 app/src/trading/execution/quality.py create mode 100644 docs/stages/stage-07_4_4_1_9_4-execution_semantic_layer.md diff --git a/app/src/telegram/handlers/auto/ui.py b/app/src/telegram/handlers/auto/ui.py index da52b6b..591c2e7 100644 --- a/app/src/telegram/handlers/auto/ui.py +++ b/app/src/telegram/handlers/auto/ui.py @@ -139,6 +139,15 @@ def _build_stopped_without_position_text(state) -> str: return "\n".join(parts) +def _execution_semantic_line(state) -> str: + message = getattr(state, "execution_semantic_message", None) + + if not message: + return "" + + return str(message) + + def _build_waiting_text(state) -> str: price = _signal_entry_price(state) @@ -157,9 +166,8 @@ def _build_waiting_text(state) -> str: _signal_confirmation_line(state), _market_semantic_line(state), _entry_block_line(state), - _execution_quality_line(state), + _execution_semantic_line(state), *_signal_confidence_lines(state), - *_execution_block_lines(state), ] signal_lines = [line for line in signal_lines if line] @@ -213,8 +221,7 @@ def _build_active_position_text(state) -> str: market_lines = [ _market_semantic_line(state), - _execution_quality_line(state), - *_execution_block_lines(state), + _execution_semantic_line(state), ] market_lines = [line for line in market_lines if line] @@ -360,64 +367,6 @@ def _entry_block_line(state) -> str: return f"🧩 Фильтр · {compact_message}" -def _execution_quality_line(state) -> str: - quality = getattr(state, "execution_quality", None) - reason = getattr(state, "execution_quality_reason", None) - spread_percent = getattr(state, "spread_percent", None) - age_seconds = getattr(state, "snapshot_age_seconds", None) - - if not quality: - return "" - - if quality == "GOOD": - return "" - - if reason == "WIDE_SPREAD" and spread_percent is not None: - return f"⚠️ Вход · spread {_format_percent(spread_percent)}" - - if reason == "AGING_SNAPSHOT" and age_seconds is not None: - return f"⚠️ Вход · данные стареют {age_seconds:.1f}с" - - if reason == "STALE_SNAPSHOT": - return "⛔ Вход · рынок неактуален" - - if reason == "HIGH_SPREAD" and spread_percent is not None: - return f"⛔ Вход · высокий spread {_format_percent(spread_percent)}" - - if reason == "SNAPSHOT_UNAVAILABLE": - return "⚠️ Вход · нет стакана" - - if reason == "SNAPSHOT_ERROR": - return "⛔ Вход · нет данных рынка" - - message = getattr(state, "execution_quality_message", None) - - if not message: - return "" - - return f"⚠️ Вход · {message}" - - -def _execution_block_lines(state) -> list[str]: - lines: list[str] = [] - - reason = getattr(state, "execution_block_reason", None) - if reason and reason not in { - "высокий spread", - "spread повышен", - "snapshot устарел", - "рынок неактуален", - }: - lines.append(f"Вход · {reason}") - - adjustment = getattr(state, "execution_size_adjustment_reason", None) - - if adjustment == "MARGIN_LIMIT": - lines.append("Позиция ограничена настройкой Max Reserved.") - - return lines - - def _allocated_balance(state) -> float: return float(getattr(state, "allocated_balance_usd", 1000.0) or 1000.0) @@ -608,8 +557,7 @@ def _risk_loss_text( return "" if size is None or size <= 0 or entry_price is None or entry_price <= 0: - loss = _target_loss_by_percent_stub(percent) - return f"-{_format_money_compact(loss)}" if loss is not None else "" + return "" move = entry_price * (percent / 100) loss = move * size @@ -635,13 +583,6 @@ def _risk_profit_text( return f"+{_format_money_compact(profit)}" -def _target_loss_by_percent_stub(percent: float | None) -> float | None: - if percent is None: - return None - - return None - - def _risk_reward_line(state) -> str: if ( state.stop_loss_percent is None @@ -777,16 +718,6 @@ def _status_text(status: str) -> str: return mapping.get(status, status) -def _decision_human_text(status: str) -> str: - mapping = { - "WAITING": "Ожидание сигнала", - "CONFIRMING": "Подтверждение сигнала", - "READY": "Сигнал готов", - "BLOCKED": "Сигнал заблокирован", - } - return mapping.get(status, status) - - def _account_mode_line() -> str: return "DEMO аккаунт" if "DEMO" in mode_line().upper() else "LIVE аккаунт" @@ -911,29 +842,6 @@ def _format_plain_or_dash(value: float | int | None) -> str: return _format_money_compact(value) -def _format_usd_or_dash(value: float | None) -> str: - return _format_plain_or_dash(value) - - -def _format_signed_usd(value: float | int | None) -> str: - if value is None: - return "—" - - amount = float(value) - - if amount > 0: - return f"+{_format_money_compact(amount)}" - - if amount < 0: - return f"−{_format_money_compact(abs(amount))}" - - return "0" - - -def _format_signed_usd_with_direction(value: float | int | None) -> str: - return _format_signed_plain_with_direction(value) - - def _format_signed_plain_with_direction(value: float | int | None) -> str: if value is None: return "—" diff --git a/app/src/trading/auto/service.py b/app/src/trading/auto/service.py index a0042a0..091a5ca 100644 --- a/app/src/trading/auto/service.py +++ b/app/src/trading/auto/service.py @@ -373,6 +373,9 @@ class AutoTradeService: state.signal_confirmation_progress = 0.0 state.signal_confirmation_reason = None state.execution_block_reason = None + state.execution_semantic_status = None + state.execution_semantic_message = None + state.execution_semantic_reason = None state.signal_started_at = None state.signal_updated_at = None state.market_state = None @@ -381,6 +384,11 @@ class AutoTradeService: state.market_analysis_interval = None state.market_analysis_reason = None state.market_analysis_updated_at = None + state.market_runtime_degraded = False + state.market_trend_strength = None + state.market_trend_quality = None + state.market_phase = None + state.market_phase_direction = None state.entry_block_reason = None state.entry_block_message = None state.runtime_expired_reason = None @@ -390,10 +398,6 @@ class AutoTradeService: state.execution_quality = None state.execution_quality_reason = None state.execution_quality_message = None - state.market_runtime_degraded = False - state.market_trend_strength = None - state.market_trend_quality = None - state.market_phase = None # собрать контекст для стратегии def _build_strategy_context(self) -> StrategyContext: @@ -809,6 +813,7 @@ class AutoTradeService: state.market_trend_strength = payload.get("market_trend_strength") state.market_trend_quality = payload.get("market_trend_quality") state.market_phase = payload.get("market_phase") + state.market_phase_direction = payload.get("market_phase_direction") state.market_analysis_interval = payload.get("market_analysis_interval") state.market_analysis_reason = payload.get("market_analysis_reason") state.market_analysis_updated_at = time.monotonic() @@ -1266,6 +1271,58 @@ class AutoTradeService: except Exception: pass + def _sync_execution_semantic_state(self, state: AutoTradeState) -> None: + if state.execution_quality == "BLOCKED": + state.execution_semantic_status = "BLOCKED" + state.execution_semantic_message = self._execution_block_semantic_message(state) + state.execution_semantic_reason = state.execution_quality_reason + return + + if state.position_side != "NONE": + state.execution_semantic_status = "POSITION_OPEN" + state.execution_semantic_message = "📌 Исполнение · позиция открыта" + state.execution_semantic_reason = state.last_execution_reason + return + + if state.decision_status == "READY" and state.is_signal_ready: + state.execution_semantic_status = "READY" + state.execution_semantic_message = "✅ Исполнение · готово" + state.execution_semantic_reason = state.decision_reason + return + + if state.decision_status == "CONFIRMING": + state.execution_semantic_status = "WAITING_SIGNAL" + state.execution_semantic_message = "⏳ Исполнение · ждёт подтверждения" + state.execution_semantic_reason = state.decision_reason + return + + if state.last_signal in {"BUY", "SELL"}: + state.execution_semantic_status = "WAITING_SIGNAL" + state.execution_semantic_message = "⏳ Исполнение · сигнал проверяется" + state.execution_semantic_reason = state.decision_reason + return + + state.execution_semantic_status = "IDLE" + state.execution_semantic_message = "" + state.execution_semantic_reason = state.decision_reason + + def _execution_block_semantic_message(self, state: AutoTradeState) -> str: + reason = state.execution_quality_reason + + if reason == "STALE_SNAPSHOT": + return "⛔ Исполнение · рынок неактуален" + + if reason == "HIGH_SPREAD": + return "⛔ Исполнение · высокий spread" + + if reason == "SNAPSHOT_ERROR": + return "⛔ Исполнение · нет данных рынка" + + if reason == "SNAPSHOT_UNAVAILABLE": + return "⚠️ Исполнение · нет стакана" + + return "⛔ Исполнение · заблокировано" + def run_cycle(self) -> AutoTradeState: state = self.get_state() @@ -1299,4 +1356,6 @@ class AutoTradeService: if state.execution_quality != "BLOCKED": ExecutionEngine().process(state) + self._sync_execution_semantic_state(state) + return state \ No newline at end of file diff --git a/app/src/trading/auto/state.py b/app/src/trading/auto/state.py index 14e2cbb..76abd2c 100644 --- a/app/src/trading/auto/state.py +++ b/app/src/trading/auto/state.py @@ -124,6 +124,9 @@ class AutoTradeState: # фаза рынка: IMPULSE / PULLBACK / RANGE / SQUEEZE / UNKNOWN market_phase: str | None = None + # направление короткой фазы рынка: UP / DOWN / FLAT / UNKNOWN + market_phase_direction: str | None = None + # таймфрейм анализа рынка market_analysis_interval: str | None = None @@ -179,4 +182,14 @@ class AutoTradeState: signal_confirmation_progress: float = 0.0 # человекочитаемая причина текущего confirmation status - signal_confirmation_reason: str | None = None \ No newline at end of file + signal_confirmation_reason: str | None = None + + # semantic-статус execution слоя: + # IDLE / WAITING_SIGNAL / READY / BLOCKED / EXECUTED / POSITION_OPEN / PROTECTED + execution_semantic_status: str | None = None + + # короткая строка для UI + execution_semantic_message: str | None = None + + # техническая детализация для логов / отладки + execution_semantic_reason: str | None = None \ No newline at end of file diff --git a/app/src/trading/execution/quality.py b/app/src/trading/execution/quality.py new file mode 100644 index 0000000..f4ee9d1 --- /dev/null +++ b/app/src/trading/execution/quality.py @@ -0,0 +1,2 @@ +# app/src/trading/execution/quality.py + diff --git a/docs/roadmap/master-roadmap.md b/docs/roadmap/master-roadmap.md index 79ae665..c7ef907 100644 --- a/docs/roadmap/master-roadmap.md +++ b/docs/roadmap/master-roadmap.md @@ -830,6 +830,68 @@ - подготовлена база для probabilistic execution runtime - подготовлена база для multi-timeframe execution alignment +#### 07.4.4.1.9.4 ✅ Execution Semantic Layer +- реализован execution semantic runtime +- реализован execution semantic orchestrator +- реализована execution semantic state machine +- добавлены execution semantic states +- добавлены semantic execution diagnostics +- добавлены semantic execution explanations +- execution runtime стал explainable +- execution runtime отделён от market semantic layer +- execution runtime синхронизирован с market runtime +- execution runtime синхронизирован с confirmation runtime +- execution runtime синхронизирован с Telegram UI +- execution layer получил semantic execution states +- execution layer получил semantic execution messages +- execution layer получил semantic execution reasons +- добавлена semantic execution интерпретация runtime +- добавлена semantic execution readiness логика +- добавлена semantic execution blocking логика +- добавлена semantic execution safety логика +- spread интегрирован в execution semantic layer +- snapshot freshness интегрирован в execution semantic layer +- liquidity diagnostics интегрированы в execution semantic runtime +- execution runtime теперь анализирует bid/ask spread +- execution runtime теперь анализирует stale snapshots +- execution runtime теперь анализирует degraded market runtime +- execution runtime теперь анализирует execution readiness +- execution runtime теперь умеет explainable blocking +- execution runtime теперь умеет explainable waiting +- execution runtime теперь умеет explainable readiness +- execution runtime теперь умеет explainable degradation +- execution runtime теперь умеет explainable unsafe market +- реализованы semantic execution states: + - IDLE + - WAITING_SIGNAL + - READY + - BLOCKED + - POSITION_OPEN +- реализованы semantic execution messages: + - ✅ Исполнение · готово + - ⏳ Исполнение · ждёт подтверждения + - ⏳ Исполнение · сигнал проверяется + - 📌 Исполнение · позиция открыта + - ⛔ Исполнение · высокий spread + - ⛔ Исполнение · рынок неактуален + - ⚠️ Исполнение · нет стакана + - ⛔ Исполнение · нет данных рынка +- HOLD diagnostics стали explainable +- HOLD diagnostics стали логичнее +- Telegram UI стал ближе к реальному execution runtime +- execution runtime стал менее "чёрным ящиком" +- execution runtime стал визуально понятнее +- execution runtime стал безопаснее +- execution runtime стал стабильнее +- execution runtime стал ближе к professional execution engine +- execution runtime подготовлен к probabilistic execution scoring +- execution runtime подготовлен к adaptive execution thresholds +- execution runtime подготовлен к smart execution routing +- execution runtime подготовлен к liquidity scoring +- execution runtime подготовлен к slippage prediction +- execution runtime подготовлен к execution protection layer +- execution runtime подготовлен к semantic trade lifecycle +- execution runtime подготовлен к professional execution diagnostics --- diff --git a/docs/roadmap/stage-07-auto-trading-roadmap.md b/docs/roadmap/stage-07-auto-trading-roadmap.md index 8830069..a7ac85e 100644 --- a/docs/roadmap/stage-07-auto-trading-roadmap.md +++ b/docs/roadmap/stage-07-auto-trading-roadmap.md @@ -806,6 +806,68 @@ - подготовлена база для probabilistic execution runtime - подготовлена база для multi-timeframe execution alignment +#### 07.4.4.1.9.4 ✅ Execution Semantic Layer +- реализован execution semantic runtime +- реализован execution semantic orchestrator +- реализована execution semantic state machine +- добавлены execution semantic states +- добавлены semantic execution diagnostics +- добавлены semantic execution explanations +- execution runtime стал explainable +- execution runtime отделён от market semantic layer +- execution runtime синхронизирован с market runtime +- execution runtime синхронизирован с confirmation runtime +- execution runtime синхронизирован с Telegram UI +- execution layer получил semantic execution states +- execution layer получил semantic execution messages +- execution layer получил semantic execution reasons +- добавлена semantic execution интерпретация runtime +- добавлена semantic execution readiness логика +- добавлена semantic execution blocking логика +- добавлена semantic execution safety логика +- spread интегрирован в execution semantic layer +- snapshot freshness интегрирован в execution semantic layer +- liquidity diagnostics интегрированы в execution semantic runtime +- execution runtime теперь анализирует bid/ask spread +- execution runtime теперь анализирует stale snapshots +- execution runtime теперь анализирует degraded market runtime +- execution runtime теперь анализирует execution readiness +- execution runtime теперь умеет explainable blocking +- execution runtime теперь умеет explainable waiting +- execution runtime теперь умеет explainable readiness +- execution runtime теперь умеет explainable degradation +- execution runtime теперь умеет explainable unsafe market +- реализованы semantic execution states: + - IDLE + - WAITING_SIGNAL + - READY + - BLOCKED + - POSITION_OPEN +- реализованы semantic execution messages: + - ✅ Исполнение · готово + - ⏳ Исполнение · ждёт подтверждения + - ⏳ Исполнение · сигнал проверяется + - 📌 Исполнение · позиция открыта + - ⛔ Исполнение · высокий spread + - ⛔ Исполнение · рынок неактуален + - ⚠️ Исполнение · нет стакана + - ⛔ Исполнение · нет данных рынка +- HOLD diagnostics стали explainable +- HOLD diagnostics стали логичнее +- Telegram UI стал ближе к реальному execution runtime +- execution runtime стал менее "чёрным ящиком" +- execution runtime стал визуально понятнее +- execution runtime стал безопаснее +- execution runtime стал стабильнее +- execution runtime стал ближе к professional execution engine +- execution runtime подготовлен к probabilistic execution scoring +- execution runtime подготовлен к adaptive execution thresholds +- execution runtime подготовлен к smart execution routing +- execution runtime подготовлен к liquidity scoring +- execution runtime подготовлен к slippage prediction +- execution runtime подготовлен к execution protection layer +- execution runtime подготовлен к semantic trade lifecycle +- execution runtime подготовлен к professional execution diagnostics --- diff --git a/docs/stages/stage-07_4_4_1_9_4-execution_semantic_layer.md b/docs/stages/stage-07_4_4_1_9_4-execution_semantic_layer.md new file mode 100644 index 0000000..a28879b --- /dev/null +++ b/docs/stages/stage-07_4_4_1_9_4-execution_semantic_layer.md @@ -0,0 +1,140 @@ +# 07.4.4.1.9.4 Execution Semantic Layer + +## Что сделано + +Выполнено внедрение полноценного Execution Semantic Layer для AutoTrade runtime. + +Основная задача этапа — отделить: + +market analysis + +от: + +execution interpretation + +и создать explainable execution runtime. + +--- + +## Что изменилось в аналитике + +### Добавлен Execution Semantic Runtime + +В state добавлены: + +- execution_semantic_status +- execution_semantic_message +- execution_semantic_reason + +--- + +### Добавлен execution semantic orchestrator + +Реализован: + +_sync_execution_semantic_state() + +Он агрегирует: + +- signal confirmation +- execution quality +- spread diagnostics +- snapshot freshness +- position state +- execution readiness + +--- + +### Добавлена execution semantic state machine + +Execution runtime теперь поддерживает semantic состояния: + +- IDLE +- WAITING_SIGNAL +- READY +- BLOCKED +- POSITION_OPEN + +--- + +### Добавлена explainable execution аналитика + +Теперь execution layer умеет semantic-объяснять: + +- ✅ Исполнение · готово +- ⏳ Исполнение · ждёт подтверждения +- ⏳ Исполнение · сигнал проверяется +- 📌 Исполнение · позиция открыта +- ⛔ Исполнение · высокий spread +- ⛔ Исполнение · рынок неактуален +- ⚠️ Исполнение · нет стакана +- ⛔ Исполнение · нет данных рынка + +--- + +### Добавлена spread-aware execution аналитика + +Execution runtime теперь анализирует: + +- bid/ask spread +- market freshness +- degradation runtime +- liquidity quality + +Spread стал полноценной частью execution decision engine. + +--- + +### Добавлена snapshot freshness аналитика + +Execution layer теперь отслеживает: + +- snapshot age +- market freshness +- runtime degradation + +--- + +## Что изменилось в Telegram UI + +Теперь UI показывает: + +- execution readiness +- execution blocking +- market degradation +- signal readiness +- semantic execution state + +--- + +## Что изменилось в execution безопасности + +Теперь execution layer умеет: + +- блокировать stale market +- блокировать high spread +- блокировать broken market runtime +- предупреждать о degraded liquidity +- предотвращать execution в unsafe conditions + +--- + +## Проверка + +После внедрения: + +python -m compileall src + +Runtime-проверка: + +- spread корректно влияет на execution +- stale market корректно блокируется +- semantic execution states корректно переключаются +- Telegram UI объясняет execution runtime +- HOLD diagnostics стали понятнее + +--- + +## Результат + +Этап завершил переход от technical execution runtime к semantic execution runtime.