Skip to main content

hypercall_margin/standard/
params.rs

1use rust_decimal::Decimal;
2use rust_decimal_macros::dec;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct StandardMarginParams {
7    pub perp_im_pct: Decimal,
8    pub perp_mm_pct: Decimal,
9    pub short_option_spot_pct: Decimal,
10    pub short_call_im_floor_pct: Decimal,
11    pub short_put_im_floor_pct: Decimal,
12    pub short_call_mm_pct: Decimal,
13    pub short_put_mm_pct: Decimal,
14}
15
16impl Default for StandardMarginParams {
17    fn default() -> Self {
18        Self {
19            perp_im_pct: dec!(0.10),
20            perp_mm_pct: dec!(0.05),
21            short_option_spot_pct: dec!(0.15),
22            short_call_im_floor_pct: dec!(0.10),
23            short_put_im_floor_pct: dec!(0.10),
24            short_call_mm_pct: dec!(0.06),
25            short_put_mm_pct: dec!(0.06),
26        }
27    }
28}
29
30impl StandardMarginParams {
31    pub fn short_im_floor_pct(&self, is_call: bool) -> Decimal {
32        if is_call {
33            self.short_call_im_floor_pct
34        } else {
35            self.short_put_im_floor_pct
36        }
37    }
38
39    pub fn short_mm_pct(&self, is_call: bool) -> Decimal {
40        if is_call {
41            self.short_call_mm_pct
42        } else {
43            self.short_put_mm_pct
44        }
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_default_params() {
54        let params = StandardMarginParams::default();
55        assert_eq!(params.perp_im_pct, dec!(0.10));
56        assert_eq!(params.perp_mm_pct, dec!(0.05));
57        assert_eq!(params.short_option_spot_pct, dec!(0.15));
58        assert_eq!(params.short_call_im_floor_pct, dec!(0.10));
59        assert_eq!(params.short_put_im_floor_pct, dec!(0.10));
60        assert_eq!(params.short_call_mm_pct, dec!(0.06));
61        assert_eq!(params.short_put_mm_pct, dec!(0.06));
62    }
63
64    #[test]
65    fn test_short_im_floor_pct() {
66        let params = StandardMarginParams::default();
67        assert_eq!(params.short_im_floor_pct(true), dec!(0.10));
68        assert_eq!(params.short_im_floor_pct(false), dec!(0.10));
69    }
70
71    #[test]
72    fn test_short_mm_pct() {
73        let params = StandardMarginParams::default();
74        assert_eq!(params.short_mm_pct(true), dec!(0.06));
75        assert_eq!(params.short_mm_pct(false), dec!(0.06));
76    }
77}