debot_db/
trading_strategy.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize)]
4pub enum TrendType {
5    Up,
6    Down,
7    Any,
8}
9
10#[derive(Clone, Copy, Debug, Eq, Hash, Serialize, Deserialize)]
11pub enum TradingStrategy {
12    MarketMake,
13    Inago(TrendType),
14    MeanReversion(TrendType),
15    PidController(TrendType),
16    RandomInago(TrendType),
17    RandomMeanReversion(TrendType),
18    RandomPidController(TrendType),
19    Hybrid,
20    Rebalance,
21}
22
23impl TradingStrategy {
24    pub fn is_market_make(&self) -> bool {
25        matches!(self, TradingStrategy::MarketMake)
26    }
27
28    pub fn trend_type(&self) -> &TrendType {
29        match self {
30            TradingStrategy::Inago(t)
31            | TradingStrategy::MeanReversion(t)
32            | TradingStrategy::PidController(t)
33            | TradingStrategy::RandomInago(t)
34            | TradingStrategy::RandomMeanReversion(t)
35            | TradingStrategy::RandomPidController(t) => t,
36            TradingStrategy::Hybrid | TradingStrategy::Rebalance | TradingStrategy::MarketMake => {
37                &TrendType::Any
38            }
39        }
40    }
41}
42
43impl PartialEq for TradingStrategy {
44    fn eq(&self, other: &Self) -> bool {
45        match (self, other) {
46            // Hybrid matches specific trends of Inago, MeanReversion, and PidController
47            (TradingStrategy::Hybrid, TradingStrategy::Inago(TrendType::Up))
48            | (TradingStrategy::Hybrid, TradingStrategy::Inago(TrendType::Down))
49            | (TradingStrategy::Hybrid, TradingStrategy::MeanReversion(TrendType::Up))
50            | (TradingStrategy::Hybrid, TradingStrategy::MeanReversion(TrendType::Down))
51            | (TradingStrategy::Hybrid, TradingStrategy::PidController(TrendType::Up))
52            | (TradingStrategy::Hybrid, TradingStrategy::PidController(TrendType::Down))
53            | (TradingStrategy::Inago(TrendType::Up), TradingStrategy::Hybrid)
54            | (TradingStrategy::Inago(TrendType::Down), TradingStrategy::Hybrid)
55            | (TradingStrategy::MeanReversion(TrendType::Up), TradingStrategy::Hybrid)
56            | (TradingStrategy::MeanReversion(TrendType::Down), TradingStrategy::Hybrid)
57            | (TradingStrategy::PidController(TrendType::Up), TradingStrategy::Hybrid)
58            | (TradingStrategy::PidController(TrendType::Down), TradingStrategy::Hybrid)
59            | (TradingStrategy::Hybrid, TradingStrategy::Hybrid) => true,
60
61            // Rebalance equals itself only
62            (TradingStrategy::Rebalance, TradingStrategy::Rebalance) => true,
63
64            // MarketMake
65            (TradingStrategy::MarketMake, TradingStrategy::MarketMake) => true,
66
67            // Inago
68            (TradingStrategy::Inago(TrendType::Any), TradingStrategy::Inago(_))
69            | (TradingStrategy::Inago(_), TradingStrategy::Inago(TrendType::Any)) => true,
70            (TradingStrategy::Inago(t1), TradingStrategy::Inago(t2)) if t1 == t2 => true,
71
72            // MeanReversion
73            (TradingStrategy::MeanReversion(TrendType::Any), TradingStrategy::MeanReversion(_))
74            | (TradingStrategy::MeanReversion(_), TradingStrategy::MeanReversion(TrendType::Any)) => {
75                true
76            }
77            (TradingStrategy::MeanReversion(t1), TradingStrategy::MeanReversion(t2))
78                if t1 == t2 =>
79            {
80                true
81            }
82
83            // RandomInago
84            (TradingStrategy::RandomInago(TrendType::Any), TradingStrategy::RandomInago(_))
85            | (TradingStrategy::RandomInago(_), TradingStrategy::RandomInago(TrendType::Any)) => {
86                true
87            }
88            (TradingStrategy::RandomInago(t1), TradingStrategy::RandomInago(t2)) if t1 == t2 => {
89                true
90            }
91
92            // RandomMeanReversion
93            (
94                TradingStrategy::RandomMeanReversion(TrendType::Any),
95                TradingStrategy::RandomMeanReversion(_),
96            )
97            | (
98                TradingStrategy::RandomMeanReversion(_),
99                TradingStrategy::RandomMeanReversion(TrendType::Any),
100            ) => true,
101            (
102                TradingStrategy::RandomMeanReversion(t1),
103                TradingStrategy::RandomMeanReversion(t2),
104            ) if t1 == t2 => true,
105
106            // PidController
107            (TradingStrategy::PidController(TrendType::Any), TradingStrategy::PidController(_))
108            | (TradingStrategy::PidController(_), TradingStrategy::PidController(TrendType::Any)) => {
109                true
110            }
111            (TradingStrategy::PidController(t1), TradingStrategy::PidController(t2))
112                if t1 == t2 =>
113            {
114                true
115            }
116
117            // RandomPidController
118            (
119                TradingStrategy::RandomPidController(TrendType::Any),
120                TradingStrategy::RandomPidController(_),
121            )
122            | (
123                TradingStrategy::RandomPidController(_),
124                TradingStrategy::RandomPidController(TrendType::Any),
125            ) => true,
126            (
127                TradingStrategy::RandomPidController(t1),
128                TradingStrategy::RandomPidController(t2),
129            ) if t1 == t2 => true,
130
131            _ => false,
132        }
133    }
134}