nautilus_model/accounts/
stubs.rs1use rstest::fixture;
20
21use crate::{
22 accounts::{Account, AccountAny, CashAccount, MarginAccount},
23 enums::{AccountType, LiquiditySide},
24 events::account::{state::AccountState, stubs::*},
25 identifiers::stubs::{account_id, uuid4},
26 instruments::InstrumentAny,
27 types::{AccountBalance, Currency, Money, Price, Quantity},
28};
29
30impl Default for CashAccount {
31 fn default() -> Self {
33 let init_event = AccountState::new(
35 account_id(),
36 AccountType::Cash,
37 vec![AccountBalance::new(
38 Money::from("1000000 USD"),
39 Money::from("0 USD"),
40 Money::from("1000000 USD"),
41 )],
42 vec![],
43 true,
44 uuid4(),
45 0.into(),
46 0.into(),
47 Some(Currency::USD()),
48 );
49 Self::new(init_event, false, false)
50 }
51}
52
53impl Default for AccountAny {
54 fn default() -> Self {
56 Self::Cash(CashAccount::default())
57 }
58}
59
60#[fixture]
61pub fn margin_account(margin_account_state: AccountState) -> MarginAccount {
62 MarginAccount::new(margin_account_state, true)
63}
64
65#[fixture]
66pub fn cash_account(cash_account_state: AccountState) -> CashAccount {
67 CashAccount::new(cash_account_state, true, false)
68}
69
70#[fixture]
71pub fn cash_account_million_usd(cash_account_state_million_usd: AccountState) -> CashAccount {
72 CashAccount::new(cash_account_state_million_usd, true, false)
73}
74
75#[fixture]
76pub fn cash_account_multi(cash_account_state_multi: AccountState) -> CashAccount {
77 CashAccount::new(cash_account_state_multi, true, false)
78}
79
80#[fixture]
81pub fn cash_account_borrowing(cash_account_state: AccountState) -> CashAccount {
82 CashAccount::new(cash_account_state, true, true)
83}
84
85#[fixture]
86pub fn cash_account_borrowing_million_usd(
87 cash_account_state_million_usd: AccountState,
88) -> CashAccount {
89 CashAccount::new(cash_account_state_million_usd, true, true)
90}
91
92#[must_use]
98pub fn calculate_commission(
99 instrument: InstrumentAny,
100 quantity: Quantity,
101 price: Price,
102 currency: Option<Currency>,
103) -> Money {
104 let account_state = if Some(Currency::USDT()) == currency {
105 cash_account_state_million_usdt()
106 } else {
107 cash_account_state_million_usd("1000000 USD", "0 USD", "1000000 USD")
108 };
109 let account = cash_account_million_usd(account_state);
110 account
111 .calculate_commission(instrument, quantity, price, LiquiditySide::Taker, None)
112 .unwrap()
113}