Stage 05.7 - trade draft UI restructuring and order context display

This commit is contained in:
2026-04-19 15:43:22 +03:00
parent 39b35d742a
commit cec7c761be
21 changed files with 2030 additions and 1243 deletions

View File

@@ -20,7 +20,9 @@ class OrderEntryContext:
symbol: str
side: str
order_type: str
base_currency: str
balance_currency: str
quote_currency: str
available_balance: float
reference_price: float
last_price: float

View File

@@ -181,15 +181,40 @@ class OrderDraftsService:
return self.repository.get_draft_by_id(draft_id)
def get_entry_context(self, *, side: str, order_type: str) -> OrderEntryContext:
# Собираем контекст экрана ввода ордера на основе биржевых правил,
# текущего рынка и доступного баланса.
validation = self.exchange.validate_symbol(self.settings.default_symbol)
if not validation.is_valid or validation.symbol_info is None:
raise ValueError(validation.message)
symbol_info = validation.symbol_info
balances = self.exchange.get_balance_summary()
market = self.exchange.get_market_snapshot(self.settings.default_symbol)
base_asset = validation.symbol_info.base_asset or "BASE"
quote_asset = validation.symbol_info.quote_asset or "QUOTE"
base_asset = (symbol_info.base_asset or "").strip()
quote_asset = (symbol_info.quote_asset or "").strip()
if not base_asset or not quote_asset:
message = (
"Биржа не вернула base/quote валюту для инструмента. "
"Невозможно корректно рассчитать контекст ордера."
)
try:
self.journal.log_error(
"order_entry_context_assets_missing",
message,
{
"symbol": self.settings.default_symbol,
"base_asset": base_asset or None,
"quote_asset": quote_asset or None,
},
)
except Exception:
pass
raise ValueError(message)
base_currency = base_asset.upper()
quote_currency = quote_asset.upper()
available_by_currency = {
item.currency.upper(): float(item.available)
@@ -200,12 +225,12 @@ class OrderDraftsService:
order_type_upper = order_type.upper()
if side_upper == "BUY":
balance_currency = quote_asset.upper()
balance_currency = quote_currency
available_balance = available_by_currency.get(balance_currency, 0.0)
reference_price = float(market["ask_price"])
max_qty = (available_balance / reference_price) if reference_price > 0 else 0.0
else:
balance_currency = base_asset.upper()
balance_currency = base_currency
available_balance = available_by_currency.get(balance_currency, 0.0)
reference_price = float(market["bid_price"])
max_qty = available_balance
@@ -213,14 +238,16 @@ class OrderDraftsService:
quantity_presets = self._build_quantity_presets(
max_qty=max_qty,
reference_price=reference_price,
symbol_info=validation.symbol_info,
symbol_info=symbol_info,
)
return OrderEntryContext(
symbol=self.settings.default_symbol,
side=side_upper,
order_type=order_type_upper,
base_currency=base_currency,
balance_currency=balance_currency,
quote_currency=quote_currency,
available_balance=available_balance,
reference_price=reference_price,
last_price=float(market["last_price"]),