Skip to main content

futu_core/
proto_id.rs

1//! FutuOpenD API 协议 ID 常量
2//!
3//! 对应 C++ 中 `FTAPI_Define_ProtoID.h` 的定义。客户端与 OpenD 网关之间的
4//! 通信协议标识。
5//!
6//! **Stable API** — 所有常量均为稳定 ABI,外部 binary 可依赖。新增常量不算
7//! breaking;修改已有常量值 = breaking(C++ 对齐约束下不应发生)。
8
9// ========== 连接管理 ==========
10pub const INIT_CONNECT: u32 = 1001;
11pub const GET_GLOBAL_STATE: u32 = 1002;
12pub const NOTIFY: u32 = 1003;
13pub const KEEP_ALIVE: u32 = 1004;
14
15// ========== 额度查询 ==========
16pub const GET_USED_QUOTA: u32 = 1010;
17
18// ========== 行情协议 ==========
19pub const QOT_SUB: u32 = 3001;
20pub const QOT_REG_QOT_PUSH: u32 = 3002;
21pub const QOT_GET_SUB_INFO: u32 = 3003;
22pub const QOT_GET_BASIC_QOT: u32 = 3004;
23pub const QOT_UPDATE_BASIC_QOT: u32 = 3005;
24pub const QOT_GET_KL: u32 = 3006;
25pub const QOT_UPDATE_KL: u32 = 3007;
26pub const QOT_GET_RT: u32 = 3008;
27pub const QOT_UPDATE_RT: u32 = 3009;
28pub const QOT_GET_TICKER: u32 = 3010;
29pub const QOT_UPDATE_TICKER: u32 = 3011;
30pub const QOT_GET_ORDER_BOOK: u32 = 3012;
31pub const QOT_UPDATE_ORDER_BOOK: u32 = 3013;
32pub const QOT_GET_BROKER: u32 = 3014;
33pub const QOT_UPDATE_BROKER: u32 = 3015;
34pub const QOT_GET_ORDER_DETAIL: u32 = 3016;
35pub const QOT_UPDATE_ORDER_DETAIL: u32 = 3017;
36
37pub const QOT_GET_HISTORY_KL: u32 = 3100;
38pub const QOT_GET_HISTORY_KL_POINTS: u32 = 3101;
39pub const QOT_REQUEST_HISTORY_KL: u32 = 3103;
40
41pub const QOT_GET_TRADE_DATE: u32 = 3200;
42pub const QOT_GET_SUSPEND: u32 = 3201;
43pub const QOT_GET_STATIC_INFO: u32 = 3202;
44pub const QOT_GET_SECURITY_SNAPSHOT: u32 = 3203;
45pub const QOT_GET_PLATE_SET: u32 = 3204;
46pub const QOT_GET_PLATE_SECURITY: u32 = 3205;
47pub const QOT_GET_REFERENCE: u32 = 3206;
48pub const QOT_GET_OWNER_PLATE: u32 = 3207;
49pub const QOT_GET_HOLDING_CHANGE_LIST: u32 = 3208;
50pub const QOT_GET_OPTION_CHAIN: u32 = 3209;
51pub const QOT_GET_REHAB: u32 = 3702;
52
53// 新版 API
54pub const QOT_GET_WARRANT: u32 = 3210;
55pub const QOT_GET_CAPITAL_FLOW: u32 = 3211;
56pub const QOT_GET_CAPITAL_DISTRIBUTION: u32 = 3212;
57pub const QOT_GET_USER_SECURITY: u32 = 3213;
58pub const QOT_MODIFY_USER_SECURITY: u32 = 3214;
59pub const QOT_STOCK_FILTER: u32 = 3215;
60pub const QOT_GET_CODE_CHANGE: u32 = 3216;
61pub const QOT_GET_IPO_LIST: u32 = 3217;
62pub const QOT_GET_FUTURE_INFO: u32 = 3218;
63pub const QOT_REQUEST_TRADE_DATE: u32 = 3219;
64pub const QOT_SET_PRICE_REMINDER: u32 = 3220;
65pub const QOT_GET_PRICE_REMINDER: u32 = 3221;
66pub const QOT_GET_USER_SECURITY_GROUP: u32 = 3222;
67pub const QOT_GET_MARKET_STATE: u32 = 3223;
68pub const QOT_GET_OPTION_EXPIRATION_DATE: u32 = 3224;
69pub const QOT_UPDATE_PRICE_REMINDER: u32 = 3019;
70pub const QOT_REQUEST_HISTORY_KL_QUOTA: u32 = 3104;
71pub const QOT_REQUEST_REHAB: u32 = 3105;
72
73// 交易新版 API
74pub const TRD_GET_MARGIN_RATIO: u32 = 2223;
75pub const TRD_GET_ORDER_FEE: u32 = 2225;
76pub const TRD_FLOW_SUMMARY: u32 = 2226;
77
78// v1.4.94 Tier M (mobile-driven extension): 资金明细 — daemon 自定义 FTAPI cmd
79//
80// FTAPI client→daemon proto_id (无 OpenD 对应). daemon 内部用 backend TCP cmd
81// 3000/3001/3002 (mobile `clt_cmd_trade_cash_log` / `_cash_detail` /
82// `_bussiness_type` 同号) 转发到 `realtime_asset_log` microservice.
83//
84// 见 `proto-internal/realtime_asset_log.proto` 头部注释.
85pub const TRD_GET_CASH_LOG: u32 = 22701; // mobile clt_cmd 3000
86pub const TRD_GET_CASH_DETAIL: u32 = 22702; // mobile clt_cmd 3001
87pub const TRD_GET_BIZ_GROUP: u32 = 22703; // mobile clt_cmd 3002
88
89// daemon→backend NN cmd_id (固定常量, mobile 用同 namespace)
90pub const NN_CMD_GET_CASH_LOG: u16 = 3000;
91pub const NN_CMD_GET_CASH_DETAIL: u16 = 3001;
92pub const NN_CMD_GET_BIZ_GROUP: u16 = 3002;
93
94// v1.4.95 U2-D Tier M (mobile-driven extension): margin account info per market
95// FTAPI client→daemon proto_id (单一 endpoint, daemon 按 market 路由 cmd)
96pub const TRD_GET_MARGIN_INFO: u32 = 22704;
97// daemon→backend NN cmd_id (mobile clt_cmd_*_margin_info 同号, 按市场切)
98pub const NN_CMD_HK_MARGIN_INFO: u16 = 3101;
99pub const NN_CMD_US_MARGIN_INFO: u16 = 3102;
100pub const NN_CMD_CN_AH_MARGIN_INFO: u16 = 3107;
101
102// v1.4.95 U2-A Tier M (mobile-driven extension): account compliance flags
103// 用于查询账户合规状态 (产品准入 / 风险评估 / opt-in 标志).
104// 高级交易准入 (期权 / 衍生品 / OTC / CFD 等) 强制要求.
105pub const TRD_GET_ACCOUNT_FLAG: u32 = 22705; // FTAPI client→daemon
106pub const NN_CMD_PULL_ACCOUNT_FLAG: u16 = 5281; // backend NN cmd (NN_ProtoCmd_Pull_AccountFlag)
107
108// v1.4.95 U2-B Tier M (mobile-driven extension): bond holdings + trade prep
109// 5 endpoints — 债券 holdings (账户总持仓 / 单只 / 列表) + 交易 prep
110// (是否需要答题 / 交易提醒). 仅 HK / US / SG 债券账户有数据, 其他账户优雅返空.
111// FTAPI client→daemon proto_id (5 个独立 endpoint, 各自映射 mobile cmd):
112pub const TRD_GET_BOND_TOTAL_ASSET: u32 = 22706; // 账户债券总持仓
113pub const TRD_GET_BOND_SINGLE_ASSET: u32 = 22707; // 单只债券持仓
114pub const TRD_GET_BOND_POSITION_LIST: u32 = 22708; // 账户债券持仓列表
115pub const TRD_GET_BOND_ANSWER_STATE: u32 = 22709; // 是否需要答题
116pub const TRD_GET_BOND_TRADE_REMINDER: u32 = 22710; // 交易提醒 (是否可买/复杂/高风险等)
117// daemon→backend NN cmd_id (mobile clt_cmd_* 同号)
118pub const NN_CMD_BOND_TOTAL_ASSET: u16 = 9373; // clt_cmd_cash_treasure_bond_total_asset
119pub const NN_CMD_BOND_SINGLE_ASSET: u16 = 9374; // clt_cmd_cash_treasure_bond_single_asset
120pub const NN_CMD_BOND_POSITION_LIST: u16 = 9375; // clt_cmd_cash_treasure_bond_account_position
121pub const NN_CMD_BOND_ANSWER_STATE: u16 = 10043; // clt_cmd_bond_answer_state
122pub const NN_CMD_BOND_TRADE_REMINDER: u16 = 10057; // clt_cmd_bond_trade_reminder
123
124// 其他
125pub const VERIFICATION: u32 = 1006;
126pub const GET_USER_INFO: u32 = 1005;
127pub const GET_DELAY_STATISTICS: u32 = 1007;
128pub const TEST_CMD: u32 = 1008;
129pub const REMOTE_CMD: u32 = 1009;
130
131// v1.4.98 T2-8 (mobile-source-audit Phase 2): NN+MM token 启用/绑定状态查询.
132// 来源: moomoo CFuTuToken.cpp:19 cmd 1326 CS_CMDID_NewToken_GetStateInfo +
133// proto futu_token.proto::GetTokenListRequest/Response (4 字段: nn/mm × enable/bind).
134// 用户 unlock-trade -20011 时第一线诊断 — 查双系 token 绑定情况.
135pub const GET_TOKEN_STATE: u32 = 1326;
136
137// v1.4.98 T2-2 (mobile-source-audit Phase 2): 无风险利率 (期权定价).
138// 来源: ftcnnproto/.../risk_free_rate_service.proto cmd 20231 GetRiskFreeRate
139// (注释明标"无加密"). 返 HK/US/JP 3 市场无风险利率 (放大 10^9 倍 uint64).
140pub const QOT_GET_RISK_FREE_RATE: u32 = 20231;
141
142// v1.4.98 T2-1 (mobile-source-audit Phase 2): 摆盘步长 (spread table).
143// 来源: cmd 6503 OpenD baseline 已路由 (NNBase_Define_ProtoCmd.h), daemon 漏 cover.
144pub const QOT_GET_SPREAD_TABLE: u32 = 6503;
145
146// v1.4.98 T2-3 (mobile-source-audit Phase 2): 逐笔统计 (TickerStatistic).
147// 来源: cmd 6365 (Info) + cmd 6366 (Detail) OpenD baseline +
148// proto-internal/FTCmdTickerStatistic6365-6366.proto.
149pub const QOT_GET_TICKER_STATISTIC: u32 = 6365;
150// v1.4.106 codex 0500 ζ23-redo: cmd 6366 是 "Detail" (StatisticData 列表 +
151// max_ratio + have_more), 不是 push. 之前 v1.4.98 误命名 `_PUSH` 0 caller,
152// 本版整体重构为 `_DETAIL` 并补 full surface (proto / gateway / REST /
153// MCP / CLI / docs / scope / strict-fields 7 层).
154pub const QOT_GET_TICKER_STATISTIC_DETAIL: u32 = 6366;
155
156// ========== 交易协议 ==========
157pub const TRD_GET_ACC_LIST: u32 = 2001;
158pub const TRD_UNLOCK_TRADE: u32 = 2005;
159pub const TRD_SUB_ACC_PUSH: u32 = 2008;
160
161/// v1.4.102 codex 44 F1 (P1): daemon-internal proto_id for `/api/unsub-acc-push`.
162///
163/// **不是真 backend cmd_id** — backend `Trd_SubAccPush` proto 只有
164/// `acc_id_list`, 没有 sub/unsub 区分. daemon 用此 internal proto_id 路由到
165/// `UnsubAccPushHandler` (调 `unsubscribe_trd_acc` 真撤订阅), 不发 backend.
166///
167/// **0x80000000 标记 bit**: 内部合成 ID, 不与真 backend cmd_id 冲突. 真
168/// backend 看到此 ID 会 reject (但不会到达 backend, daemon-local handler
169/// 直接处理). 之前 v1.4.74 直接 forward TRD_SUB_ACC_PUSH 到同一 handler →
170/// 实际 silent re-subscribe (codex 44 F1 P1 bug). 现在: REST `/api/unsub-acc-push`
171/// 改路由到本 ID, daemon 加 dedicated handler 调 `unsubscribe_trd_acc`.
172pub const TRD_UNSUB_ACC_PUSH_INTERNAL: u32 = 0x8000_0000 | 2008;
173pub const TRD_GET_FUNDS: u32 = 2101;
174pub const TRD_GET_POSITION_LIST: u32 = 2102;
175pub const TRD_GET_MAX_TRD_QTYS: u32 = 2111;
176pub const TRD_GET_ORDER_LIST: u32 = 2201;
177pub const TRD_PLACE_ORDER: u32 = 2202;
178pub const TRD_MODIFY_ORDER: u32 = 2205;
179pub const TRD_UPDATE_ORDER: u32 = 2208;
180pub const TRD_GET_ORDER_FILL_LIST: u32 = 2211;
181pub const TRD_UPDATE_ORDER_FILL: u32 = 2218;
182pub const TRD_GET_HISTORY_ORDER_LIST: u32 = 2221;
183pub const TRD_GET_HISTORY_ORDER_FILL_LIST: u32 = 2222;
184pub const TRD_RECONFIRM_ORDER: u32 = 2237;
185pub const TRD_NOTIFY: u32 = 2240;
186
187/// **Stable API** — 判断协议 ID 是否为推送类型。
188///
189/// 跨 futu-net / futu-server 共享判定,避免两处独立 match 漂移。
190#[must_use]
191pub fn is_push_proto(proto_id: u32) -> bool {
192    matches!(
193        proto_id,
194        NOTIFY
195            | QOT_UPDATE_BASIC_QOT
196            | QOT_UPDATE_KL
197            | QOT_UPDATE_RT
198            | QOT_UPDATE_TICKER
199            | QOT_UPDATE_ORDER_BOOK
200            | QOT_UPDATE_BROKER
201            | QOT_UPDATE_ORDER_DETAIL
202            | QOT_UPDATE_PRICE_REMINDER
203            | TRD_UPDATE_ORDER
204            | TRD_UPDATE_ORDER_FILL
205            | TRD_NOTIFY
206    )
207}
208
209#[cfg(test)]
210mod tests;