exc_types/trading/
order.rs

1use std::collections::HashMap;
2
3use positions::{prelude::Str, Asset};
4use rust_decimal::Decimal;
5
6use super::place::Place;
7
8/// Time in force.
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum TimeInForce {
11    /// Good-Til-Cancelled.
12    GoodTilCancelled,
13    /// Fill-Or-Kill.
14    FillOrKill,
15    /// Immediate-Or-Cancel.
16    ImmediateOrCancel,
17}
18
19impl Default for TimeInForce {
20    fn default() -> Self {
21        Self::GoodTilCancelled
22    }
23}
24
25/// Order types.
26#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub enum OrderKind {
28    /// Market.
29    Market,
30    /// Limit.
31    Limit(Decimal, TimeInForce),
32    /// Post-Only.
33    PostOnly(Decimal),
34}
35
36/// Order Status.
37#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38pub enum OrderStatus {
39    /// Pending.
40    Pending,
41    /// Finished.
42    Finished,
43    /// Unknown.
44    Unknown,
45}
46
47/// Order State.
48#[derive(Debug, Clone, PartialEq, Eq)]
49pub struct OrderState {
50    /// Filled size.
51    pub filled: Decimal,
52    /// Average cost.
53    pub cost: Decimal,
54    /// Status.
55    pub status: OrderStatus,
56    /// Fees.
57    pub fees: HashMap<Asset, Decimal>,
58}
59
60impl Default for OrderState {
61    fn default() -> Self {
62        Self {
63            filled: Decimal::ZERO,
64            cost: Decimal::ONE,
65            status: OrderStatus::Pending,
66            fees: HashMap::default(),
67        }
68    }
69}
70
71/// Order.
72#[derive(Debug, Clone)]
73pub struct Order {
74    /// Id.
75    pub id: OrderId,
76    /// The target of the order.
77    pub target: Place,
78    /// Current state.
79    pub state: OrderState,
80    /// Trade.
81    pub trade: Option<OrderTrade>,
82}
83
84impl Order {
85    /// Create a new [`Order`].
86    pub fn new(id: OrderId, target: Place) -> Self {
87        Self {
88            id,
89            target,
90            state: OrderState::default(),
91            trade: None,
92        }
93    }
94
95    /// Change the state.
96    pub fn with_state(&mut self, state: OrderState) -> &mut Self {
97        self.state = state;
98        self
99    }
100}
101
102/// Order identity.
103#[derive(Debug, Clone, PartialEq, Eq)]
104pub struct OrderId {
105    inner: Str,
106}
107
108impl From<String> for OrderId {
109    fn from(inner: String) -> Self {
110        Self {
111            inner: Str::new(inner),
112        }
113    }
114}
115
116impl From<Str> for OrderId {
117    fn from(inner: Str) -> Self {
118        Self { inner }
119    }
120}
121
122impl OrderId {
123    /// Convert to [`&str`]
124    pub fn as_str(&self) -> &str {
125        self.inner.as_str()
126    }
127
128    /// Convert to smol str.
129    pub fn as_smol_str(&self) -> &Str {
130        &self.inner
131    }
132}
133
134/// Order trade.
135#[derive(Debug, Clone)]
136pub struct OrderTrade {
137    /// Price.
138    pub price: Decimal,
139    /// Size.
140    pub size: Decimal,
141    /// Fee.
142    pub fee: Decimal,
143    /// Fee asset.
144    pub fee_asset: Option<Asset>,
145}