kiteticker_async_manager/models/
order.rs

1use chrono::{DateTime, NaiveDateTime, Utc};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4use serde_with::{serde_as, DefaultOnNull};
5
6use crate::Exchange;
7
8#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd)]
9#[serde(rename_all = "UPPERCASE")]
10pub enum OrderTransactionType {
11  Buy,
12  Sell,
13}
14
15#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd)]
16pub enum OrderValidity {
17  DAY,
18  IOC,
19  TTL,
20}
21
22#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd)]
23#[serde(rename_all = "UPPERCASE")]
24pub enum OrderStatus {
25  COMPLETE,
26  REJECTED,
27  CANCELLED,
28  UPDATE,
29}
30
31#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd)]
32#[serde(transparent)]
33pub struct TimeStamp(i64);
34
35impl From<String> for TimeStamp {
36  fn from(value: String) -> Self {
37    let secs = NaiveDateTime::parse_from_str(&value, "%Y-%m-%d %H:%M:%S")
38      .unwrap()
39      .and_utc()
40      .timestamp();
41    TimeStamp(secs)
42  }
43}
44
45impl From<TimeStamp> for String {
46  fn from(value: TimeStamp) -> Self {
47    DateTime::<Utc>::from_timestamp(value.0, 0)
48      .unwrap_or_default()
49      .naive_utc()
50      .format("%Y-%m-%d %H:%M:%S")
51      .to_string()
52  }
53}
54
55#[serde_with::serde_as]
56#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
57pub struct Order {
58  pub order_id: String,
59
60  #[serde_as(as = "DefaultOnNull")]
61  pub exchange_order_id: Option<String>,
62
63  #[serde_as(as = "DefaultOnNull")]
64  pub parent_order_id: Option<String>,
65
66  pub placed_by: String,
67  pub app_id: u64,
68
69  pub status: OrderStatus,
70
71  #[serde_as(as = "DefaultOnNull")]
72  pub status_message: Option<String>,
73
74  #[serde_as(as = "DefaultOnNull")]
75  pub status_message_raw: Option<String>,
76
77  pub tradingsymbol: String,
78  pub instrument_token: u32,
79
80  #[serde_as(as = "serde_with::FromInto<String>")]
81  pub exchange: Exchange,
82
83  pub order_type: String,
84  pub transaction_type: OrderTransactionType,
85
86  pub validity: OrderValidity,
87  pub variety: String,
88  pub product: Option<String>,
89
90  #[serde(default)]
91  pub average_price: f64,
92
93  #[serde(default)]
94  pub disclosed_quantity: f64,
95
96  pub price: f64,
97  pub quantity: u64,
98  pub filled_quantity: u64,
99
100  #[serde(default)]
101  pub unfilled_quantity: u64,
102
103  #[serde(default)]
104  pub pending_quantity: u64,
105
106  #[serde(default)]
107  pub cancelled_quantity: u64,
108
109  #[serde(default)]
110  pub trigger_price: f64,
111
112  pub user_id: String,
113
114  #[serde_as(as = "serde_with::FromInto<String>")]
115  pub order_timestamp: TimeStamp,
116  #[serde_as(as = "serde_with::FromInto<String>")]
117  pub exchange_timestamp: TimeStamp,
118  #[serde_as(as = "serde_with::FromInto<String>")]
119  pub exchange_update_timestamp: TimeStamp,
120
121  pub checksum: String,
122  #[serde(default)]
123  pub meta: Option<serde_json::Map<String, Value>>,
124
125  #[serde_as(as = "DefaultOnNull")]
126  #[serde(default)]
127  pub tag: Option<String>,
128}