1use rust_decimal::Decimal;
2use serde::{Deserialize, Serialize};
3
4use crate::types::Market;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct DcaList {
9 pub plans: Vec<DcaPlan>,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct DcaPlan {
16 pub plan_id: String,
18 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
20 pub status: DCAStatus,
21 pub symbol: String,
23 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
25 pub member_id: String,
26 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
28 pub aaid: String,
29 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
31 pub account_channel: String,
32 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
34 pub display_account: String,
35 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
37 pub market: Market,
38 #[serde(default, with = "crate::serde_utils::decimal_empty_is_0")]
40 pub per_invest_amount: Decimal,
41 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
43 pub invest_frequency: DCAFrequency,
44 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
46 pub invest_day_of_week: String,
47 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
49 pub invest_day_of_month: String,
50 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
52 pub allow_margin_finance: bool,
53 #[serde(
56 default,
57 deserialize_with = "crate::serde_utils::deserialize_string_or_int_as_string"
58 )]
59 pub alter_hours: String,
60 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
62 pub created_at: String,
63 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
65 pub updated_at: String,
66 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
68 pub next_trd_date: String,
69 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
71 pub stock_name: String,
72 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
74 pub cum_amount: Option<Decimal>,
75 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
77 pub issue_number: i64,
78 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
80 pub average_cost: Option<Decimal>,
81 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
83 pub cum_profit: Option<Decimal>,
84}
85
86#[derive(Debug, Clone, Default, Serialize, Deserialize)]
88pub struct DcaStats {
89 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
91 pub active_count: String,
92 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
94 pub finished_count: String,
95 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
97 pub suspended_count: String,
98 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
100 pub nearest_plans: Vec<DcaPlan>,
101 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
103 pub rest_days: String,
104 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
106 pub total_amount: Option<Decimal>,
107 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
109 pub total_profit: Option<Decimal>,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct DcaSupportList {
115 pub infos: Vec<DcaSupportInfo>,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct DcaSupportInfo {
122 pub symbol: String,
124 pub support_regular_saving: bool,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct DcaHistoryResponse {
131 pub records: Vec<DcaHistoryRecord>,
133 #[serde(default, deserialize_with = "crate::serde_utils::null_as_default")]
135 pub has_more: bool,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
140pub struct DcaHistoryRecord {
141 pub created_at: String,
143 pub order_id: String,
145 pub status: String,
147 pub action: String,
149 pub order_type: String,
151 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
153 pub executed_qty: Option<Decimal>,
154 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
156 pub executed_price: Option<Decimal>,
157 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
159 pub executed_amount: Option<Decimal>,
160 pub rejected_reason: String,
162 pub symbol: String,
164}
165
166#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Default)]
168pub enum DCAFrequency {
169 #[serde(rename = "Daily")]
171 Daily,
172 #[serde(rename = "Weekly")]
174 Weekly,
175 #[serde(rename = "Fortnightly")]
177 Fortnightly,
178 #[default]
180 #[serde(rename = "Monthly")]
181 Monthly,
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
186pub struct DcaCreateResult {
187 pub plan_id: String,
189}
190
191#[derive(Debug, Clone, Serialize, Deserialize)]
193pub struct DcaCalcDateResult {
194 pub trade_date: String,
196}
197
198#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Default)]
200pub enum DCAStatus {
201 #[default]
203 #[serde(rename = "Active")]
204 Active,
205 #[serde(rename = "Suspended")]
207 Suspended,
208 #[serde(rename = "Finished")]
210 Finished,
211}