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}