Skip to main content

futucli/cli/commands/
trade_read.rs

1//! Trade-read clap argument structs split from commands.rs.
2
3use clap::Args;
4
5#[derive(Args)]
6pub struct ComboMaxTrdQtysArgs {
7    /// 官方 `Trd_GetComboMaxTrdQtys.C2S` JSON。
8    ///
9    /// 字段名按 generated proto serde 的 snake_case 写法,例如
10    /// `header`、`combo_legs`、`order_type`。
11    #[arg(long = "c2s-json", value_name = "JSON")]
12    pub(crate) c2s_json: String,
13}
14
15#[derive(Args)]
16pub struct FundsArgs {
17    /// 市场: HK | US | CN | HKCC | SG | AU | JP | MY | CA | HKFUND |
18    /// USFUND. v1.4.106 ergonomics: 改为 optional, 不传时 daemon 按
19    /// `acc_id` cache 推断主市场 (TrdMarket::Unknown=0 走默认路径).
20    /// 综合账户 (uniCardNum 非空) 用户传或不传效果一致 (daemon
21    /// `acc_id` 路径不依赖 `trd_market` filter); 普通账户 (HK-only /
22    /// US-only) 不传也 OK, daemon 按账户主市场默认路由.
23    #[arg(short, long)]
24    pub(crate) market: Option<String>,
25
26    /// 交易账户 ID;也可改用 --card-num 传 App 显示卡号
27    #[arg(long)]
28    pub(crate) acc_id: Option<u64>,
29
30    /// App 显示卡号:4 位末尾或 16 位完整卡号
31    #[arg(long = "card-num")]
32    pub(crate) card_num: Option<String>,
33
34    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
35    #[arg(
36        long = "acc-id-file",
37        value_name = "MODE_0600_FILE",
38        conflicts_with_all = ["acc_id", "card_num"]
39    )]
40    pub(crate) acc_id_file: Option<std::path::PathBuf>,
41
42    /// 交易环境: real | simulate
43    #[arg(short, long, default_value = "real")]
44    pub(crate) env: String,
45
46    /// 资金视图币种: HKD | USD | CNH | JPY | SGD | AUD | CAD | MYR.
47    /// 不传时 daemon 使用账户所属券商的默认币种;显式传入时会校验
48    /// 该账户是否支持。普通单市场账户可能由 backend 忽略显式币种。
49    #[arg(long)]
50    pub(crate) currency: Option<String>,
51}
52
53#[derive(Args)]
54pub struct PositionArgs {
55    #[arg(short, long)]
56    pub(crate) market: String,
57
58    #[arg(long)]
59    pub(crate) acc_id: Option<u64>,
60
61    /// App 显示卡号:4 位末尾或 16 位完整卡号
62    #[arg(long = "card-num")]
63    pub(crate) card_num: Option<String>,
64
65    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
66    #[arg(
67        long = "acc-id-file",
68        value_name = "MODE_0600_FILE",
69        conflicts_with_all = ["acc_id", "card_num"]
70    )]
71    pub(crate) acc_id_file: Option<std::path::PathBuf>,
72
73    #[arg(short, long, default_value = "real")]
74    pub(crate) env: String,
75
76    /// 持仓视图币种。C++ 10.7 起 crypto 账户必填;非 crypto 账户由
77    /// daemon/backend 忽略并使用账户主币种。
78    #[arg(long)]
79    pub(crate) currency: Option<String>,
80
81    /// 请求期权策略组合持仓视图(C++ 10.7 optionStrategyView)。
82    #[arg(long = "option-strategy-view")]
83    pub(crate) option_strategy_view: bool,
84}
85
86#[derive(Args)]
87pub struct OrderArgs {
88    #[arg(short, long)]
89    pub(crate) market: String,
90
91    #[arg(long)]
92    pub(crate) acc_id: Option<u64>,
93
94    /// App 显示卡号:4 位末尾或 16 位完整卡号
95    #[arg(long = "card-num")]
96    pub(crate) card_num: Option<String>,
97
98    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
99    #[arg(
100        long = "acc-id-file",
101        value_name = "MODE_0600_FILE",
102        conflicts_with_all = ["acc_id", "card_num"]
103    )]
104    pub(crate) acc_id_file: Option<std::path::PathBuf>,
105
106    #[arg(short, long, default_value = "real")]
107    pub(crate) env: String,
108}
109
110#[derive(Args)]
111pub struct DealArgs {
112    #[arg(short, long)]
113    pub(crate) market: String,
114
115    #[arg(long)]
116    pub(crate) acc_id: Option<u64>,
117
118    /// App 显示卡号:4 位末尾或 16 位完整卡号
119    #[arg(long = "card-num")]
120    pub(crate) card_num: Option<String>,
121
122    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
123    #[arg(
124        long = "acc-id-file",
125        value_name = "MODE_0600_FILE",
126        conflicts_with_all = ["acc_id", "card_num"]
127    )]
128    pub(crate) acc_id_file: Option<std::path::PathBuf>,
129
130    #[arg(short, long, default_value = "real")]
131    pub(crate) env: String,
132}
133
134#[derive(Args)]
135pub struct HistoryOrdersArgs {
136    #[arg(short, long)]
137    pub(crate) market: String,
138
139    #[arg(long)]
140    pub(crate) acc_id: Option<u64>,
141
142    /// App 显示卡号:4 位末尾或 16 位完整卡号
143    #[arg(long = "card-num")]
144    pub(crate) card_num: Option<String>,
145
146    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
147    #[arg(
148        long = "acc-id-file",
149        value_name = "MODE_0600_FILE",
150        conflicts_with_all = ["acc_id", "card_num"]
151    )]
152    pub(crate) acc_id_file: Option<std::path::PathBuf>,
153
154    #[arg(short, long, default_value = "real")]
155    pub(crate) env: String,
156
157    /// 代码列表(空=不过滤),不含 market 前缀,逗号分隔
158    #[arg(long)]
159    pub(crate) codes: Option<String>,
160
161    /// 开始时间 'yyyy-MM-dd HH:mm:ss'
162    #[arg(long)]
163    pub(crate) begin: Option<String>,
164
165    /// 结束时间 'yyyy-MM-dd HH:mm:ss'
166    #[arg(long)]
167    pub(crate) end: Option<String>,
168}
169
170#[derive(Args)]
171pub struct HistoryDealsArgs {
172    #[arg(short, long)]
173    pub(crate) market: String,
174
175    #[arg(long)]
176    pub(crate) acc_id: Option<u64>,
177
178    /// App 显示卡号:4 位末尾或 16 位完整卡号
179    #[arg(long = "card-num")]
180    pub(crate) card_num: Option<String>,
181
182    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
183    #[arg(
184        long = "acc-id-file",
185        value_name = "MODE_0600_FILE",
186        conflicts_with_all = ["acc_id", "card_num"]
187    )]
188    pub(crate) acc_id_file: Option<std::path::PathBuf>,
189
190    #[arg(short, long, default_value = "real")]
191    pub(crate) env: String,
192
193    #[arg(long)]
194    pub(crate) codes: Option<String>,
195
196    #[arg(long)]
197    pub(crate) begin: Option<String>,
198
199    #[arg(long)]
200    pub(crate) end: Option<String>,
201}
202
203#[derive(Args)]
204pub struct MaxQtysArgs {
205    #[arg(short, long)]
206    pub(crate) market: String,
207
208    #[arg(long)]
209    pub(crate) acc_id: Option<u64>,
210
211    /// App 显示卡号:4 位末尾或 16 位完整卡号
212    #[arg(long = "card-num")]
213    pub(crate) card_num: Option<String>,
214
215    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
216    #[arg(
217        long = "acc-id-file",
218        value_name = "MODE_0600_FILE",
219        conflicts_with_all = ["acc_id", "card_num"]
220    )]
221    pub(crate) acc_id_file: Option<std::path::PathBuf>,
222
223    #[arg(short, long, default_value = "real")]
224    pub(crate) env: String,
225
226    /// 订单类型(和 place-order 一致)
227    #[arg(long, default_value = "NORMAL")]
228    pub(crate) order_type: String,
229
230    #[arg(long)]
231    pub(crate) code: String,
232
233    /// 限价(MARKET 单传 0)
234    #[arg(long)]
235    pub(crate) price: f64,
236
237    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
238    #[arg(long = "jp-acc-type")]
239    pub(crate) jp_acc_type: Option<i32>,
240}
241
242#[derive(Args)]
243pub struct TradeCheckArgs {
244    #[arg(short, long)]
245    pub(crate) market: String,
246
247    #[arg(long)]
248    pub(crate) acc_id: Option<u64>,
249
250    /// App 显示卡号:4 位末尾或 16 位完整卡号
251    #[arg(long = "card-num")]
252    pub(crate) card_num: Option<String>,
253
254    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
255    #[arg(
256        long = "acc-id-file",
257        value_name = "MODE_0600_FILE",
258        conflicts_with_all = ["acc_id", "card_num"]
259    )]
260    pub(crate) acc_id_file: Option<std::path::PathBuf>,
261
262    #[arg(short, long, default_value = "real")]
263    pub(crate) env: String,
264
265    /// 订单类型(和 max-qtys/place-order 一致);本命令只做只读试算
266    #[arg(long, default_value = "NORMAL")]
267    pub(crate) order_type: String,
268
269    /// 股票代码,可传 MARKET.CODE 或本地 code;MARKET.CODE 会用于 static warmup
270    #[arg(long)]
271    pub(crate) code: String,
272
273    /// 限价(MARKET 单传 0)
274    #[arg(long)]
275    pub(crate) price: f64,
276
277    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
278    #[arg(long = "jp-acc-type")]
279    pub(crate) jp_acc_type: Option<i32>,
280}
281
282#[derive(Args)]
283pub struct MarginRatioArgs {
284    /// 交易市场:HK / US / CN / HKCC / SG
285    #[arg(short, long)]
286    pub(crate) market: String,
287
288    /// 交易账户 ID
289    #[arg(long)]
290    pub(crate) acc_id: Option<u64>,
291
292    /// App 显示卡号:4 位末尾或 16 位完整卡号
293    #[arg(long = "card-num")]
294    pub(crate) card_num: Option<String>,
295
296    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
297    #[arg(
298        long = "acc-id-file",
299        value_name = "MODE_0600_FILE",
300        conflicts_with_all = ["acc_id", "card_num"]
301    )]
302    pub(crate) acc_id_file: Option<std::path::PathBuf>,
303
304    /// 环境:real / simulate(默认 real)
305    #[arg(short, long, default_value = "real")]
306    pub(crate) env: String,
307
308    /// 证券列表,逗号分隔(位置参数或 --code / --symbols 二选一)
309    #[arg(index = 1, value_name = "SYMBOLS")]
310    pub(crate) symbols: Option<String>,
311
312    /// REST/MCP 风格命名参数别名
313    #[arg(long = "code", visible_alias = "symbols", conflicts_with = "symbols")]
314    pub(crate) symbols_arg: Option<String>,
315}
316
317#[derive(Args)]
318pub struct OrderFeeArgs {
319    /// 交易市场:HK / US / CN / HKCC
320    #[arg(short, long)]
321    pub(crate) market: String,
322
323    /// 交易账户 ID
324    #[arg(long)]
325    pub(crate) acc_id: Option<u64>,
326
327    /// App 显示卡号:4 位末尾或 16 位完整卡号
328    #[arg(long = "card-num")]
329    pub(crate) card_num: Option<String>,
330
331    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
332    #[arg(
333        long = "acc-id-file",
334        value_name = "MODE_0600_FILE",
335        conflicts_with_all = ["acc_id", "card_num"]
336    )]
337    pub(crate) acc_id_file: Option<std::path::PathBuf>,
338
339    /// 环境:real / simulate(默认 real)
340    #[arg(short, long, default_value = "real")]
341    pub(crate) env: String,
342
343    /// 扩展订单号列表,逗号分隔(从 `order` / `history-orders` 的 order_id_ex 列取)
344    pub(crate) order_ids: String,
345}
346
347#[derive(Args)]
348pub struct AccCashFlowArgs {
349    /// 账户 id(位置参数或 --acc-id 二选一)
350    #[arg(index = 1, value_name = "ACC_ID")]
351    pub(crate) acc_id: Option<u64>,
352
353    /// REST/MCP 风格命名参数别名
354    #[arg(long = "acc-id", conflicts_with = "acc_id")]
355    pub(crate) acc_id_arg: Option<u64>,
356
357    /// App 显示卡号:4 位末尾或 16 位完整卡号
358    #[arg(long = "card-num")]
359    pub(crate) card_num: Option<String>,
360
361    /// Unix owner-only (exact mode 0600) account-id file; keeps the raw selector out of argv.
362    #[arg(
363        long = "acc-id-file",
364        value_name = "MODE_0600_FILE",
365        conflicts_with_all = ["acc_id", "acc_id_arg", "card_num"]
366    )]
367    pub(crate) acc_id_file: Option<std::path::PathBuf>,
368
369    /// 清算日期 YYYY-MM-DD(单日;和 `--date-range` 二选一)
370    #[arg(long, conflicts_with = "date_range")]
371    pub(crate) date: Option<String>,
372
373    /// v1.4.32+ 日期范围 `YYYY-MM-DD..YYYY-MM-DD`(跨度上限 31 天,跳周末)
374    #[arg(long, conflicts_with = "date")]
375    pub(crate) date_range: Option<String>,
376
377    /// 环境:simulate / real(默认 real)
378    #[arg(long, default_value = "real")]
379    pub(crate) env: String,
380
381    /// 市场:HK / US / CN / HKCC(默认 HK)
382    #[arg(long, default_value = "HK")]
383    pub(crate) market: String,
384
385    /// 方向过滤:1=入金 / 2=出金(默认全部)
386    #[arg(long)]
387    pub(crate) direction: Option<i32>,
388}