kiteticker_async_manager/models/
order.rs1use 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}