Skip to main content

futucli/cli/commands/
qot.rs

1//! Basic QOT clap argument structs split from commands.rs.
2
3use clap::Args;
4
5#[derive(Args)]
6pub struct ProtoJsonArgs {
7    /// 官方 proto C2S JSON;字段名按 generated proto serde 的 snake_case 写法。
8    ///
9    /// 例:`{"market":11,"count":20}`。`market` 使用 Qot_Common.QotMarket
10    /// 数字值(HK=1, US=11, SH=21, SZ=22, SG=31, JP=41, AU=51),
11    /// 不接受 "US" 这类字符串;本入口不会替用户改写字段或补默认值。
12    #[arg(long = "c2s-json", value_name = "JSON")]
13    pub(crate) c2s_json: String,
14}
15
16#[derive(Args)]
17pub struct StockNoteArgs {
18    #[arg(long = "c2s-json", value_name = "JSON")]
19    pub(crate) c2s_json: String,
20    #[arg(long, env = "FUTU_REST_URL")]
21    pub(crate) rest_url: Option<String>,
22    #[arg(long, conflicts_with = "rest_url")]
23    pub(crate) rest_port: Option<u16>,
24    #[arg(long, env = "FUTU_API_KEY")]
25    pub(crate) api_key: Option<String>,
26}
27
28#[derive(Args)]
29pub struct IndicatorListArgs {
30    /// Qot_GetIndicatorList.C2S JSON;字段为 search_key/lang_type/search_mode。
31    ///
32    /// 例:`{"search_key":"MA","lang_type":0,"search_mode":1}`。
33    /// 字段名使用 generated proto serde 的 snake_case 写法;本入口不会
34    /// 替用户改写字段或补默认值。
35    #[arg(long = "c2s-json", value_name = "JSON")]
36    pub(crate) c2s_json: String,
37}
38
39#[derive(Args)]
40pub struct IndicatorCalcArgs {
41    /// Qot_RequestIndicatorCalc.C2S JSON;必须包含 short_name/lang_type/data。
42    #[arg(long = "c2s-json", value_name = "JSON")]
43    pub(crate) c2s_json: String,
44
45    /// 等待同一 raw 连接上 3261 结果的秒数;超时会关闭连接并取消 worker。
46    #[arg(long = "timeout-secs", default_value_t = 10)]
47    pub(crate) timeout_secs: u64,
48}
49
50#[derive(Args)]
51pub struct QuoteArgs {
52    /// 股票代码,MARKET.CODE 格式,如 HK.00700 US.AAPL
53    #[arg(required = true)]
54    pub(crate) symbols: Vec<String>,
55}
56
57#[derive(Args)]
58pub struct SnapshotArgs {
59    /// 股票代码,MARKET.CODE 格式
60    #[arg(required = true)]
61    pub(crate) symbols: Vec<String>,
62}
63
64#[derive(Args)]
65pub struct SubArgs {
66    /// 股票代码,MARKET.CODE 格式
67    #[arg(required = true)]
68    pub(crate) symbols: Vec<String>,
69
70    /// 订阅类型,逗号分隔
71    ///
72    /// 支持: basic, orderbook, orderbook_odd, ticker, rt, kl_day, kl_1min, kl_3min, kl_5min,
73    ///       kl_10min, kl_15min, kl_30min, kl_60min, kl_120min, kl_180min, kl_240min,
74    ///       kl_week, kl_month, broker
75    ///
76    /// v1.4.83 §10 新增 aliases: `--sub-type` / `--sub-types` / `--stype`
77    #[arg(
78        short = 't',
79        long,
80        visible_aliases = ["sub-type", "sub-types", "stype"],
81        default_value = "basic"
82    )]
83    pub(crate) r#type: String,
84
85    /// 允许美股盘前/盘后行情数据(Qot_Sub.extendedTime)
86    #[arg(long = "extended-time")]
87    pub(crate) extended_time: bool,
88
89    /// 行情订阅时段:NONE|RTH|ETH|ALL 或 0|1|2|3;OVERNIGHT/4 按 C++ OpenD 拒绝
90    #[arg(long)]
91    pub(crate) session: Option<String>,
92
93    /// 订阅摆盘明细(Qot_Sub.isSubOrderBookDetail)
94    #[arg(long = "orderbook-detail")]
95    pub(crate) orderbook_detail: bool,
96}
97
98#[derive(Args)]
99pub struct KlineArgs {
100    /// 股票代码,MARKET.CODE 格式(positional)或 `--symbol`/`--code` 指定
101    #[arg(index = 1, value_name = "SYMBOL")]
102    pub(crate) symbol_positional: Option<String>,
103
104    /// v1.4.83 §10 alias: 显式 `--symbol <X>` / `--code <X>` / `--stock <X>`
105    #[arg(
106        long = "symbol",
107        visible_aliases = ["code", "stock"],
108        conflicts_with = "symbol_positional",
109        value_name = "SYMBOL"
110    )]
111    pub(crate) symbol_arg: Option<String>,
112
113    /// K 线类型: day | week | month | quarter | year | 1min | 3min | 5min |
114    ///          10min | 15min | 30min | 60min | 120min | 180min | 240min
115    ///
116    /// v1.4.83 §10 新增 aliases: `--ktype` / `--kltype` / `--kl-type`
117    #[arg(
118        short = 't',
119        long,
120        visible_aliases = ["ktype", "kltype", "kl-type"],
121        default_value = "day"
122    )]
123    pub(crate) r#type: String,
124
125    /// 返回根数(默认 100)
126    ///
127    /// v1.4.83 §10 新增 aliases: `--num` / `--max-count` / `--req-count`
128    #[arg(
129        short = 'n',
130        long,
131        visible_aliases = ["num", "max-count", "req-count"]
132    )]
133    pub(crate) count: Option<i32>,
134
135    /// 复权类型: none | forward | backward(默认 none)
136    #[arg(long = "rehab-type", default_value = "none")]
137    pub(crate) rehab_type: String,
138
139    /// backend 分页返回上限(Qot_RequestHistoryKL.maxAckKLNum);不传时保留 CLI 最新 N 根旧语义
140    #[arg(long = "page-size", visible_alias = "max-ack-kl-num")]
141    pub(crate) page_size: Option<i32>,
142
143    /// 上一页响应返回的 next_req_key(base64)
144    #[arg(long = "next-req-key", visible_alias = "nextReqKey")]
145    pub(crate) next_req_key: Option<String>,
146
147    /// 指定返回 K 线字段 bitmask(Qot_Common.KLFields)
148    #[arg(long = "need-kl-fields-flag", visible_alias = "needKLFieldsFlag")]
149    pub(crate) need_kl_fields_flag: Option<i64>,
150
151    /// 获取美股盘前/盘后历史 K 线(Qot_RequestHistoryKL.extendedTime)
152    #[arg(long = "extended-time")]
153    pub(crate) extended_time: bool,
154
155    /// 历史 K 线时段:NONE|RTH|ETH|ALL 或 0|1|2|3;OVERNIGHT/4 按 C++ OpenD 拒绝
156    #[arg(long)]
157    pub(crate) session: Option<String>,
158
159    /// 开始日期 yyyy-MM-dd(默认 end - 回溯)
160    ///
161    /// v1.4.83 §10 alias: `--begin-time` / `--from`
162    #[arg(long, visible_aliases = ["begin-time", "from"])]
163    pub(crate) begin: Option<String>,
164
165    /// 结束日期 yyyy-MM-dd(默认今日)
166    ///
167    /// v1.4.83 §10 alias: `--end-time` / `--to`
168    #[arg(long, visible_aliases = ["end-time", "to"])]
169    pub(crate) end: Option<String>,
170}
171
172#[derive(Args)]
173pub struct OrderbookArgs {
174    /// 股票代码,MARKET.CODE 格式(positional)或 `--symbol`/`--code` 指定
175    #[arg(index = 1, value_name = "SYMBOL")]
176    pub(crate) symbol_positional: Option<String>,
177
178    /// v1.4.83 §10 alias: 显式 `--symbol <X>` / `--code <X>` / `--stock <X>`
179    #[arg(
180        long = "symbol",
181        visible_aliases = ["code", "stock"],
182        conflicts_with = "symbol_positional",
183        value_name = "SYMBOL"
184    )]
185    pub(crate) symbol_arg: Option<String>,
186
187    /// 摆盘深度(档数)
188    ///
189    /// v1.4.83 §10 新增 aliases: `--num` / `--count`
190    #[arg(
191        short = 'n',
192        long,
193        visible_aliases = ["num", "count"],
194        default_value_t = 10
195    )]
196    pub(crate) depth: i32,
197
198    /// 查询 SG/MY 碎股摆盘(会订阅 SubType_OrderBook_Odd=22)
199    #[arg(long = "odd-lot", visible_alias = "odd")]
200    pub(crate) odd_lot: bool,
201}
202
203#[derive(Args)]
204pub struct TickerArgs {
205    /// 股票代码
206    #[arg(index = 1, value_name = "SYMBOL")]
207    pub(crate) symbol_positional: Option<String>,
208
209    /// v1.4.83 §10 alias
210    #[arg(
211        long = "symbol",
212        visible_aliases = ["code", "stock"],
213        conflicts_with = "symbol_positional",
214        value_name = "SYMBOL"
215    )]
216    pub(crate) symbol_arg: Option<String>,
217
218    /// 拉取根数
219    ///
220    /// v1.4.83 §10 aliases: `--num` / `--max-count`
221    #[arg(
222        short = 'n',
223        long,
224        visible_aliases = ["num", "max-count"],
225        default_value_t = 100
226    )]
227    pub(crate) count: i32,
228}
229
230#[derive(Args)]
231pub struct RtArgs {
232    /// 股票代码
233    #[arg(index = 1, value_name = "SYMBOL")]
234    pub(crate) symbol_positional: Option<String>,
235
236    /// v1.4.83 §10 alias
237    #[arg(
238        long = "symbol",
239        visible_aliases = ["code", "stock"],
240        conflicts_with = "symbol_positional",
241        value_name = "SYMBOL"
242    )]
243    pub(crate) symbol_arg: Option<String>,
244}
245
246#[derive(Args)]
247pub struct StaticArgs {
248    /// 股票代码(可多个)
249    #[arg(required = true)]
250    pub(crate) symbols: Vec<String>,
251}
252
253#[derive(Args)]
254pub struct BrokerArgs {
255    /// 股票代码
256    #[arg(index = 1, value_name = "SYMBOL")]
257    pub(crate) symbol_positional: Option<String>,
258
259    /// v1.4.83 §10 alias
260    #[arg(
261        long = "symbol",
262        visible_aliases = ["code", "stock"],
263        conflicts_with = "symbol_positional",
264        value_name = "SYMBOL"
265    )]
266    pub(crate) symbol_arg: Option<String>,
267}
268
269#[derive(Args)]
270pub struct PlateListArgs {
271    /// 市场: HK | HK_FUTURE | US | SH | SZ
272    #[arg(short, long)]
273    pub(crate) market: String,
274
275    /// 板块类型: all | industry | region | concept;region 仅 SH/SZ 有后端数据,HK/HK_FUTURE/US 对齐 C++ 返回成功空列表
276    // v1.4.52 BUG-9: visible_alias = "plate-type" 供 REST/MCP 风格用户
277    #[arg(short = 's', long, visible_alias = "plate-type", default_value = "all")]
278    pub(crate) set: String,
279}
280
281#[derive(Args)]
282pub struct PlateStocksArgs {
283    /// 板块 symbol,MARKET.CODE 格式(位置参数或 --plate 二选一)
284    #[arg(index = 1, value_name = "PLATE")]
285    pub(crate) plate: Option<String>,
286
287    /// REST/MCP 风格命名参数别名
288    #[arg(long = "plate", conflicts_with = "plate")]
289    pub(crate) plate_arg: Option<String>,
290}
291
292#[derive(Args)]
293pub struct ReferenceArgs {
294    /// 标的证券,MARKET.CODE 格式(位置参数)或 `--symbol`/`--code` 指定
295    #[arg(index = 1, value_name = "SYMBOL")]
296    pub(crate) symbol_positional: Option<String>,
297
298    /// REST/MCP 风格命名参数 alias
299    #[arg(
300        long = "symbol",
301        visible_aliases = ["code", "stock"],
302        conflicts_with = "symbol_positional",
303        value_name = "SYMBOL"
304    )]
305    pub(crate) symbol_arg: Option<String>,
306
307    /// 关联证券类型:warrant | future。option 走 option-chain。
308    #[arg(
309        long = "reference-type",
310        visible_alias = "type",
311        default_value = "warrant"
312    )]
313    pub(crate) reference_type: String,
314}
315
316#[derive(Args)]
317pub struct CapitalFlowArgs {
318    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
319    pub(crate) symbol: String,
320    /// 周期类型:1=分时 2=1日 3=3日 4=5日 5=10日 6=20日 7=30日 8=60日 9=90日 10=180日 11=360日
321    #[arg(long, default_value_t = 1)]
322    pub(crate) period_type: i32,
323    /// 开始时间 YYYY-MM-DD HH:MM:SS(可选)
324    #[arg(long)]
325    pub(crate) begin: Option<String>,
326    /// 结束时间(可选)
327    #[arg(long)]
328    pub(crate) end: Option<String>,
329}
330
331#[derive(Args)]
332pub struct CompanyProfileArgs {
333    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
334    pub(crate) symbol: String,
335}
336
337#[derive(Args)]
338pub struct CompanyExecutivesArgs {
339    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
340    pub(crate) symbol: String,
341}
342
343#[derive(Args)]
344pub struct CompanyExecutiveBackgroundArgs {
345    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
346    pub(crate) symbol: String,
347    /// 高管/董事姓名,通常来自 company-executives 返回的 leader_name
348    pub(crate) leader_name: String,
349}
350
351#[derive(Args)]
352pub struct CompanyOperationalEfficiencyArgs {
353    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
354    pub(crate) symbol: String,
355    /// 分页标识,首次不填,续拉填上次返回的 next_key
356    #[arg(long, allow_hyphen_values = true)]
357    pub(crate) next_key: Option<String>,
358    /// 每页返回数量,范围 1~50;不传走 backend 默认 10
359    #[arg(long)]
360    pub(crate) num: Option<i32>,
361    /// 货币代码,如 CNY / USD / HKD
362    #[arg(long)]
363    pub(crate) currency_code: Option<String>,
364    /// 兼容保留字段;C++ OpenD 在经营效率接口忽略 financialType,固定查询后端年报视图
365    #[arg(long)]
366    pub(crate) financial_type: Option<i32>,
367}
368
369#[derive(Args)]
370pub struct FinancialsEarningsPriceMoveArgs {
371    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
372    pub(crate) symbol: String,
373    /// 财报周期数量,范围 1~50;不传走 backend 默认 10
374    #[arg(long)]
375    pub(crate) period_count: Option<i32>,
376}
377
378#[derive(Args)]
379pub struct FinancialsEarningsPriceHistoryArgs {
380    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
381    pub(crate) symbol: String,
382}
383
384#[derive(Args)]
385pub struct FinancialCalendarArgs {
386    /// 起始日期 YYYYMMDD
387    #[arg(long)]
388    pub(crate) begin_date: String,
389    /// 结束日期右开边界 YYYYMMDD
390    #[arg(long)]
391    pub(crate) end_date: String,
392    /// 市场: HK|US|CN|AU|SG|CA|JP|MY 或 1..8;可重复,也可逗号分隔
393    #[arg(long = "market", visible_alias = "market-list", value_delimiter = ',')]
394    pub(crate) markets: Vec<String>,
395    /// 财报发布时段: regular|before|after 或 0|1|2;可重复,也可逗号分隔
396    #[arg(
397        long = "pub-type",
398        visible_alias = "pub-type-list",
399        value_delimiter = ','
400    )]
401    pub(crate) pub_types: Vec<String>,
402    /// 股票筛选: watchlist|position|special 或 1|2|3;可重复,也可逗号分隔
403    #[arg(
404        long = "stock-type",
405        visible_alias = "stock-type-list",
406        value_delimiter = ','
407    )]
408    pub(crate) stock_types: Vec<String>,
409    /// 只看自选股财报日历;需要配合 --watchlist-stock-id 提供客户端已知 stock_id
410    #[arg(long)]
411    pub(crate) watchlist_only: bool,
412    /// 只看持仓股财报日历;需要配合 --holding-stock-id 提供客户端已知 stock_id
413    #[arg(long)]
414    pub(crate) positions_only: bool,
415    /// 返回数量上限,1..1000
416    #[arg(long, default_value_t = 6)]
417    pub(crate) count: i32,
418    /// 排序类型,按 financial_calendar RankingType enum 传整数
419    #[arg(long)]
420    pub(crate) ranking_type: Option<i32>,
421    /// 自定义过滤,格式 TYPE[:MIN[:MAX]];TYPE 支持 market-cap|option-volume|iv|iv-rank|iv-pctl|rt-market-cap 或 1..6
422    #[arg(long = "custom-filter", value_name = "TYPE[:MIN[:MAX]]")]
423    pub(crate) custom_filters: Vec<String>,
424    /// 预估指标: eps_gaap|revenue|ebit 或 1|2|3;默认 eps_gaap,revenue,ebit
425    #[arg(
426        long = "estimate-type",
427        visible_alias = "estimate-type-list",
428        value_delimiter = ','
429    )]
430    pub(crate) estimate_types: Vec<String>,
431    /// 显式自选股 stock_id;可重复
432    #[arg(long = "watchlist-stock-id")]
433    pub(crate) watchlist_stock_ids: Vec<u64>,
434    /// 显式持仓 stock_id;可重复
435    #[arg(long = "holding-stock-id")]
436    pub(crate) holding_stock_ids: Vec<u64>,
437}
438
439#[derive(Args)]
440pub struct FinancialCalendarTargetArgs {
441    /// 待查询股票的 backend stock_id;可重复
442    #[arg(long = "stock-id", required = true)]
443    pub(crate) stock_ids: Vec<u64>,
444    /// 市场: HK|US|CN|AU|SG|CA|JP|MY 或 1..8;可重复,也可逗号分隔
445    #[arg(long = "market", visible_alias = "market-list", value_delimiter = ',')]
446    pub(crate) markets: Vec<String>,
447    /// 返回数量,必须为正数
448    #[arg(long, default_value_t = 20)]
449    pub(crate) size: i32,
450    /// 分页起点,默认走 backend 0
451    #[arg(long)]
452    pub(crate) start: Option<i32>,
453}
454
455#[derive(Args)]
456pub struct IpoCalendarArgs {
457    /// 市场:HK=1 / HK_FUTURE=2 / US=11 / CN/SH=21 / SZ=22 / SG=31 / JP=41 / MY=61
458    #[arg(long)]
459    pub(crate) market: String,
460    /// 事件类型:list/apply/apply_start/apply_end/winning/approval/issue_confirm/price_confirm_start/price_confirm_end/inquiry_start/inquiry_end/draw
461    #[arg(long = "event", visible_alias = "event-type", value_delimiter = ',')]
462    pub(crate) events: Vec<String>,
463    /// 可选起始日期 YYYYMMDD
464    #[arg(long)]
465    pub(crate) begin_date: Option<String>,
466    /// 可选结束日期 YYYYMMDD
467    #[arg(long)]
468    pub(crate) end_date: Option<String>,
469}
470
471#[derive(Args)]
472pub struct FinancialsStatementsArgs {
473    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
474    pub(crate) symbol: String,
475    /// 财务报表类型,0=未知,1=利润表,2=资产负债表,3=现金流量表,4=关键指标;不传走 C++ 默认 1
476    #[arg(long)]
477    pub(crate) statement_type: Option<i32>,
478    /// 财报周期筛选,支持 0~7 和 9~11;不传走 C++ 默认 10
479    #[arg(long)]
480    pub(crate) financial_type: Option<i32>,
481    /// 货币代码,如 CNY / USD / HKD
482    #[arg(long)]
483    pub(crate) currency_code: Option<String>,
484    /// 分页标识,首次不填,续拉填上次返回的 next_key
485    #[arg(long, allow_hyphen_values = true)]
486    pub(crate) next_key: Option<String>,
487    /// 每页返回数量,范围 1~50;不传走 backend 默认 10
488    #[arg(long)]
489    pub(crate) num: Option<i32>,
490}
491
492#[derive(Args)]
493pub struct FinancialsRevenueBreakdownArgs {
494    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
495    pub(crate) symbol: String,
496    /// 筛选时间戳,来自上次返回的 screen_date_list.date
497    #[arg(long)]
498    pub(crate) date: Option<u32>,
499    /// 财报周期筛选,支持 0~7 和 9;不传走 C++ 默认 0
500    #[arg(long)]
501    pub(crate) financial_type: Option<i32>,
502    /// 货币代码,如 CNY / USD / HKD
503    #[arg(long)]
504    pub(crate) currency_code: Option<String>,
505}
506
507#[derive(Args)]
508pub struct ResearchAnalystConsensusArgs {
509    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
510    pub(crate) symbol: String,
511}
512
513#[derive(Args)]
514pub struct ResearchRatingSummaryArgs {
515    /// 证券 MARKET.CODE,如 US.AAPL / CA.SHOP
516    pub(crate) symbol: String,
517    /// 评级维度,0/1=机构,2=分析师;0 或不传走 C++ 默认机构维度
518    #[arg(long)]
519    pub(crate) rating_dimension_type: Option<i32>,
520    /// 机构或分析师 uid;不传返回汇总列表,传入返回详情
521    #[arg(long)]
522    pub(crate) uid: Option<String>,
523    /// 分页标识,首次不填,续拉填上次返回的 next_key
524    #[arg(long, allow_hyphen_values = true)]
525    pub(crate) next_key: Option<String>,
526    /// 每页返回数量,范围 1~20;不传走 C++ 默认 10
527    #[arg(long)]
528    pub(crate) num: Option<i32>,
529}
530
531#[derive(Args)]
532pub struct ResearchMorningstarReportArgs {
533    /// 证券 MARKET.CODE,如 US.AAPL
534    pub(crate) symbol: String,
535}
536
537#[derive(Args)]
538pub struct ValuationDetailArgs {
539    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL / HK.800000
540    pub(crate) symbol: String,
541    /// 估值类型,0=推荐类型,1=PE,2=PB,3=PS;不传走 C++ 默认 0
542    #[arg(long)]
543    pub(crate) valuation_type: Option<i32>,
544    /// 区间类型,1=3个月,2=6个月,3=1年,4=3年,5=2019至今,6=5年,7=10年,8=2年,9=20年,10=30年;0/不传走 C++ 默认 3
545    #[arg(long)]
546    pub(crate) interval_type: Option<i32>,
547}
548
549#[derive(Args)]
550pub struct ValuationPlateStockListArgs {
551    /// 指数或板块 MARKET.CODE,如 HK.800000 / HK.BK0001
552    pub(crate) symbol: String,
553    /// 估值类型,0/1=PE,2=PB,3=PS;0 或不传走 C++ 默认 PE
554    #[arg(long)]
555    pub(crate) valuation_type: Option<i32>,
556    /// 分页标识,首次不填,续拉填上次返回的 next_key
557    #[arg(long, allow_hyphen_values = true)]
558    pub(crate) next_key: Option<String>,
559    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
560    #[arg(long)]
561    pub(crate) num: Option<i32>,
562    /// 排序方向,0/2=升序,1=降序;不传走 C++ 默认升序
563    #[arg(long)]
564    pub(crate) sort_type: Option<i32>,
565    /// 排序列,51=市值,52=估值,53=预测估值,54=历史分位
566    #[arg(long)]
567    pub(crate) sort_id: Option<i32>,
568    /// 指数成分股筛选板块 MARKET.CODE,仅指数场景有效
569    #[arg(long)]
570    pub(crate) filter_security: Option<String>,
571}
572
573#[derive(Args)]
574pub struct StockScreenArgs {
575    /// 完整 Qot_StockScreen C2S JSON;使用生成 proto 的 snake_case 字段,如 filter_list/retrieve_list/page_from/page_count
576    #[arg(long = "c2s-json")]
577    pub(crate) c2s_json: String,
578}
579
580#[derive(Args)]
581pub struct OptionScreenArgs {
582    /// 完整 Qot_OptionScreen C2S JSON;使用生成 proto 的 snake_case 字段,如 market_category_list/filter_list/sort_list/page_from/page_count
583    #[arg(long = "c2s-json")]
584    pub(crate) c2s_json: String,
585}
586
587#[derive(Args)]
588pub struct WarrantScreenArgs {
589    /// 完整 Qot_WarrantScreen C2S JSON;使用生成 proto 的 snake_case 字段,如 market_type/filter_list/sort_list/page_from/page_count
590    #[arg(long = "c2s-json")]
591    pub(crate) c2s_json: String,
592}
593
594#[derive(Args)]
595pub struct TechnicalUnusualArgs {
596    /// 股票 MARKET.CODE,如 HK.00700 / US.AAPL
597    pub(crate) stock_symbol: String,
598    /// 时间范围天数;不传或 <=0 走 C++ 默认 7
599    #[arg(long)]
600    pub(crate) time_range: Option<i32>,
601    /// 技术指标过滤项;可重复传入,不传表示全部
602    #[arg(long = "indicator-filter")]
603    pub(crate) indicator_filters: Vec<String>,
604    /// 返回语种:0=简中,1=繁中,2=英文
605    #[arg(long)]
606    pub(crate) language_id: Option<i32>,
607}
608
609#[derive(Args)]
610pub struct FinancialUnusualArgs {
611    /// 股票 MARKET.CODE,如 HK.00700 / US.AAPL
612    pub(crate) stock_symbol: String,
613    /// 时间范围天数;不传或 <=0 走 C++ 默认 7
614    #[arg(long)]
615    pub(crate) time_range: Option<i32>,
616    /// 分析维度;可重复传入,不传表示全部
617    #[arg(long = "analysis-dimension")]
618    pub(crate) analysis_dimensions: Vec<String>,
619    /// 返回语种:0=简中,1=繁中,2=英文
620    #[arg(long)]
621    pub(crate) language_id: Option<i32>,
622}
623
624#[derive(Args)]
625pub struct DerivativeUnusualArgs {
626    /// 股票 MARKET.CODE,如 HK.00700 / US.AAPL
627    pub(crate) stock_symbol: String,
628    /// 时间范围天数;不传或 <=0 走 C++ 默认 7
629    #[arg(long)]
630    pub(crate) time_range: Option<i32>,
631    /// 分析维度;可重复传入,不传表示全部
632    #[arg(long = "analysis-dimension")]
633    pub(crate) analysis_dimensions: Vec<String>,
634    /// 返回语种:0=简中,1=繁中,2=英文
635    #[arg(long)]
636    pub(crate) language_id: Option<i32>,
637}
638
639#[derive(Args)]
640pub struct CorporateActionsDividendsArgs {
641    /// 证券 MARKET.CODE,如 HK.00700 / SH.600519
642    pub(crate) symbol: String,
643}
644
645#[derive(Args)]
646pub struct CorporateActionsBuybacksArgs {
647    /// 证券 MARKET.CODE,如 HK.00700 / SH.600519
648    pub(crate) symbol: String,
649    /// 分页标识,首次不填,续拉填上次返回的 next_key;"-1" 表示无更多
650    #[arg(long, allow_hyphen_values = true)]
651    pub(crate) next_key: Option<String>,
652    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
653    #[arg(long)]
654    pub(crate) num: Option<i32>,
655}
656
657#[derive(Args)]
658pub struct CorporateActionsStockSplitsArgs {
659    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
660    pub(crate) symbol: String,
661    /// 分页标识,首次不填,续拉填上次返回的 next_key;"-1" 表示无更多
662    #[arg(long, allow_hyphen_values = true)]
663    pub(crate) next_key: Option<String>,
664    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
665    #[arg(long)]
666    pub(crate) num: Option<i32>,
667}
668
669#[derive(Args)]
670pub struct DailyShortVolumeArgs {
671    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
672    pub(crate) symbol: String,
673    /// 分页标识,首次不填,续拉填上次返回的 next_key;"-1" 表示无更多
674    #[arg(long, allow_hyphen_values = true)]
675    pub(crate) next_key: Option<String>,
676    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
677    #[arg(long)]
678    pub(crate) num: Option<i32>,
679}
680
681#[derive(Args)]
682pub struct ShortInterestArgs {
683    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
684    pub(crate) symbol: String,
685    /// 分页标识,首次不填,续拉填上次返回的 next_key;"-1" 表示无更多
686    #[arg(long, allow_hyphen_values = true)]
687    pub(crate) next_key: Option<String>,
688    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
689    #[arg(long)]
690    pub(crate) num: Option<i32>,
691}
692
693#[derive(Args)]
694pub struct TopTenBuySellBrokersArgs {
695    /// 证券 MARKET.CODE,如 HK.00700
696    pub(crate) symbol: String,
697    /// 查询过去第 N 个交易日;0 或不传表示实时十大买卖经纪
698    #[arg(long)]
699    pub(crate) days_before: Option<i32>,
700}
701
702#[derive(Args)]
703pub struct ShareholdersOverviewArgs {
704    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
705    pub(crate) symbol: String,
706    /// 指定报告期 ID;不传或 0 返回最新数据并带可用报告期列表
707    #[arg(long)]
708    pub(crate) period_id: Option<i32>,
709}
710
711#[derive(Args)]
712pub struct ShareholdersHoldingChangesArgs {
713    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
714    pub(crate) symbol: String,
715    /// 分页标识,首次不填;"-1" 表示无更多
716    #[arg(long, allow_hyphen_values = true)]
717    pub(crate) next_key: Option<String>,
718    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
719    #[arg(long)]
720    pub(crate) num: Option<i32>,
721    /// 排序方向,0/1=降序,2=升序
722    #[arg(long)]
723    pub(crate) sort_type: Option<i32>,
724    /// 排序字段,62=持股变动数,63=持股日期,64=变动比例,65=变动金额,66=持股比例
725    #[arg(long)]
726    pub(crate) sort_column: Option<i32>,
727    /// 筛选类型,0=全部,1=增持,2=减持,3=建仓,4=清仓
728    #[arg(long)]
729    pub(crate) filter_type: Option<i32>,
730}
731
732#[derive(Args)]
733pub struct ShareholdersHolderDetailArgs {
734    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
735    pub(crate) symbol: String,
736    /// 持股明细类型,0=默认,1..15=机构类型,100/200/300/400/500,1000=全部
737    #[arg(long)]
738    pub(crate) request_type: Option<i32>,
739    /// 分页标识,首次不填;"-1" 表示无更多
740    #[arg(long, allow_hyphen_values = true)]
741    pub(crate) next_key: Option<String>,
742    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
743    #[arg(long)]
744    pub(crate) num: Option<i32>,
745    /// 排序字段,0/61=持股股数,62=持股变动数
746    #[arg(long)]
747    pub(crate) sort_column: Option<i32>,
748    /// 排序方向,0/1=降序,2=升序
749    #[arg(long)]
750    pub(crate) sort_type: Option<i32>,
751    /// 统计周期 ID
752    #[arg(long)]
753    pub(crate) period_id: Option<i32>,
754    /// 股东/持有人 ID
755    #[arg(long)]
756    pub(crate) holder_id: Option<i32>,
757}
758
759#[derive(Args)]
760pub struct ShareholdersInstitutionalArgs {
761    /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
762    pub(crate) symbol: String,
763    /// 分页标识,首次不填;"-1" 表示无更多
764    #[arg(long, allow_hyphen_values = true)]
765    pub(crate) next_key: Option<String>,
766    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
767    #[arg(long)]
768    pub(crate) num: Option<i32>,
769}
770
771#[derive(Args)]
772pub struct InsiderHolderListArgs {
773    /// 美股证券 MARKET.CODE,如 US.AAPL
774    pub(crate) symbol: String,
775    /// 分页标识,首次不填;"-1" 表示无更多
776    #[arg(long, allow_hyphen_values = true)]
777    pub(crate) next_key: Option<String>,
778    /// 每页返回数量,范围 1~20;不传走 C++ 默认 10
779    #[arg(long)]
780    pub(crate) num: Option<i32>,
781}
782
783#[derive(Args)]
784pub struct InsiderTradeListArgs {
785    /// 美股证券 MARKET.CODE,如 US.AAPL
786    pub(crate) symbol: String,
787    /// 内部人股东 ID;可取自 insider-holder-list 或本命令返回的 Holder ID
788    #[arg(long)]
789    pub(crate) holder_id: Option<i64>,
790    /// 分页标识,首次不填;"-1" 表示无更多
791    #[arg(long, allow_hyphen_values = true)]
792    pub(crate) next_key: Option<String>,
793    /// 每页返回数量,范围 1~50;不传走 C++ 默认 10
794    #[arg(long)]
795    pub(crate) num: Option<i32>,
796}
797
798#[derive(Args)]
799pub struct OptionVolatilityArgs {
800    /// 期权 MARKET.CODE,如 US.AAPL260116C200000
801    pub(crate) symbol: String,
802    /// 查询周期:0/不填=月;1=周,2=月,3=季,4=半年,5=年
803    #[arg(long)]
804    pub(crate) query_time_period: Option<i32>,
805    /// 标的历史波动率周期,范围 5~250;不传走 C++ 默认 30
806    #[arg(long)]
807    pub(crate) hv_time_period: Option<i32>,
808}
809
810#[derive(Args)]
811pub struct OptionExerciseProbabilityArgs {
812    /// 期权 MARKET.CODE,如 US.AAPL260116C200000
813    pub(crate) symbol: String,
814}