debot_db/
trading_strategy.rs1use 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 (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 (TradingStrategy::Rebalance, TradingStrategy::Rebalance) => true,
63
64 (TradingStrategy::MarketMake, TradingStrategy::MarketMake) => true,
66
67 (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 (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 (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 (
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 (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 (
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}