Add explicit trade sizing
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user