exc_types/trading/
order.rs1use std::collections::HashMap;
2
3use positions::{prelude::Str, Asset};
4use rust_decimal::Decimal;
5
6use super::place::Place;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum TimeInForce {
11 GoodTilCancelled,
13 FillOrKill,
15 ImmediateOrCancel,
17}
18
19impl Default for TimeInForce {
20 fn default() -> Self {
21 Self::GoodTilCancelled
22 }
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub enum OrderKind {
28 Market,
30 Limit(Decimal, TimeInForce),
32 PostOnly(Decimal),
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38pub enum OrderStatus {
39 Pending,
41 Finished,
43 Unknown,
45}
46
47#[derive(Debug, Clone, PartialEq, Eq)]
49pub struct OrderState {
50 pub filled: Decimal,
52 pub cost: Decimal,
54 pub status: OrderStatus,
56 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#[derive(Debug, Clone)]
73pub struct Order {
74 pub id: OrderId,
76 pub target: Place,
78 pub state: OrderState,
80 pub trade: Option<OrderTrade>,
82}
83
84impl Order {
85 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 pub fn with_state(&mut self, state: OrderState) -> &mut Self {
97 self.state = state;
98 self
99 }
100}
101
102#[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 pub fn as_str(&self) -> &str {
125 self.inner.as_str()
126 }
127
128 pub fn as_smol_str(&self) -> &Str {
130 &self.inner
131 }
132}
133
134#[derive(Debug, Clone)]
136pub struct OrderTrade {
137 pub price: Decimal,
139 pub size: Decimal,
141 pub fee: Decimal,
143 pub fee_asset: Option<Asset>,
145}