three_commas_types/
bots.rs

1mod deals;
2mod stats;
3
4use crate::Pair;
5use rust_decimal::Decimal;
6use serde::Deserialize;
7
8pub use deals::{Deal, DealStatus};
9pub use stats::{BotStats, TokenValues};
10
11#[derive(Debug, Deserialize, Clone)]
12pub struct Bot {
13  pub name: String,
14  pub id: usize,
15  pub account_id: usize,
16  pub is_enabled: bool,
17  pub max_safety_orders: usize,
18  pub max_active_deals: usize,
19  pub base_order_volume: Decimal,
20  pub safety_order_volume: Decimal,
21  pub safety_order_step_percentage: Decimal,
22  pub martingale_volume_coefficient: Decimal,
23  pub martingale_step_coefficient: Decimal,
24  pub pairs: Vec<Pair>,
25}
26
27impl Bot {
28  pub fn name(&self) -> &str {
29    &*self.name
30  }
31
32  pub fn id(&self) -> usize {
33    self.id
34  }
35
36  pub fn account_id(&self) -> usize {
37    self.account_id
38  }
39
40  pub fn is_enabled(&self) -> bool {
41    self.is_enabled
42  }
43
44  pub fn pairs(&self) -> &[Pair] {
45    &self.pairs
46  }
47
48  pub fn base_order_volume(&self) -> Decimal {
49    self.base_order_volume
50  }
51
52  pub fn safety_order_volume(&self) -> Decimal {
53    self.safety_order_volume
54  }
55
56  pub fn max_safety_orders(&self) -> usize {
57    self.max_safety_orders
58  }
59
60  pub fn max_active_deals(&self) -> usize {
61    self.max_active_deals
62  }
63
64  pub fn max_budget_per_deal(&self) -> Decimal {
65    let mut result = self.base_order_volume;
66    let mut next = self.safety_order_volume;
67    for _ in 0..self.max_safety_orders {
68      result += next;
69      next *= self.martingale_volume_coefficient;
70    }
71
72    result
73  }
74
75  pub fn max_budget(&self) -> Decimal {
76    self.max_budget_per_deal() * Decimal::from(self.max_active_deals)
77  }
78}