diff --git a/src/risk_engine/isolated_margin.rs b/src/risk_engine/isolated_margin.rs index 1bec905..8461955 100644 --- a/src/risk_engine/isolated_margin.rs +++ b/src/risk_engine/isolated_margin.rs @@ -74,12 +74,20 @@ where ) -> Result<(), NotEnoughAvailableBalance> { let om = account.order_margin(); let new_order_margin = account.order_margin_with_order(order); + let maker_fee = (*self.contract_spec.fee_maker().as_ref()).max(Zero::zero()); + let pending_fees = account + .active_limit_orders() + .iter() + .fold(BaseOrQuote::PairedCurrency::zero(), |fees, order| { + fees + order.notional() * maker_fee + }) + + order.notional() * maker_fee; let available_balance = account.available_balance(); trace!( - "order_margin: {om:?}, new_order_margin: {new_order_margin:?}, available_balance: {available_balance:?}" + "order_margin: {om:?}, new_order_margin: {new_order_margin:?}, pending_fees: {pending_fees:?}, available_balance: {available_balance:?}" ); - if new_order_margin > available_balance + om { + if new_order_margin + pending_fees > available_balance + om { return Err(NotEnoughAvailableBalance); } diff --git a/src/tests/amend.rs b/src/tests/amend.rs index 4c170fd..1aafd23 100644 --- a/src/tests/amend.rs +++ b/src/tests/amend.rs @@ -7,7 +7,7 @@ use crate::{ }; #[tracing_test::traced_test] -#[test_matrix([BaseCurrency::new(1, 0), BaseCurrency::new(3, 0), BaseCurrency::new(5, 0), BaseCurrency::new(10, 0)])] +#[test_matrix([BaseCurrency::new(1, 0), BaseCurrency::new(3, 0), BaseCurrency::new(5, 0)])] fn amend_limit_order_qty(new_qty: BaseCurrency) { let mut exchange = mock_exchange_linear(); diff --git a/src/tests/submit_limit_buy_order.rs b/src/tests/submit_limit_buy_order.rs index 079d888..69bf801 100644 --- a/src/tests/submit_limit_buy_order.rs +++ b/src/tests/submit_limit_buy_order.rs @@ -206,7 +206,10 @@ fn submit_limit_buy_order_no_position_max() { BaseCurrency::new(1, 0), ) .unwrap(); - exchange.submit_limit_order(order.clone()).unwrap(); + assert_eq!( + exchange.submit_limit_order(order), + Err(NotEnoughAvailableBalance.into()) + ); let order = LimitOrder::new( Side::Sell, diff --git a/src/tests/submit_limit_sell_order.rs b/src/tests/submit_limit_sell_order.rs index 784774a..5c02254 100644 --- a/src/tests/submit_limit_sell_order.rs +++ b/src/tests/submit_limit_sell_order.rs @@ -154,7 +154,10 @@ fn submit_limit_sell_order_no_position_max() { BaseCurrency::new(1, 0), ) .unwrap(); - exchange.submit_limit_order(order.clone()).unwrap(); + assert_eq!( + exchange.submit_limit_order(order), + Err(NotEnoughAvailableBalance.into()) + ); let order = LimitOrder::new( Side::Buy,