07.4.3.14 — Auto Trading UI. Realistic Pricing & Debug Live Tools

This commit is contained in:
2026-05-09 01:34:46 +03:00
parent ee78f9774a
commit df76490783
15 changed files with 2161 additions and 464 deletions

View File

@@ -181,9 +181,9 @@ async def open_auto_settings(callback: CallbackQuery) -> None:
state = AutoTradeService().get_state()
strategy_map = {
"TREND": "📈 Trend Following",
"GRID": "🧩 Grid Trading",
"SCALP": "⚡ Scalping",
"TREND": "TREND FOLLOWING",
"GRID": "GRID TRADING",
"SCALP": "SCALPING",
}
strategy_ready = state.strategy is not None
@@ -191,10 +191,37 @@ async def open_auto_settings(callback: CallbackQuery) -> None:
risk_ready = state.risk_percent is not None
leverage_ready = state.leverage is not None
is_configured = strategy_ready and symbol_ready and risk_ready and leverage_ready
is_trend_strategy = (state.strategy or "").upper() == "TREND"
sl_ready = (
state.stop_loss_percent is not None
and state.stop_loss_percent > 0
)
is_configured = (
strategy_ready
and symbol_ready
and risk_ready
and leverage_ready
and (not is_trend_strategy or sl_ready)
)
strategy = strategy_map.get(state.strategy or "", "")
symbol = state.symbol or ""
symbol = ""
if state.symbol:
base = state.symbol.split("_", 1)[0].upper()
if "/" in base:
symbol = base.split("/", 1)[0]
else:
for suffix in ("USDT", "USD", "EUR", "BTC"):
if base.endswith(suffix) and len(base) > len(suffix):
base = base[: -len(suffix)]
break
symbol = base
risk = f"{state.risk_percent:.1f}%" if state.risk_percent is not None else ""
leverage = f"x{state.leverage:g}" if state.leverage is not None else ""
max_reserved = (
@@ -202,44 +229,70 @@ async def open_auto_settings(callback: CallbackQuery) -> None:
if state.max_reserved_balance_percent is not None
else "off"
)
sl = f"{state.stop_loss_percent:g}%" if state.stop_loss_percent is not None else "off"
tp = f"{state.take_profit_percent:g}%" if state.take_profit_percent is not None else "off"
ml = f"{state.max_loss_usd:g} USD" if state.max_loss_usd is not None else "off"
risk_controls = f"SL {sl} · TP {tp} · ML {ml}"
sl = (
f"{state.stop_loss_percent:g}%"
if state.stop_loss_percent is not None
else "off"
)
strategy_icon = "" if strategy_ready else "👉"
symbol_icon = "" if symbol_ready else "👉"
risk_icon = "" if risk_ready else "👉"
leverage_icon = "" if leverage_ready else "👉"
tp = (
f"{state.take_profit_percent:g}%"
if state.take_profit_percent is not None
else "off"
)
ml = (
f"{state.max_loss_usd:g} USD"
if state.max_loss_usd is not None
else "off"
)
strategy_icon = "" if strategy_ready else "⚠️"
symbol_icon = "" if symbol_ready else "⚠️"
risk_icon = "" if risk_ready else "⚠️"
leverage_icon = "" if leverage_ready else "⚠️"
sl_icon = "" if sl_ready else "⚠️"
if is_trend_strategy:
risk_controls_block = (
"<b>Защита позиции:</b>\n"
f"{sl_icon} Stop Loss · <b>{'required' if not sl_ready else sl}</b>\n"
f"✅ Take Profit · {tp}\n"
f"✅ Max Loss · {ml}"
)
else:
risk_controls_block = (
"<b>Защита позиции:</b>\n"
f"✅ Stop Loss · {sl}\n"
f"✅ Take Profit · {tp}\n"
f"✅ Max Loss · {ml}"
)
config_status = (
"Все параметры настроены"
if is_configured
else " Настрой все параметры"
else " Настрой все параметры"
)
text = (
"<b>🤖 Автоторговля</b>\n\n"
"<b>СИСТЕМА</b> · Настройки\n\n"
f"{strategy_icon} Стратегия: {strategy}\n"
f"{symbol_icon} Инструмент: {symbol}\n"
f"{risk_icon} Риск на сделку: {risk}\n"
f"{leverage_icon} Плечо: {leverage}\n\n"
f"Max Reserved: {max_reserved}\n"
f"✅ Risk Controls: {risk_controls}\n\n"
f"{strategy_icon} Стратегия: <b>{strategy}</b>\n"
f"{symbol_icon} Актив: <b>{symbol}</b>\n"
f"{risk_icon} Риск на сделку: <b>{risk}</b>\n"
f"{leverage_icon} Плечо: <b>{leverage}</b>\n\n"
f"Лимит на сделку: <b>{max_reserved}</b>\n\n"
f"{risk_controls_block}\n\n"
f"{config_status}"
)
if not is_configured:
text += "\n\nВыберите настройку:"
builder = InlineKeyboardBuilder()
builder.button(text="🧠 Стратегия", callback_data="settings:auto_strategy")
builder.button(text="📈 Инструмент", callback_data="settings:auto_symbol")
builder.button(text="🛡️ Риск на сделку", callback_data="settings:auto_risk")
builder.button(text="💱 Актив", callback_data="settings:auto_symbol")
builder.button(text="⚙️ Плечо", callback_data="settings:auto_leverage")
builder.button(text="⚠️ Risk Controls", callback_data="auto:risk")
builder.button(text="🏦 Max Reserved", callback_data="settings:auto_max_reserved")
builder.button(text="🏦 Лимит", callback_data="settings:auto_max_reserved")
builder.button(text="🛡️ Риск", callback_data="settings:auto_risk")
builder.button(text="🧯 Защита", callback_data="auto:risk")
builder.button(text="🤖 Автоторговля", callback_data="auto:home")
builder.button(text="⬅️ Назад", callback_data="system:management")
builder.adjust(2, 2, 2, 2)
@@ -294,17 +347,36 @@ async def open_auto_symbol_settings(callback: CallbackQuery) -> None:
settings = load_settings()
text = (
"<b>📈 Инструмент</b>\n\n"
"<b>💱 Актив</b>\n\n"
"<b>СИСТЕМА</b> · Настройки · Автоторговля\n\n"
"Выберите инструмент:"
"Выберите актив:"
)
builder = InlineKeyboardBuilder()
builder.button(text=settings.default_symbol, callback_data=f"settings:auto_symbol:{settings.default_symbol}")
builder.button(text="BTCUSDT", callback_data="settings:auto_symbol:BTCUSDT")
builder.button(text="ETHUSDT", callback_data="settings:auto_symbol:ETHUSDT")
builder.button(
text="BTC",
callback_data="settings:auto_symbol:BTC/USD_LEVERAGE",
)
builder.button(
text="ETH",
callback_data="settings:auto_symbol:ETH/USD_LEVERAGE",
)
builder.button(
text="LTC",
callback_data="settings:auto_symbol:LTC/USD_LEVERAGE",
)
builder.button(
text="XRP",
callback_data="settings:auto_symbol:XRP/USD_LEVERAGE",
)
builder.button(text="⬅️ Назад", callback_data="settings:auto")
builder.adjust(1, 2, 1)
builder.adjust(2, 2, 1)
await callback.message.edit_text(text, reply_markup=builder.as_markup())
await callback.answer()
@@ -319,7 +391,7 @@ async def set_auto_symbol(callback: CallbackQuery) -> None:
await open_auto_settings(callback)
AutoTradeRunner.set_current_screen("settings_auto")
await callback.answer("Инструмент обновлён")
await callback.answer("Актив обновлён")
@router.callback_query(F.data == "settings:auto_risk")
@@ -330,7 +402,7 @@ async def open_auto_risk_settings(callback: CallbackQuery) -> None:
return
text = (
"<b>🛡️ Риск</b>\n\n"
"<b>🛡️ Риск на сделку</b>\n\n"
"<b>СИСТЕМА</b> · Настройки · Автоторговля\n\n"
"Выберите риск на сделку:"
)
@@ -407,7 +479,7 @@ async def open_trade_settings(callback: CallbackQuery) -> None:
text = (
"<b>💹 Торговля</b>\n\n"
"<b>СИСТЕМА</b> · Настройки\n\n"
"Инструмент: —\n"
"Актив: —\n"
"Тип ордера по умолчанию: —\n"
"Пресеты количества: —\n\n"
"В разработке."
@@ -618,7 +690,7 @@ async def open_system_about(callback: CallbackQuery) -> None:
reply_markup=builder.as_markup(),
)
await callback.answer()
@router.callback_query(F.data == "settings:auto_max_reserved")
async def open_auto_max_reserved_settings(callback: CallbackQuery) -> None:
@@ -629,7 +701,7 @@ async def open_auto_max_reserved_settings(callback: CallbackQuery) -> None:
return
text = (
"<b>🏦 Max Reserved</b>\n\n"
"<b>🏦 Лимит на сделку</b>\n\n"
"<b>СИСТЕМА</b> · Настройки · Автоторговля\n\n"
"Максимальная доля баланса, которую можно зарезервировать под позицию:"
)