07.4.4.1.10.3 — Telegram Diagnostic Screen

This commit is contained in:
2026-05-16 09:23:37 +03:00
parent 8e1c09ad66
commit 2c75f95b46
16 changed files with 2902 additions and 243 deletions

View File

@@ -8,6 +8,7 @@ from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, Message
from src.telegram.handlers.auto.ui import (
auto_diagnostics_keyboard,
auto_keyboard,
build_auto_text,
is_auto_configured,
@@ -16,6 +17,8 @@ from src.telegram.handlers.system import open_auto_settings
from src.telegram.live.active_screen import ActiveScreenManager
from src.trading.auto.runner import AutoTradeRunner
from src.trading.auto.service import AutoTradeService
from src.trading.diagnostics.formatter import SemanticDiagnosticFormatter
from src.trading.diagnostics.snapshot import SemanticDiagnosticSnapshotBuilder
router = Router(name="auto")
@@ -88,6 +91,58 @@ async def _prepare_auto_from_callback(callback: CallbackQuery) -> bool:
return True
def build_auto_diagnostics_text() -> str:
service = AutoTradeService()
state = service.get_state()
snapshot = SemanticDiagnosticSnapshotBuilder().build(
state,
is_configured=is_auto_configured(state),
)
return SemanticDiagnosticFormatter().format(snapshot)
async def render_auto_diagnostics_screen(
target_message: Message,
) -> None:
text = build_auto_diagnostics_text()
try:
await target_message.edit_text(
text,
reply_markup=auto_diagnostics_keyboard(),
)
except TelegramBadRequest as exc:
error_text = str(exc).lower()
if "message to edit not found" in error_text:
await target_message.answer(
text,
reply_markup=auto_diagnostics_keyboard(),
)
return
if "message is not modified" in error_text:
return
raise
AutoTradeRunner.register_screen(
bot=target_message.bot,
chat_id=target_message.chat.id,
message_id=target_message.message_id,
render_text=build_auto_diagnostics_text,
render_markup=auto_diagnostics_keyboard,
)
ActiveScreenManager.register(
screen="auto_diagnostics",
message=target_message,
)
@router.message(F.text.in_({"🤖 Автоторговля", "🤖 Авто"}))
async def open_auto(message: Message, state: FSMContext) -> None:
await state.clear()
@@ -173,4 +228,21 @@ async def auto_stop(callback: CallbackQuery) -> None:
await _prepare_auto_from_callback(callback)
await render_auto_screen(callback.message, edit_mode=True)
await callback.answer(message)
await callback.answer(message)
@router.callback_query(F.data == "auto:diagnostics")
async def open_auto_diagnostics(callback: CallbackQuery) -> None:
if callback.message is None:
await callback.answer("Сообщение не найдено", show_alert=True)
return
await ActiveScreenManager.prepare_new_screen(
screen="auto_diagnostics",
bot=callback.message.bot,
chat_id=callback.message.chat.id,
keep_message_id=callback.message.message_id,
)
await render_auto_diagnostics_screen(callback.message)
await callback.answer()

View File

@@ -15,15 +15,45 @@ from src.trading.auto.service import AutoTradeService
def auto_keyboard() -> InlineKeyboardMarkup:
state = AutoTradeService().get_state()
builder = InlineKeyboardBuilder()
builder.button(text="▶️ Start", callback_data="auto:start")
builder.button(text="👀 Watch", callback_data="auto:observe")
builder.button(text="🛑 Stop", callback_data="auto:stop")
status = (state.status or "").upper()
if status == "OFF":
builder.button(text="▶️ Start", callback_data="auto:start")
builder.button(text="👀 Watch", callback_data="auto:observe")
elif status == "RUNNING":
builder.button(text="👀 Watch", callback_data="auto:observe")
builder.button(text="🛑 Stop", callback_data="auto:stop")
elif status == "OBSERVING":
builder.button(text="▶️ Start", callback_data="auto:start")
builder.button(text="🛑 Stop", callback_data="auto:stop")
else:
builder.button(text="▶️ Start", callback_data="auto:start")
builder.button(text="👀 Watch", callback_data="auto:observe")
builder.button(text="🛑 Stop", callback_data="auto:stop")
builder.button(text="🛠️ Настройки", callback_data="settings:auto")
builder.button(text="🧯 Защита", callback_data="auto:risk")
builder.button(text="🔬 Диагностика", callback_data="auto:diagnostics")
builder.adjust(3, 2)
builder.adjust(2, 2, 1)
return builder.as_markup()
def auto_diagnostics_keyboard() -> InlineKeyboardMarkup:
builder = InlineKeyboardBuilder()
builder.button(text="🔄 Обновить", callback_data="auto:diagnostics")
builder.button(text="⬅️ Назад", callback_data="auto:home")
builder.adjust(2)
return builder.as_markup()
@@ -281,7 +311,6 @@ def _build_waiting_text(state) -> str:
_order_header_line(state),
f"{_price_label_for_signal(state)} · {_format_plain_or_dash(price)}",
_estimated_size_text(state, price),
_adaptive_size_line(state),
_max_reserved_line(state, price),
_effective_risk_line(state),
]
@@ -346,7 +375,6 @@ def _build_active_position_text(state) -> str:
"",
f"Размер · {_format_crypto_size(size)}",
f"Позиция · {_format_money_compact(notional)}",
_adaptive_size_line(state),
f"Вход · {_format_plain_or_dash(state.entry_price)}",
f"Цена · {_format_plain_or_dash(price_for_calc)}",
"",