Liquidation logic
Describes the logic used for liquidations, and handling liquidation cascades
Liquidation Trigger Condition
fn is_liquidatable(account, markets) -> bool {
let equity = calculate_equity(account, markets)
let maintenance = calculate_maintenance_margin(account, markets)
let reserved = account.reserved_margin.max(0)
equity < maintenance + reserved
}Liquidation Detection Process
fn check_liquidations(state, mark_prices) -> Vec<Order> {
let mut liquidation_orders = Vec::new()
let mut liquidation_id = 1 << 63 // Bit 63 marks liquidation orders
for (account_id, account) in state.margin_accounts {
let equity = calculate_equity(account, markets)
let maintenance = calculate_maintenance_margin(account, markets)
if equity >= maintenance + reserved {
continue // Account is healthy
}
// Generate liquidation orders for all positions
for (market_id, position) in account.positions {
if position.base_position == 0 {
continue
}
liquidation_orders.push(Order {
order_id: OrderId(liquidation_id),
market_id,
account_id,
side: if position.base_position > 0 { Sell } else { Buy },
price: mark_price,
quantity: abs(position.base_position),
timestamp: mark_price_timestamp,
})
liquidation_id += 1
}
}
liquidation_orders
}Liquidation Order Properties
Property
Value
Reason
Liquidation Execution Flow
PnL Realization on Liquidation
Fill Classification
Last updated