futu_trd/currency/ids.rs
1/// Trd_Common.proto::Currency enum (对齐 C++ + Rust proto):
2/// 0=Unknown, 1=HKD, 2=USD, 3=CNH, 4=JPY, 5=SGD, 6=AUD, 7=CAD, 8=MYR.
3/// USDT (9) 不在 C++ 静态表里, 是 daemon-only 扩展 (USDT 不是 broker
4/// universal account 支持的法币, 不能 view 转换), 故不进 broker_currencies
5/// 任何 set.
6pub mod currency_id {
7 pub const HKD: i32 = 1;
8 pub const USD: i32 = 2;
9 pub const CNH: i32 = 3;
10 pub const JPY: i32 = 4;
11 pub const SGD: i32 = 5;
12 pub const AUD: i32 = 6;
13 pub const CAD: i32 = 7;
14 pub const MYR: i32 = 8;
15}
16
17/// Trd_Common.proto::SecurityFirm enum (对齐 C++):
18/// 1=FutuSecurities (Futu HK), 2=FutuInc (Moomoo US), 3=FutuSG, 4=FutuAU,
19/// 5=FutuCA (Moomoo CA), 6=FutuMY, 7=FutuJP.
20pub mod security_firm_id {
21 pub const FUTU_HK: i32 = 1; // FutuSecurities
22 pub const FUTU_US: i32 = 2; // FutuInc / Moomoo US
23 pub const FUTU_SG: i32 = 3;
24 pub const FUTU_AU: i32 = 4;
25 pub const FUTU_CA: i32 = 5; // Moomoo CA
26 pub const FUTU_MY: i32 = 6;
27 pub const FUTU_JP: i32 = 7;
28}
29
30/// C++ `NN_BrokerID` enum values used by trade-side broker TCP routing.
31///
32/// Ref: `FutuOpenD/Src/NNBase/NNBase_Define_Enum.h:131-139`.
33pub mod broker_id {
34 pub const FUTU_HK: u32 = 1001;
35 pub const FUTU_US: u32 = 1007;
36 pub const FUTU_SG: u32 = 1008;
37 pub const FUTU_AU: u32 = 1009;
38 pub const FUTU_JP: u32 = 1012;
39 pub const FUTU_MY: u32 = 1017;
40 pub const FUTU_CA: u32 = 1019;
41}
42
43/// Trade-side `Trd_Common.SecurityFirm` enum -> C++ `NN_BrokerID`.
44///
45/// This is the full trade broker mapping (1-7). QOT crypto surfaces have a
46/// stricter C++ gate and must keep their own helper.
47#[must_use]
48pub fn security_firm_to_broker_id(sf: i32) -> Option<u32> {
49 futu_core::trade_broker::broker_id_for_security_firm_like_cpp(sf)
50}
51
52/// `Trd_Common.proto::TrdMarket` enum (对齐 OpenD canonical NN_TrdMarket
53/// values, 不是 App `FTTradeEnableMarket` 也不是 backend raw `Account.market`).
54///
55/// 主市场:
56/// 1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG (全能账户/Universal),
57/// 8=AU, 15=JP, 111=MY, 112=CA.
58///
59/// 期货模拟 / 基金子市场 (v1.4.106 Finding D 收紧):
60/// 10=Futures_Simulate_HK, 11=Futures_Simulate_US, 12=Futures_Simulate_SG,
61/// 13=Futures_Simulate_JP (注意: 13 是 sim JP 期货, **不是** App
62/// `FTTradeEnableMarketHKFund=13`).
63/// 113=HK_Fund, 123=US_Fund, 124=SG_Fund, 125=MY_Fund, 126=JP_Fund.
64///
65/// **Per Finding D (codex 2026-05-01 source audit)**: 不要把 App enum 值
66/// (HK_FUND=13, US_FUND=23, SG_FUND=24) 当成 OpenAPI TrdMarket. App enums
67/// 见 `FTCTradeInterfaceDefine.h::FTTradeEnableMarket`, OpenAPI 见
68/// `Trd_Common.proto::TrdMarket` (这里的常量).
69///
70/// **注意**: `CachedTrdAcc.trd_market` 当前**存的是 backend raw
71/// `Account.market`** (见 `bridge/account.rs::account_to_cached:202`),
72/// backend raw 值 13=HK_Fund / 22=23=US_Fund / 24=SG_Fund 与 OpenAPI 113/123/124
73/// **不同**. 详见 `legacy_backend_fund_market_id::*` 常量, 用于在 cache 读
74/// 路径识别 fund 账户.
75pub mod trd_market_id {
76 pub const HK: i32 = 1;
77 pub const US: i32 = 2;
78 pub const CN: i32 = 3;
79 pub const HKCC: i32 = 4;
80 pub const FUTURES: i32 = 5;
81 pub const SG: i32 = 6; // "全能账户" / Universal account market code
82 pub const AU: i32 = 8;
83 pub const JP: i32 = 15;
84 pub const MY: i32 = 111;
85 pub const CA: i32 = 112;
86
87 // ── 模拟期权 / 模拟融资融券内部市场 ──
88 //
89 // Ref:
90 // - `FutuOpenD/Src/NNBase/NNBase_Define_Enum.h:168-175`
91 // - `FutuOpenD/Src/APIServer/Business/Trade/_APIServer_Trd_Comm.cpp:3148-3200`
92 //
93 // 这些值不是公开 `Trd_Common.proto::TrdMarket` 里的普通市场, 但 C++ 的
94 // `GetCurrencyByTrdMarket` / `GetTrdSecMarket` 会在交易读响应投影时识别它们。
95 // 因此它们只用于 response projection / cache 兼容, 不能拿来做用户入参枚举。
96 pub const SIM_US_OPTION: i32 = 7;
97 pub const SIM_HK_OPTION: i32 = 9;
98 pub const SIM_US_MARGIN: i32 = 100;
99
100 // ── Futures 模拟 (v1.4.106 Finding D) ──
101 pub const FUTURES_SIMULATE_HK: i32 = 10;
102 pub const FUTURES_SIMULATE_US: i32 = 11;
103 pub const FUTURES_SIMULATE_SG: i32 = 12;
104 /// **注意**: 13 是 OpenAPI sim JP 期货, **不是** App `FTTradeEnableMarketHKFund=13`.
105 pub const FUTURES_SIMULATE_JP: i32 = 13;
106
107 // ── Fund 子市场 (OpenAPI canonical NN_TrdMarket values) ──
108 pub const HK_FUND: i32 = 113;
109 pub const US_FUND: i32 = 123;
110 pub const SG_FUND: i32 = 124;
111 pub const MY_FUND: i32 = 125;
112 pub const JP_FUND: i32 = 126;
113}
114
115/// Backend raw `Account.market` fund 子市场值 (v1.4.106 Finding D).
116///
117/// `bridge/account.rs::account_to_cached` 把 backend raw 13/23/24 映射到
118/// `trd_market_auth_list` 用 NN_TrdMarket 值 113/123/124, **但** `acc.market`
119/// 字段 (top-level account market) 直接当 raw 存进 `CachedTrdAcc.trd_market`.
120/// 所以 cache-read 看 `trd_market` 时仍可能见 13/23/24 raw 值.
121///
122/// 这与 App `FTTradeEnableMarket` 数值碰巧 alias (HK_FUND=13 / US_FUND=23 /
123/// SG_FUND=24), 但 **来源完全不同** — 这里是 backend `FTUsrTrdAcc.proto`
124/// 下发的内部协议值. 不要用 App 上下文的语义解释.
125pub mod legacy_backend_fund_market_id {
126 pub const HK_FUND: i32 = 13;
127 pub const US_FUND_OLD: i32 = 22; // legacy old encoding
128 pub const US_FUND: i32 = 23;
129 pub const SG_FUND: i32 = 24;
130}