1use crate::constant::Exchange;
4use crate::time::DtNs;
5
6#[derive(Debug, Clone, PartialEq, Default)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub struct TickData {
12 pub gateway_name: String,
14 pub symbol: String,
16 pub exchange: Exchange,
18 pub datetime: DtNs,
20
21 pub trading_day: Option<i32>,
23 pub action_day: Option<i32>,
25 pub update_time: String,
27 pub update_millisec: i64,
29
30 pub name: String,
32 pub volume: f64,
34 pub turnover: f64,
36 pub open_interest: f64,
38 pub last_price: f64,
40 pub last_volume: f64,
42 pub limit_up: f64,
44 pub limit_down: f64,
46
47 pub open_price: f64,
49 pub high_price: f64,
51 pub low_price: f64,
53 pub pre_close: f64,
55 pub pct_change: f64,
57
58 pub bid_price_1: f64,
60 pub bid_price_2: f64,
62 pub bid_price_3: f64,
64 pub bid_price_4: f64,
66 pub bid_price_5: f64,
68
69 pub ask_price_1: f64,
71 pub ask_price_2: f64,
73 pub ask_price_3: f64,
75 pub ask_price_4: f64,
77 pub ask_price_5: f64,
79
80 pub bid_volume_1: f64,
82 pub bid_volume_2: f64,
84 pub bid_volume_3: f64,
86 pub bid_volume_4: f64,
88 pub bid_volume_5: f64,
90
91 pub ask_volume_1: f64,
93 pub ask_volume_2: f64,
95 pub ask_volume_3: f64,
97 pub ask_volume_4: f64,
99 pub ask_volume_5: f64,
101
102 pub localtime: Option<DtNs>,
104}
105
106impl TickData {
107 pub fn en_symbol(&self) -> String {
109 let mut buf = String::with_capacity(self.exchange.as_str().len() + 1 + self.symbol.len());
110 self.en_symbol_into(&mut buf);
111 buf
112 }
113
114 pub fn en_symbol_into(&self, buf: &mut String) {
116 crate::symbol::write_vt_symbol(buf, &self.symbol, self.exchange);
117 }
118
119 pub fn reach_limit_up(&self, diff_price: f64) -> bool {
125 self.bid_price_1 + diff_price >= self.limit_up
126 }
127
128 pub fn reach_limit_down(&self, diff_price: f64) -> bool {
130 self.ask_price_1 - diff_price <= self.limit_down
131 }
132
133 pub fn reach_limit(&self, diff_price: f64) -> bool {
135 self.reach_limit_up(diff_price) || self.reach_limit_down(diff_price)
136 }
137}