1#![allow(missing_docs)]
2
3use rust_decimal::Decimal;
4use serde::{Deserialize, Serialize};
5use time::OffsetDateTime;
6
7use crate::{types::Market, utils::counter::deserialize_counter_id_as_symbol};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct MarketStatusResponse {
14 pub market_time: Vec<MarketTimeItem>,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct MarketTimeItem {
21 pub market: Market,
23 pub trade_status: i32,
26 pub timestamp: String,
28 pub delay_trade_status: i32,
30 pub delay_timestamp: String,
32 pub sub_status: i32,
34 pub delay_sub_status: i32,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct BrokerHoldingTop {
43 pub buy: Vec<BrokerHoldingEntry>,
45 pub sell: Vec<BrokerHoldingEntry>,
47 #[serde(default)]
49 pub updated_at: String,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct BrokerHoldingEntry {
55 pub name: String,
57 pub parti_number: String,
59 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
61 pub chg: Option<Decimal>,
62 pub strong: bool,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct BrokerHoldingDetail {
71 pub list: Vec<BrokerHoldingDetailItem>,
73 #[serde(default)]
75 pub updated_at: String,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct BrokerHoldingDetailItem {
81 pub name: String,
83 pub parti_number: String,
85 pub ratio: BrokerHoldingChanges,
87 pub shares: BrokerHoldingChanges,
89 pub strong: bool,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct BrokerHoldingChanges {
96 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
98 pub value: Option<Decimal>,
99 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
101 pub chg_1: Option<Decimal>,
102 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
104 pub chg_5: Option<Decimal>,
105 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
107 pub chg_20: Option<Decimal>,
108 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
110 pub chg_60: Option<Decimal>,
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct BrokerHoldingDailyHistory {
118 pub list: Vec<BrokerHoldingDailyItem>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct BrokerHoldingDailyItem {
125 pub date: String,
127 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
129 pub holding: Option<Decimal>,
130 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
132 pub ratio: Option<Decimal>,
133 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
135 pub chg: Option<Decimal>,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
142pub struct AhPremiumKlines {
143 pub klines: Vec<AhPremiumKline>,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize)]
149pub struct AhPremiumIntraday {
150 pub klines: Vec<AhPremiumKline>,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct AhPremiumKline {
157 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
159 pub aprice: Decimal,
160 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
162 pub apreclose: Decimal,
163 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
165 pub hprice: Decimal,
166 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
168 pub hpreclose: Decimal,
169 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
171 pub currency_rate: Decimal,
172 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
174 pub ahpremium_rate: Decimal,
175 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
177 pub price_spread: Decimal,
178 #[serde(deserialize_with = "crate::serde_utils::deserialize_timestamp")]
180 pub timestamp: OffsetDateTime,
181}
182
183#[derive(Debug, Clone, Serialize, Deserialize)]
187pub struct TradeStatsResponse {
188 pub statistics: TradeStatistics,
190 pub trades: Vec<TradePriceLevel>,
192}
193
194#[derive(Debug, Clone, Serialize, Deserialize)]
196pub struct TradeStatistics {
197 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
199 pub avgprice: Decimal,
200 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
202 pub buy: Decimal,
203 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
205 pub neutral: Decimal,
206 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
208 pub preclose: Decimal,
209 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
211 pub sell: Decimal,
212 pub timestamp: String,
214 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
216 pub total_amount: Decimal,
217 pub trade_date: Vec<String>,
219 pub trades_count: String,
221}
222
223#[derive(Debug, Clone, Serialize, Deserialize)]
225pub struct TradePriceLevel {
226 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
228 pub buy_amount: Decimal,
229 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
231 pub neutral_amount: Decimal,
232 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
234 pub price: Decimal,
235 #[serde(with = "crate::serde_utils::decimal_empty_is_0")]
237 pub sell_amount: Decimal,
238}
239
240#[derive(Debug, Clone, Serialize, Deserialize)]
244pub struct AnomalyResponse {
245 pub all_off: bool,
247 pub changes: Vec<AnomalyItem>,
249}
250
251#[derive(Debug, Clone, Serialize, Deserialize)]
253pub struct AnomalyItem {
254 #[serde(
256 rename = "counter_id",
257 deserialize_with = "deserialize_counter_id_as_symbol"
258 )]
259 pub symbol: String,
260 pub name: String,
262 pub alert_name: String,
264 pub alert_time: i64,
266 pub change_values: Vec<String>,
268 pub emotion: i32,
270}
271
272#[derive(Debug, Clone, Serialize, Deserialize)]
276pub struct IndexConstituents {
277 pub fall_num: i32,
279 pub flat_num: i32,
281 pub rise_num: i32,
283 pub stocks: Vec<ConstituentStock>,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
289pub struct ConstituentStock {
290 #[serde(
292 rename = "counter_id",
293 deserialize_with = "deserialize_counter_id_as_symbol"
294 )]
295 pub symbol: String,
296 pub name: String,
298 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
300 pub last_done: Option<Decimal>,
301 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
303 pub prev_close: Option<Decimal>,
304 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
306 pub inflow: Option<Decimal>,
307 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
309 pub balance: Option<Decimal>,
310 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
312 pub amount: Option<Decimal>,
313 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
315 pub total_shares: Option<Decimal>,
316 pub tags: Vec<String>,
318 pub intro: String,
320 pub market: String,
322 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
324 pub circulating_shares: Option<Decimal>,
325 pub delay: bool,
327 #[serde(with = "crate::serde_utils::decimal_opt_str_is_none")]
329 pub chg: Option<Decimal>,
330 pub trade_status: i32,
332}
333
334#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Default)]
338pub enum BrokerHoldingPeriod {
339 #[default]
341 #[serde(rename = "rct_1")]
342 Rct1,
343 #[serde(rename = "rct_5")]
345 Rct5,
346 #[serde(rename = "rct_20")]
348 Rct20,
349 #[serde(rename = "rct_60")]
351 Rct60,
352}
353
354#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)]
356pub enum AhPremiumPeriod {
357 Min1,
359 Min5,
361 Min15,
363 Min30,
365 Min60,
367 #[default]
369 Day,
370 Week,
372 Month,
374 Year,
376}
377
378impl AhPremiumPeriod {
379 pub(crate) fn to_line_type(self) -> &'static str {
381 match self {
382 AhPremiumPeriod::Min1 => "1",
383 AhPremiumPeriod::Min5 => "5",
384 AhPremiumPeriod::Min15 => "15",
385 AhPremiumPeriod::Min30 => "30",
386 AhPremiumPeriod::Min60 => "60",
387 AhPremiumPeriod::Day => "1000",
388 AhPremiumPeriod::Week => "2000",
389 AhPremiumPeriod::Month => "3000",
390 AhPremiumPeriod::Year => "4000",
391 }
392 }
393}