Add explicit trade sizing

This commit is contained in:
Azimkin
2026-09-22 14:15:00 +02:00
parent 7b632c9640
commit c9d197031e
8 changed files with 213 additions and 20 deletions

View File

@@ -23,6 +23,8 @@ class OrderValidator:
request: OpenTradeRequest,
account: AccountSnapshot,
instrument: InstrumentRules,
quote_notional: Decimal | None = None,
available_balance_percent: Decimal | None = None,
) -> ValidatedOrder:
if account.equity <= 0:
raise OrderRejected("Account equity must be positive")
@@ -38,8 +40,27 @@ class OrderValidator:
if leverage < 1 or leverage > instrument.max_leverage:
raise OrderRejected(f"Leverage must be between 1 and {instrument.max_leverage}")
buying_power = account.available_balance * leverage
quantity = buying_power / entry
if quote_notional is not None and available_balance_percent is not None:
raise OrderRejected("Set either quote_notional or available_balance_percent, not both")
if quote_notional is not None and quote_notional <= 0:
raise OrderRejected("quote_notional must be positive")
if available_balance_percent is not None and not 0 < available_balance_percent <= 100:
raise OrderRejected("available_balance_percent must be in (0, 100]")
maximum_notional = account.available_balance * leverage
if quote_notional is not None:
requested_notional = quote_notional
elif available_balance_percent is not None:
requested_notional = maximum_notional * available_balance_percent / Decimal(100)
else:
requested_notional = maximum_notional
if requested_notional > maximum_notional:
raise OrderRejected(
f"Requested quote notional {requested_notional} exceeds available buying power "
f"{maximum_notional} (available_balance={account.available_balance}, leverage={leverage})"
)
quantity = requested_notional / entry
quantity = _round_down(quantity, instrument.qty_step)
notional = quantity * entry
if quantity < instrument.min_qty: