Stage 05.7 - trade draft UI restructuring and order context display
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"]),
|
||||
|
||||
Reference in New Issue
Block a user