Skip to main content

futucli/cli/
commands.rs

1//! clap subcommand enum definitions.
2//!
3//! Kept separate from `cli.rs` so the root CLI module only owns global flags
4//! and re-exports the command type used by dispatch / REPL.
5
6use clap::Subcommand;
7
8mod key;
9mod qot;
10mod sys;
11mod tier_m;
12mod trade_read;
13mod trade_write;
14
15pub use key::{BindKeyArgs, GenKeyArgs, ListKeysArgs, MachineIdArgs, RevokeKeyArgs};
16pub use qot::{
17    BrokerArgs, CapitalFlowArgs, CompanyExecutiveBackgroundArgs, CompanyExecutivesArgs,
18    CompanyOperationalEfficiencyArgs, CompanyProfileArgs, CorporateActionsBuybacksArgs,
19    CorporateActionsDividendsArgs, CorporateActionsStockSplitsArgs, DailyShortVolumeArgs,
20    DerivativeUnusualArgs, FinancialUnusualArgs, FinancialsEarningsPriceHistoryArgs,
21    FinancialsEarningsPriceMoveArgs, FinancialsRevenueBreakdownArgs, FinancialsStatementsArgs,
22    InsiderHolderListArgs, InsiderTradeListArgs, KlineArgs, OptionExerciseProbabilityArgs,
23    OptionScreenArgs, OptionVolatilityArgs, OrderbookArgs, PlateListArgs, PlateStocksArgs,
24    ProtoJsonArgs, QuoteArgs, ResearchAnalystConsensusArgs, ResearchMorningstarReportArgs,
25    ResearchRatingSummaryArgs, RtArgs, ShareholdersHolderDetailArgs,
26    ShareholdersHoldingChangesArgs, ShareholdersInstitutionalArgs, ShareholdersOverviewArgs,
27    ShortInterestArgs, SnapshotArgs, StaticArgs, StockScreenArgs, SubArgs, TechnicalUnusualArgs,
28    TickerArgs, TopTenBuySellBrokersArgs, ValuationDetailArgs, ValuationPlateStockListArgs,
29    WarrantScreenArgs,
30};
31pub use sys::{
32    DaemonReloadArgs, DaemonShutdownArgs, DaemonStatusArgs, HistoryKlQuotaArgs,
33    QuerySubscriptionArgs, QuoteRightsArgs, TickerStatisticArgs, TickerStatisticDetailArgs,
34    UnsubscribeArgs,
35};
36pub use tier_m::{
37    AccountFlagArgs, BizGroupArgs, BondAnswerStateArgs, BondPositionListArgs, BondSingleAssetArgs,
38    BondTotalAssetArgs, BondTradeReminderArgs, CashDetailArgs, CashLogArgs, MarginInfoArgs,
39};
40pub use trade_read::{
41    AccCashFlowArgs, ComboMaxTrdQtysArgs, DealArgs, FundsArgs, HistoryDealsArgs, HistoryOrdersArgs,
42    MarginRatioArgs, MaxQtysArgs, OrderArgs, OrderFeeArgs, PositionArgs,
43};
44pub use trade_write::{
45    CancelOrderArgs, ComboOrderArgs, ModifyOrderArgs, PlaceOrderArgs, ReconfirmOrderArgs,
46};
47
48#[derive(Subcommand)]
49pub enum Command {
50    /// 探活:连接网关并测一次 RTT
51    Ping,
52
53    /// 获取基础实时报价(CLI 自动订阅 SubType::Basic)
54    Quote(QuoteArgs),
55
56    /// 获取股票快照(单次,无需订阅)
57    Snapshot(SnapshotArgs),
58
59    /// 订阅行情推送并持续打印(Ctrl-C 停止)
60    ///
61    /// v1.4.83 §10 新增 aliases: `subscribe` / `subscription`
62    #[command(visible_aliases = ["subscribe", "subscription"])]
63    Sub(SubArgs),
64
65    /// 获取历史 K 线
66    ///
67    /// v1.4.83 §10: `--symbol` / `--code` / `--stock` flag alias 替代 positional
68    Kline(KlineArgs),
69
70    /// 获取摆盘
71    ///
72    /// v1.4.83 §10: `--symbol` / `--code` / `--stock` flag alias 替代 positional
73    Orderbook(OrderbookArgs),
74
75    /// 获取逐笔成交
76    ///
77    /// v1.4.83 §10: `--symbol` / `--code` / `--stock` flag alias
78    Ticker(TickerArgs),
79
80    /// 获取分时数据
81    ///
82    /// v1.4.83 §10: `--symbol` / `--code` / `--stock` flag alias
83    Rt(RtArgs),
84
85    /// 获取静态信息(名称、每手数量、类型、上市时间等)
86    Static(StaticArgs),
87
88    /// 获取经纪队列
89    ///
90    /// v1.4.83 §10: `--symbol` / `--code` / `--stock` flag alias
91    Broker(BrokerArgs),
92
93    /// 列出板块集合
94    PlateList(PlateListArgs),
95
96    /// 列出板块内股票
97    PlateStocks(PlateStocksArgs),
98
99    /// 列出交易账户(默认显示 App 可见账户集合)
100    #[command(visible_alias = "accounts")]
101    Account {
102        /// 过滤交易市场:HK | US | CN | ... | all。不传时在 App 可见集合内不过滤。
103        #[arg(long)]
104        market: Option<String>,
105
106        /// 过滤券商:FutuHK | FutuInc/FutuUS | hk | us | 1..7 | all。不传时在 App 可见集合内不过滤。
107        #[arg(long, visible_alias = "firm")]
108        security_firm: Option<String>,
109
110        /// 排障模式:显示 daemon raw discovery 全集,包括 App 不单独展示的内部账户行。
111        #[arg(long)]
112        all: bool,
113    },
114
115    /// 查询账户资金
116    Funds(FundsArgs),
117
118    /// 查询持仓
119    Position(PositionArgs),
120
121    /// 查询当日订单
122    Order(OrderArgs),
123
124    /// 查询当日成交
125    Deal(DealArgs),
126
127    /// 解锁 / 锁定交易(gateway 进程级,重启失效)
128    ///
129    /// 密码来源优先级:--from-stdin > FUTU_TRADE_PWD 环境变量 > 交互式 prompt(无回显)。
130    /// 解锁成功后所有连同一网关的客户端(futucli / futu-mcp / Python)都可下单。
131    UnlockTrade {
132        /// 锁回交易(清除 gateway 侧 cipher 缓存)
133        #[arg(long)]
134        lock: bool,
135
136        /// 从 stdin 读一行作为密码(脚本管道友好,覆盖环境变量 / tty prompt)
137        #[arg(long)]
138        from_stdin: bool,
139
140        /// OTP / 令牌动态密码明文(v1.4.31+,2FA 用户必填)
141        ///
142        /// 若账号开启了"令牌动态密码"二次验证:首次 unlock 会收到 daemon 提示
143        /// `需要令牌动态密码`,再次调用带此参数即可。无 2FA 账号留空。
144        #[arg(long)]
145        otp: Option<String>,
146
147        /// 只解锁该券商下的账户。不传则解锁所有 broker(默认,向后兼容)。
148        /// 对齐 C++ OpenD 的 per-broker unlock 语义。
149        ///
150        /// 接受 3 种形式(v1.4.34 验证数字和别名确实能跑;clap 默认报错
151        /// 消息只列官方名,用 `--help` 看详细用法):官方名、1-7 数字、短别名。
152        #[arg(
153            long,
154            value_enum,
155            value_name = "FIRM",
156            long_help = "\
157只解锁该券商下的账户。不传则解锁所有 broker(默认,向后兼容)。
158
159接受 3 种形式(等价):
160  1. 官方名:FutuHK FutuUS FutuSG FutuAU FutuCA FutuMY FutuJP
161  2. 数字:   1       2      3      4      5      6      7
162            (HK)   (US)    (SG)   (AU)   (CA)   (MY)   (JP)
163  3. 短别名:hk / us / sg / au / ca / my / jp
164            (moomoo 账号 = us;其他别名 futu-hk / futu-us / mm 等)
165
166示例:
167  --security-firm 1
168  --security-firm hk
169  --security-firm FutuHK
170  --security-firm moomoo    # 等价 --security-firm us"
171        )]
172        security_firm: Option<crate::cmd::unlock::SecurityFirmArg>,
173
174        /// v1.4.34+ 只解锁指定 acc_id 列表(逗号分隔)。和 `--security-firm`
175        /// 同时传时取**交集**。解决同 broker 内影子账户拖垮主账户的场景——
176        /// 显式传主账户 acc_id,影子账户不进请求。
177        #[arg(long, value_delimiter = ',', value_name = "ACC_ID[,ACC_ID]...")]
178        acc_ids: Vec<u64>,
179    },
180
181    /// 把交易密码存到 OS keychain(v1.4+)
182    ///
183    /// 存完后 futu-mcp 的 `futu_unlock_trade` 工具可以在 LLM 需要下单时自动
184    /// 解锁,而不暴露明文密码给 LLM。默认以交互式 tty prompt 读入(无回显),
185    /// 自动化脚本可用 `--from-stdin` 从 stdin 读一行。
186    ///
187    /// 后端:macOS Keychain / Linux DBus Secret Service / Windows Credential Manager。
188    /// 每个登录账号一条独立条目(username = `trade-password.<account>`),
189    /// 避免多账号互相覆盖。
190    SetTradePwd {
191        /// 登录账号(牛牛号 / 手机号 / 邮箱)—— 和 futu-opend --login-account 完全一致
192        #[arg(long)]
193        account: String,
194
195        /// 从 stdin 读一行密码(脚本/CI 友好,不做二次确认)
196        #[arg(long)]
197        from_stdin: bool,
198    },
199
200    /// 清除 keychain 里某登录账号的交易密码
201    ClearTradePwd {
202        #[arg(long)]
203        account: String,
204    },
205
206    /// 把登录密码写入 OS keychain(v1.4.18+)
207    ///
208    /// 存完后 `futu-opend` 启动时如果没传 `--login-pwd` / `FUTU_PWD`,会自动
209    /// 从 keychain 读该账号的密码。每个账号一条独立条目(username =
210    /// `login-password.<account>`),避免多账号互相覆盖。
211    ///
212    /// 默认以交互式 tty prompt 读入(无回显,不进 shell history),自动化脚本
213    /// 可用 `--from-stdin` 从 stdin 读一行。
214    SetLoginPwd {
215        /// 账号(牛牛号 / 手机号 / 邮箱)—— 和 futu-opend --login-account 完全一致
216        #[arg(long)]
217        account: String,
218
219        /// 从 stdin 读一行密码(脚本/CI 友好,不做二次确认)
220        #[arg(long)]
221        from_stdin: bool,
222    },
223
224    /// 清除 keychain 里某账号的登录密码
225    ClearLoginPwd {
226        #[arg(long)]
227        account: String,
228    },
229
230    /// 进入交互式 REPL(共享一条长连接,历史记录,推送实时显示)
231    Repl,
232
233    /// 生成新的 futu-mcp API Key 并追加到 keys.json
234    ///
235    /// 明文 key 只会打印到 stdout 一次;文件中只存 SHA-256 hash。
236    /// 用法示例:
237    ///   futucli gen-key --id readonly --scopes qot:read,acc:read
238    ///   futucli gen-key --id sim-bot --scopes qot:read,trade:simulate --expires 30d
239    ///   futucli gen-key --id prod --scopes trade:real --allowed-markets HK \
240    ///       --allowed-symbols HK.00700,HK.09988 --max-order-value 50000 \
241    ///       --max-daily-value 200000 --hours-window 09:30-16:00 --expires 90d
242    GenKey(GenKeyArgs),
243
244    /// 就地编辑已有 key 的机器绑定(不重新生成明文)
245    ///
246    /// 用法示例:
247    ///   futucli bind-key --id sim-bot --this-machine           # 追加本机
248    ///   futucli bind-key --id sim-bot --machines aabb...,ccdd... # 追加指定指纹
249    ///   futucli bind-key --id sim-bot --replace --this-machine # 覆盖白名单
250    ///   futucli bind-key --id sim-bot --clear                  # 完全解绑
251    ///   futucli bind-key --id sim-bot --freeze                 # 临时冻结(allowed_machines = [])
252    /// 改完记得 SIGHUP 网关:kill -HUP $(pgrep futu-opend)
253    BindKey(BindKeyArgs),
254
255    /// 打印本机 machine-id 或指定 key_id 的绑定指纹
256    ///
257    /// 无 `--for-key` 时打印原始 machine-id(仅用于确认是不是同一台机器)。
258    /// 加 `--for-key <id>` 时打印指纹(可复制给签发者,写进该 key 的 allowed_machines)。
259    MachineId(MachineIdArgs),
260
261    /// 列出 keys.json 中所有 API Key(不含明文,明文只在 gen-key 时打印一次)
262    ///
263    /// 默认输出短表格 (含 ID/STATUS/SCOPES/MARKETS/SYMBOLS/ACCOUNTS/LIMITS/DAILY/WINDOW/BOUND/EXPIRES/NOTE).
264    /// 加 `--json` 输出机读 JSON (字段全, 含 hash / created_at / allowed_machines 等).
265    ListKeys(ListKeysArgs),
266
267    /// 吊销一条 API Key(按 id 从 keys.json 删除;需要运行中的网关 SIGHUP 才生效)
268    RevokeKey(RevokeKeyArgs),
269
270    // ===== v1.4.25: 交易扩展命令 =====
271    /// 下单(Python SDK `OpenTradeContext.place_order`)
272    ///
273    /// **real env 必须带 `--confirm`**,防复制粘贴 / 回车误触。
274    /// 建议先在 simulate env 测通再走 real。
275    ///
276    /// **Market session**(v1.4.111 修正 v1.4.35 表述):协议层是否支持非交易时段下单
277    /// 取决于 backend 行为, daemon 透传不主动拦. 常见交易时段:
278    ///   - HK 主板: 周一至五 09:30-16:00 HKT(开盘前 09:00-09:30 可用 `--order-type AUCTION`)
279    ///   - HK 暗盘: 16:00-19:00 HKT (部分 blue chip / ETF, backend 接受)
280    ///   - US 主板: 周一至五 09:30-16:00 ET(HKT 冬令 22:30-05:00,夏令 21:30-04:00)
281    ///   - US 盘前/盘后: 4:00-9:30 ET / 16:00-20:00 ET (backend 接受)
282    ///   - CN: 周一至五 09:30-11:30 + 13:00-15:00 CST
283    ///   - SG: 周一至五 09:00-17:00 SGT
284    ///   - JP: 周一至五 09:00-11:30 + 12:30-15:00 JST
285    ///   - AU: 周一至五 10:00-16:00 AEST/AEDT
286    ///   - CA: 周一至五 09:30-16:00 EST/EDT
287    ///
288    /// **真实行为** (v1.4.110 真机 verify, essentials/2026-05-26-1800-v1.4.110-hk00700):
289    /// HK 主板已收盘 (market status=6) 时 backend 仍可能接受订单 (暗盘 / GTC 预提交
290    /// queue), daemon 透传 + 完整 push trail. daemon **仅在 backend 显式拒时**追加
291    /// `[hint]` 说明 (e.g. backend 110005). 不要试图换 `--order-type` 绕过 backend
292    /// 拒绝 — 如果 backend 接受订单, daemon 返 `ret_type=0` + 真实 `order_id`,
293    /// 可通过 `/api/orders` 查最终 `order_status` (5=Submitted, 15=Cancelled_All).
294    PlaceOrder(PlaceOrderArgs),
295
296    /// 改单 / 撤单 / 启停订单(Python SDK `OpenTradeContext.modify_order`)
297    ///
298    /// **响应语义**(v1.4.111 P2-5 doc 沉淀,对齐 C++ APIServer_Trd_ModifyOrder by-design):
299    /// `ret_type=0` 仅表示 backend 接受了 modify 操作(operation ACK)。**不**保证下游
300    /// `futucli order` / `/api/orders` 查询立即看到新 price/qty/status。Race window 通常
301    /// < 2s(backend push 异步同步 daemon orders cache)。
302    ///
303    /// **正确 client pattern**(ack-based):
304    ///   - modify-order 返 ret_type=0 → assume backend 接受
305    ///   - sleep 1-2s 或订阅 push event 后 retry `futucli order` 看新状态
306    ///   - v1.4.109 stub TTL guard fallback 兜底(2s+ 无 push 主动 refresh orders)
307    ///
308    /// **不修原因**: C++ OpenD 同条件也只返 operation ACK,Rust 同 C++ 行为 = by-design
309    /// 对齐(pitfall #51 "对齐 C++ = 减法, 不超越")。
310    ModifyOrder(ModifyOrderArgs),
311
312    /// 撤单(modify-order 的常用快捷方式,op=CANCEL)
313    CancelOrder(CancelOrderArgs),
314
315    /// 二次确认订单(Python SDK `OpenTradeContext.reconfirm_order`)
316    ReconfirmOrder(ReconfirmOrderArgs),
317
318    /// 查询历史订单(Python SDK `OpenTradeContext.history_order_list_query`)
319    HistoryOrders(HistoryOrdersArgs),
320
321    /// 查询历史成交(Python SDK `OpenTradeContext.history_deal_list_query`)
322    HistoryDeals(HistoryDealsArgs),
323
324    /// 查最大可买/可卖(Python SDK `OpenTradeContext.acctradinginfo_query`)
325    MaxQtys(MaxQtysArgs),
326
327    /// 查询组合订单最大可交易数量(Futu API v10.7 `get_combo_max_trd_qtys`,proto-json)
328    ComboMaxTrdQtys(ComboMaxTrdQtysArgs),
329
330    /// 组合期权下单(Futu API v10.7 `place_combo_order`,proto-json)
331    ComboOrder(ComboOrderArgs),
332
333    /// 查询融资融券比率(对齐 py-futu-api `get_margin_ratio`;v1.4.31)
334    MarginRatio(MarginRatioArgs),
335
336    /// 查询订单费用明细(对齐 py-futu-api `order_fee_query`;v1.4.31)
337    OrderFee(OrderFeeArgs),
338    /// 资金流向时间序列
339    CapitalFlow(CapitalFlowArgs),
340    /// 资金分布快照(超大/大/中/小单流入流出)
341    CapitalDistribution { symbol: String },
342    /// 公司详情标签(Futu API v10.6 `get_company_profile`)
343    CompanyProfile(CompanyProfileArgs),
344    /// 公司高管信息(Futu API v10.6 `get_company_executives`)
345    CompanyExecutives(CompanyExecutivesArgs),
346    /// 公司高管背景(Futu API v10.6 `get_company_executive_background`)
347    CompanyExecutiveBackground(CompanyExecutiveBackgroundArgs),
348    /// 公司经营效率(Futu API v10.6 `get_company_operational_efficiency`)
349    CompanyOperationalEfficiency(CompanyOperationalEfficiencyArgs),
350    /// 财报日前后价格表现(Futu API v10.6 `get_financials_earnings_price_move`)
351    FinancialsEarningsPriceMove(FinancialsEarningsPriceMoveArgs),
352    /// 财报日前后股价历史(Futu API v10.6 `get_financials_earnings_price_history`)
353    FinancialsEarningsPriceHistory(FinancialsEarningsPriceHistoryArgs),
354    /// 财务报表(Futu API v10.6 `get_financials_statements`)
355    FinancialsStatements(FinancialsStatementsArgs),
356    /// 主营构成(Futu API v10.6 `get_financials_revenue_breakdown`)
357    FinancialsRevenueBreakdown(FinancialsRevenueBreakdownArgs),
358    /// 分析师评级概述(Futu API v10.6 `get_research_analyst_consensus`)
359    ResearchAnalystConsensus(ResearchAnalystConsensusArgs),
360    /// 评级汇总/详情(Futu API v10.6 `get_research_rating_summary`)
361    ResearchRatingSummary(ResearchRatingSummaryArgs),
362    /// 晨星研究报告(Futu API v10.6 `get_research_morningstar_report`)
363    ResearchMorningstarReport(ResearchMorningstarReportArgs),
364    /// 个股/指数估值详情(Futu API v10.6 `get_valuation_detail`)
365    ValuationDetail(ValuationDetailArgs),
366    /// 板块/指数成分股估值列表(Futu API v10.6 `get_valuation_plate_stock_list`)
367    ValuationPlateStockList(ValuationPlateStockListArgs),
368    /// 股票筛选(Futu API v10.6 `stock_screen`)
369    StockScreen(StockScreenArgs),
370    /// 期权筛选(Futu API v10.6 `option_screen`)
371    OptionScreen(OptionScreenArgs),
372    /// 窝轮筛选(Futu API v10.6 `warrant_screen`)
373    WarrantScreen(WarrantScreenArgs),
374    /// 技术指标异动(Futu API v10.6 `get_technical_unusual`)
375    TechnicalUnusual(TechnicalUnusualArgs),
376    /// 财务异动(Futu API v10.6 `get_financial_unusual`)
377    FinancialUnusual(FinancialUnusualArgs),
378    /// 衍生品异动(Futu API v10.6 `get_derivative_unusual`)
379    DerivativeUnusual(DerivativeUnusualArgs),
380    /// 回购记录(Futu API v10.6 `get_corporate_actions_buybacks`)
381    CorporateActionsBuybacks(CorporateActionsBuybacksArgs),
382    /// 分红派息(Futu API v10.6 `get_corporate_actions_dividends`)
383    CorporateActionsDividends(CorporateActionsDividendsArgs),
384    /// 拆合股(Futu API v10.6 `get_corporate_actions_stock_splits`)
385    CorporateActionsStockSplits(CorporateActionsStockSplitsArgs),
386    /// 每日卖空成交(Futu API v10.6 `get_daily_short_volume`)
387    DailyShortVolume(DailyShortVolumeArgs),
388    /// 空头持仓(Futu API v10.6 `get_short_interest`)
389    ShortInterest(ShortInterestArgs),
390    /// 十大买卖经纪(Futu API v10.6 `get_top_ten_buy_sell_brokers`)
391    TopTenBuySellBrokers(TopTenBuySellBrokersArgs),
392    /// 持股统计(Futu API v10.6 `get_shareholders_overview`)
393    ShareholdersOverview(ShareholdersOverviewArgs),
394    /// 股东持股变动(Futu API v10.6 `get_shareholders_holding_changes`)
395    ShareholdersHoldingChanges(ShareholdersHoldingChangesArgs),
396    /// 股东持股明细(Futu API v10.6 `get_shareholders_holder_detail`)
397    ShareholdersHolderDetail(ShareholdersHolderDetailArgs),
398    /// 机构持股统计(Futu API v10.6 `get_shareholders_institutional`)
399    ShareholdersInstitutional(ShareholdersInstitutionalArgs),
400    /// 内部人持股列表(Futu API v10.6 `get_insider_holder_list`)
401    InsiderHolderList(InsiderHolderListArgs),
402    /// 内部人交易列表(Futu API v10.6 `get_insider_trade_list`)
403    InsiderTradeList(InsiderTradeListArgs),
404    /// 期权波动率分析(Futu API v10.6 `get_option_volatility`)
405    OptionVolatility(OptionVolatilityArgs),
406    /// 期权行权概率(Futu API v10.6 `get_option_exercise_probability`)
407    OptionExerciseProbability(OptionExerciseProbabilityArgs),
408    /// 组合/单腿期权行情(Futu API v10.7 `get_option_quote`,proto-json)
409    OptionQuote(ProtoJsonArgs),
410    /// 组合期权策略列表(Futu API v10.7 `get_option_strategy`,proto-json)
411    OptionStrategy(ProtoJsonArgs),
412    /// 组合期权策略分析(Futu API v10.7 `get_option_strategy_analysis`,proto-json)
413    OptionStrategyAnalysis(ProtoJsonArgs),
414    /// 组合期权有效价差(Futu API v10.7 `get_option_strategy_spread`,proto-json)
415    OptionStrategySpread(ProtoJsonArgs),
416    /// 市场状态查询(开盘/休市/午休)
417    MarketState {
418        /// 证券列表,逗号分隔,如 HK.00700,US.AAPL
419        symbols: String,
420    },
421
422    /// 股票所属板块
423    OwnerPlate {
424        /// 证券列表,逗号分隔
425        symbols: String,
426    },
427
428    /// 期权链(按到期日列出 call/put 合约)
429    OptionChain {
430        /// 正股 MARKET.CODE,如 HK.00700 / US.AAPL(位置参数或 --owner / --code 二选一)
431        #[arg(index = 1, value_name = "OWNER")]
432        owner: Option<String>,
433        /// v1.4.52 BUG-9: REST/MCP 风格命名参数 alias
434        #[arg(long = "owner", visible_alias = "code", conflicts_with = "owner")]
435        owner_arg: Option<String>,
436        /// 到期日范围开始 YYYY-MM-DD
437        #[arg(long)]
438        begin: String,
439        /// 到期日范围结束 YYYY-MM-DD
440        #[arg(long)]
441        end: String,
442        /// 期权类型:all|call|put(默认 all)
443        #[arg(long, default_value = "all")]
444        option_type: String,
445        /// Greek filter: delta 下限
446        #[arg(long)]
447        delta_min: Option<f64>,
448        /// Greek filter: delta 上限
449        #[arg(long)]
450        delta_max: Option<f64>,
451        /// Greek filter: implied volatility 下限(小数,如 0.3 = 30%)
452        #[arg(long)]
453        iv_min: Option<f64>,
454        /// Greek filter: implied volatility 上限(小数,如 0.3 = 30%)
455        #[arg(long)]
456        iv_max: Option<f64>,
457        /// Greek filter: open interest 下限
458        #[arg(long)]
459        oi_min: Option<f64>,
460        /// Greek filter: open interest 上限
461        #[arg(long)]
462        oi_max: Option<f64>,
463        /// Greek filter: gamma 下限
464        #[arg(long)]
465        gamma_min: Option<f64>,
466        /// Greek filter: gamma 上限
467        #[arg(long)]
468        gamma_max: Option<f64>,
469        /// Greek filter: vega 下限
470        #[arg(long)]
471        vega_min: Option<f64>,
472        /// Greek filter: vega 上限
473        #[arg(long)]
474        vega_max: Option<f64>,
475        /// Greek filter: theta 下限
476        #[arg(long)]
477        theta_min: Option<f64>,
478        /// Greek filter: theta 上限
479        #[arg(long)]
480        theta_max: Option<f64>,
481    },
482
483    // ===== v1.4.30 市场元数据 / 复权 / 自选 / 撤单 =====
484    /// 交易日列表(对齐 py-futu-api `request_trading_days`)
485    TradingDays {
486        /// 市场:HK / US / CN / NT / ST / JP / SG
487        #[arg(long)]
488        market: String,
489        /// 起始日期 YYYY-MM-DD
490        #[arg(long)]
491        begin: String,
492        /// 结束日期 YYYY-MM-DD
493        #[arg(long)]
494        end: String,
495    },
496
497    /// 复权因子(对齐 py-futu-api `get_rehab`;长期 K 线对齐 / 回测必用)
498    Rehab {
499        /// 证券 MARKET.CODE,如 HK.00700 / US.AAPL
500        symbol: String,
501    },
502
503    /// 停牌日查询(对齐 py-futu-api `get_suspend`)
504    Suspend {
505        /// 证券列表,逗号分隔(位置参数或 --code / --symbols 二选一)
506        #[arg(index = 1, value_name = "SYMBOLS")]
507        symbols: Option<String>,
508        /// v1.4.52 BUG-9: REST/MCP 风格命名参数 alias
509        #[arg(long = "code", visible_alias = "symbols", conflicts_with = "symbols")]
510        symbols_arg: Option<String>,
511        /// 起始日期 YYYY-MM-DD
512        #[arg(long)]
513        begin: String,
514        /// 结束日期 YYYY-MM-DD
515        #[arg(long)]
516        end: String,
517    },
518
519    /// 自选股分组下的股票(对齐 py-futu-api `get_user_security`)
520    UserSecurity {
521        /// 分组名(位置参数或 --group 二选一,用 `user-security-groups` 先看可用分组)
522        #[arg(index = 1, value_name = "GROUP")]
523        group: Option<String>,
524        /// v1.4.52 BUG-9: REST/MCP 风格命名参数 alias
525        #[arg(long = "group", conflicts_with = "group")]
526        group_arg: Option<String>,
527    },
528
529    /// 自选股分组列表(对齐 py-futu-api `get_user_security_group`)
530    UserSecurityGroups {
531        /// 分组类型:1=自定义 / 2=系统 / 3=全部(默认 3)
532        #[arg(long, default_value_t = 3)]
533        group_type: i32,
534    },
535
536    /// 涡轮列表(对齐 py-futu-api `get_warrant`;按成交量降序)
537    Warrant {
538        /// 可选正股 MARKET.CODE(不传则全市场)
539        #[arg(long)]
540        owner: Option<String>,
541        /// 分页起始 index (默认 0). v1.4.106 codex 0635 ζ36 F1: 暴露分页参数,
542        /// 拿下一页用 `--begin 20 --num 20` (响应含 last_page / all_count)
543        #[arg(long, default_value_t = 0)]
544        begin: i32,
545        /// 最大行数(0-200,默认 20;0 表示空页请求)
546        #[arg(long, default_value_t = 20)]
547        num: i32,
548    },
549
550    /// 新股 IPO 列表(对齐 py-futu-api `get_ipo_list`)
551    IpoList {
552        /// 市场:HK=1 / HK_FUTURE=2 / US=11 / CN/SH=21 / SZ=22 / SG=31 / JP=41 / MY=61
553        #[arg(long)]
554        market: String,
555    },
556
557    /// 期货合约资料(对齐 py-futu-api `get_future_info`)
558    FutureInfo {
559        /// 期货代码列表,逗号分隔(如 HK.HSImain / US.MNQmain)
560        symbols: String,
561    },
562
563    /// 条件选股最小版(对齐 py-futu-api `get_stock_filter`;高级过滤走 REST)
564    StockFilter {
565        /// 市场:HK=1 / HK_FUTURE=2 / US=11 / CN/SH=21 / SZ=22
566        #[arg(long)]
567        market: String,
568        /// 分页起始(默认 0)
569        #[arg(long, default_value_t = 0)]
570        begin: i32,
571        /// 返回行数(0-200,默认 50;0 表示空页请求)
572        #[arg(long, default_value_t = 50)]
573        num: i32,
574    },
575
576    /// 全部撤单(对齐 py-futu-api `cancel_all_order`)
577    ///
578    /// ⚠️ 风险:立即撤该账户**指定市场**(不传 --market 则全账户)所有
579    /// pending 订单,不可恢复。real env 必须 `--confirm`。
580    CancelAllOrder {
581        /// 账户 id;也可改用 --card-num 传 App 显示卡号
582        #[arg(index = 1, value_name = "ACC_ID")]
583        acc_id: Option<u64>,
584        /// App 显示卡号:4 位末尾或 16 位完整卡号
585        #[arg(long = "card-num")]
586        card_num: Option<String>,
587        /// 环境:simulate(默认)/ real
588        #[arg(long, default_value = "simulate")]
589        env: String,
590        /// 市场:HK / US / HKCC / CN(可选,不传则全账户)
591        #[arg(long)]
592        market: Option<String>,
593        /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
594        #[arg(long = "jp-acc-type")]
595        jp_acc_type: Option<i32>,
596        /// real 环境必须带此 flag 确认(防误触)
597        #[arg(long)]
598        confirm: bool,
599    },
600
601    /// 网关全局状态(市场开闭 / 服务器版本 / 登录状态)
602    GlobalState,
603
604    /// 用户信息(昵称 / 各市场行情权限 / 订阅配额 / 历史 K 线配额)
605    UserInfo,
606
607    /// 行情权限概览(C++ OpenD GUI 风格分组;可选刷新最高行情权限)
608    QuoteRights(QuoteRightsArgs),
609
610    /// 延迟统计(行情推送 / 请求 / 下单三类延迟分布概要)
611    DelayStatistics,
612
613    /// v1.4.98 T2-8: NN+MM token 启用/绑定状态查询. unlock-trade -20011 时
614    /// 第一线诊断 (NN=Futu Token app, MM=moomoo Token app, 同协议异 app brand).
615    /// 输出 4 字段: nn/mm × enable/bind (1=已启用/绑定, 0=未启用/未绑定).
616    TokenState,
617
618    /// v1.4.98 T2-2: 无风险利率 (HK/US/JP, 期权定价基准). backend cmd 20231.
619    /// 输出 3 市场利率 (百分比 + raw uint64) + update_time.
620    RiskFreeRate,
621
622    /// v1.4.98 T2-1: 摆盘步长 (价位表) — backend cmd 6503.
623    /// PlaceOrder/ModifyOrder 校验价格合法性必备.
624    SpreadTable,
625
626    /// v1.4.98 T2-3: 逐笔统计 (avg_price / 主买/主卖/中性量等) — cmd 6365.
627    /// 前置: symbol 必须先 subscribe / get_static_info 触发 stock_id 缓存.
628    ///
629    /// v1.4.102 A3 alias: 加 positional `[SYMBOL]` 短写, 跟其他行情类
630    /// command (quote / snapshot / kline) 一致. `futucli ticker-statistic
631    /// HK.00700` 等同 `--symbol HK.00700`.
632    TickerStatistic(TickerStatisticArgs),
633
634    /// v1.4.106 codex 0500 ζ23-redo: 逐笔统计 Detail (价位级分布) — cmd 6366.
635    /// 配套 `ticker-statistic` (Info, cmd 6365): 先调 Info 拿 `ticker_time`,
636    /// 再调 Detail 同 `ticker_time` 拿这个时点的 DetailItem 列表 (price /
637    /// buy_volume / sell_volume / volume / ratio / neutral_volume).
638    /// 前置: symbol 必须先 subscribe / get_static_info 触发 stock_id 缓存.
639    TickerStatisticDetail(TickerStatisticDetailArgs),
640
641    // ===== v1.4.30 P2(100% 覆盖) =====
642    /// 查询当前订阅状态(已用 / 剩余额度 + 订阅清单)
643    QuerySubscription(QuerySubscriptionArgs),
644
645    /// 查询当前 daemon 已用订阅额度与历史 K 线额度
646    UsedQuota,
647
648    /// 反订阅行情数据(也可 --all 清空本连接所有订阅)
649    Unsubscribe(UnsubscribeArgs),
650
651    /// 历史 K 线下载配额
652    HistoryKlQuota(HistoryKlQuotaArgs),
653
654    /// 持股变动(高管 / 机构 / 基金)
655    HoldingChange {
656        /// 证券 MARKET.CODE
657        symbol: String,
658        /// 持有者类别:1=机构 / 2=基金 / 3=高管
659        #[arg(long, default_value_t = 3)]
660        category: i32,
661        /// 开始时间 YYYY-MM-DD HH:MM:SS(可选)
662        #[arg(long)]
663        begin: Option<String>,
664        /// 结束时间(可选)
665        #[arg(long)]
666        end: Option<String>,
667    },
668
669    /// 修改自选股分组(add / del / move_out)
670    ModifyUserSecurity {
671        /// 分组名
672        group: String,
673        /// 操作:1=AddInto / 2=Delete / 3=MoveOut
674        #[arg(long)]
675        op: i32,
676        /// 证券列表,逗号分隔
677        symbols: String,
678    },
679
680    /// 股票代码变更 / 临时代码信息(目前仅港股)
681    CodeChange {
682        /// 证券列表,逗号分隔
683        symbols: String,
684    },
685
686    /// 设置到价提醒
687    SetPriceReminder {
688        /// 证券 MARKET.CODE
689        symbol: String,
690        /// 操作:1=Add / 2=Del / 3=Enable / 4=Disable / 5=Modify / 6=DelAll
691        #[arg(long)]
692        op: i32,
693        /// 提醒 key(modify/del/enable/disable 时必填)
694        #[arg(long)]
695        key: Option<i64>,
696        /// 提醒类型 (1=PriceUp 2=PriceDown 3=ChangeRateUp 4=ChangeRateDown
697        /// 5=5MinChangeRateUp 6=5MinChangeRateDown 7=VolumeUp 8=TurnoverUp
698        /// 9=TurnoverRateUp 10=BidPriceUp 11=AskPriceDown 12=BidVolUp 13=AskVolUp
699        /// 14=3MinChangeRateUp 15=3MinChangeRateDown — 见 Qot_Common.PriceReminderType)
700        #[arg(long)]
701        r#type: Option<i32>,
702        /// 频率(1=Always 2=OncePerDay 3=Once)
703        #[arg(long)]
704        freq: Option<i32>,
705        /// 阈值(add/modify 必填)
706        #[arg(long)]
707        value: Option<f64>,
708        /// 备注 (最多 40 半角字节 / 20 中文字符, 对齐 C++ NoteMaxLen)
709        #[arg(long)]
710        note: Option<String>,
711        /// v1.4.106 codex 1116 F4 [P2]: reminder session list, 逗号分隔.
712        /// (1=Open 2=USPre 3=USAfter 4=USOverNight)
713        /// 美股 + 留空 → daemon 默认补 [Open, USPre, USAfter] (对齐 C++).
714        #[arg(long, value_delimiter = ',')]
715        session: Vec<i32>,
716    },
717
718    /// 查询到价提醒(按 symbol 或 market)
719    PriceReminder {
720        /// 证券(和 --market 二选一)
721        #[arg(long)]
722        symbol: Option<String>,
723        /// C++ 到价提醒市场桶:HK=1 HK_FUTURE=6 US=11 SH/CN=21 SZ=22(和 --symbol 二选一)
724        #[arg(long)]
725        market: Option<String>,
726    },
727
728    /// 期权到期日列表
729    OptionExpirationDate {
730        /// 标的股 MARKET.CODE(位置参数或 --owner 二选一)
731        #[arg(index = 1, value_name = "OWNER")]
732        owner: Option<String>,
733        /// v1.4.52 BUG-9: REST/MCP 风格命名参数 alias
734        #[arg(long = "owner", conflicts_with = "owner")]
735        owner_arg: Option<String>,
736        /// 指数期权类型(仅恒指/国指)
737        #[arg(long)]
738        index_type: Option<i32>,
739    },
740
741    /// 订阅账户推送(订单 / 成交)
742    SubAccPush {
743        /// 账户 id 列表,逗号分隔
744        acc_ids: String,
745    },
746
747    /// 账户资金流水(对齐 `get_acc_cash_flow`)
748    AccCashFlow(AccCashFlowArgs),
749
750    /// v1.4.32+ daemon 健康状态快照(GET /api/admin/status)。
751    /// 同事提议的"快速看 daemon 在线不、broker 通不通、解锁没"工具。
752    /// scope 模式下 key 必须持 `admin` scope,否则被 bearer_auth 拒。
753    #[command(name = "daemon-status")]
754    DaemonStatus(DaemonStatusArgs),
755
756    /// v1.4.32+ 优雅退出 daemon(POST /api/admin/shutdown)。
757    /// daemon 响应 200 表示已接收 shutdown 请求;实际退出走 opend 统一
758    /// graceful shutdown 路径。是否重启由进程 supervisor(systemd / Docker)
759    /// 决定。
760    #[command(name = "daemon-shutdown")]
761    DaemonShutdown(DaemonShutdownArgs),
762
763    /// v1.4.32+ 重置 trade cipher 缓存(POST /api/admin/reload)。
764    /// 用于"解锁状态错乱 / 换了交易密码"场景——清空 cipher 缓存后客户端
765    /// 必须重新 unlock-trade。不重启 daemon 进程,不影响 Platform / broker
766    /// TCP 连接。
767    #[command(name = "daemon-reload")]
768    DaemonReload(DaemonReloadArgs),
769
770    // ========================================================================
771    // v1.4.94 / v1.4.95 Tier M (mobile-driven extensions): 11 subcommand 镜像
772    // REST + MCP. 全 only-read (acc:read scope). 见 cmd/tier_m.rs.
773    // ========================================================================
774    /// 资金明细查询 (mobile-driven, 比 acc-cash-flow 字段更全) — v1.4.94 M1
775    ///
776    /// v1.4.102 A3 alias: positional `[ACC_ID]` 短写
777    /// (`futucli cash-log 12345 --begin-time ...` 等同 `--acc-id 12345`).
778    #[command(name = "cash-log")]
779    CashLog(CashLogArgs),
780
781    /// 单条资金流水详情 — v1.4.94 M1 + v1.4.102 A3 positional alias
782    #[command(name = "cash-detail")]
783    CashDetail(CashDetailArgs),
784
785    /// 业务分类元数据 — v1.4.94 M1 + v1.4.102 A3 positional alias
786    #[command(name = "biz-group")]
787    BizGroup(BizGroupArgs),
788
789    /// per-account margin info (HK / US / CN_AH) — v1.4.95 U2-D
790    ///
791    /// 与 `margin-ratio` (per-security ratio) 互补: 本命令给账户全景
792    /// (购买力 / 杠杆 / 风险等级 / 流动性 / HK-specific 港股保证金).
793    #[command(name = "margin-info")]
794    MarginInfo(MarginInfoArgs),
795
796    /// 账户合规标志查询 — v1.4.95 U2-A
797    ///
798    /// 高级交易准入 (期权 / 衍生品 / OTC / CFD 等) 强制要求.
799    /// 常用 flag_id: 5=US 期权确认, 22=衍生品风批 (合并新), 10=基金 KYC,
800    /// 16=PDT 风披, 23=美股 OTC. 详见 proto 头部完整 36+ 项列表.
801    #[command(name = "account-flag")]
802    AccountFlag(AccountFlagArgs),
803
804    /// 账户债券总持仓 (P&L 汇总) — v1.4.95 U2-B
805    #[command(name = "bond-total-asset")]
806    BondTotalAsset(BondTotalAssetArgs),
807
808    /// 单只债券持仓 (含派息/到期/通知) — v1.4.95 U2-B
809    #[command(name = "bond-single-asset")]
810    BondSingleAsset(BondSingleAssetArgs),
811
812    /// 账户债券持仓列表 — v1.4.95 U2-B
813    #[command(name = "bond-position-list")]
814    BondPositionList(BondPositionListArgs),
815
816    /// 是否需要答题 (suitability questionnaire) — v1.4.95 U2-B
817    #[command(name = "bond-answer-state")]
818    BondAnswerState(BondAnswerStateArgs),
819
820    /// 交易提醒 (是否可买/复杂/高风险/可卖/资格预审) — v1.4.95 U2-B
821    #[command(name = "bond-trade-reminder")]
822    BondTradeReminder(BondTradeReminderArgs),
823}