07.4.3.14 — Auto Trading UI. Realistic Pricing & Debug Live Tools
This commit is contained in:
@@ -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"
|
||||
"Максимальная доля баланса, которую можно зарезервировать под позицию:"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user