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 match sf {
50 security_firm_id::FUTU_HK => Some(broker_id::FUTU_HK),
51 security_firm_id::FUTU_US => Some(broker_id::FUTU_US),
52 security_firm_id::FUTU_SG => Some(broker_id::FUTU_SG),
53 security_firm_id::FUTU_AU => Some(broker_id::FUTU_AU),
54 security_firm_id::FUTU_CA => Some(broker_id::FUTU_CA),
55 security_firm_id::FUTU_MY => Some(broker_id::FUTU_MY),
56 security_firm_id::FUTU_JP => Some(broker_id::FUTU_JP),
57 _ => None,
58 }
59}
60
61/// `Trd_Common.proto::TrdMarket` enum (对齐 OpenD canonical NN_TrdMarket
62/// values, 不是 App `FTTradeEnableMarket` 也不是 backend raw `Account.market`).
63///
64/// 主市场:
65/// 1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG (全能账户/Universal),
66/// 8=AU, 15=JP, 111=MY, 112=CA.
67///
68/// 期货模拟 / 基金子市场 (v1.4.106 Finding D 收紧):
69/// 10=Futures_Simulate_HK, 11=Futures_Simulate_US, 12=Futures_Simulate_SG,
70/// 13=Futures_Simulate_JP (注意: 13 是 sim JP 期货, **不是** App
71/// `FTTradeEnableMarketHKFund=13`).
72/// 113=HK_Fund, 123=US_Fund, 124=SG_Fund, 125=MY_Fund, 126=JP_Fund.
73///
74/// **Per Finding D (codex 2026-05-01 source audit)**: 不要把 App enum 值
75/// (HK_FUND=13, US_FUND=23, SG_FUND=24) 当成 OpenAPI TrdMarket. App enums
76/// 见 `FTCTradeInterfaceDefine.h::FTTradeEnableMarket`, OpenAPI 见
77/// `Trd_Common.proto::TrdMarket` (这里的常量).
78///
79/// **注意**: `CachedTrdAcc.trd_market` 当前**存的是 backend raw
80/// `Account.market`** (见 `bridge/account.rs::account_to_cached:202`),
81/// backend raw 值 13=HK_Fund / 22=23=US_Fund / 24=SG_Fund 与 OpenAPI 113/123/124
82/// **不同**. 详见 `legacy_backend_fund_market_id::*` 常量, 用于在 cache 读
83/// 路径识别 fund 账户.
84pub mod trd_market_id {
85 pub const HK: i32 = 1;
86 pub const US: i32 = 2;
87 pub const CN: i32 = 3;
88 pub const HKCC: i32 = 4;
89 pub const FUTURES: i32 = 5;
90 pub const SG: i32 = 6; // "全能账户" / Universal account market code
91 pub const AU: i32 = 8;
92 pub const JP: i32 = 15;
93 pub const MY: i32 = 111;
94 pub const CA: i32 = 112;
95
96 // ── 模拟期权 / 模拟融资融券内部市场 ──
97 //
98 // Ref:
99 // - `FutuOpenD/Src/NNBase/NNBase_Define_Enum.h:168-175`
100 // - `FutuOpenD/Src/APIServer/Business/Trade/_APIServer_Trd_Comm.cpp:3148-3200`
101 //
102 // 这些值不是公开 `Trd_Common.proto::TrdMarket` 里的普通市场, 但 C++ 的
103 // `GetCurrencyByTrdMarket` / `GetTrdSecMarket` 会在交易读响应投影时识别它们。
104 // 因此它们只用于 response projection / cache 兼容, 不能拿来做用户入参枚举。
105 pub const SIM_US_OPTION: i32 = 7;
106 pub const SIM_HK_OPTION: i32 = 9;
107 pub const SIM_US_MARGIN: i32 = 100;
108
109 // ── Futures 模拟 (v1.4.106 Finding D) ──
110 pub const FUTURES_SIMULATE_HK: i32 = 10;
111 pub const FUTURES_SIMULATE_US: i32 = 11;
112 pub const FUTURES_SIMULATE_SG: i32 = 12;
113 /// **注意**: 13 是 OpenAPI sim JP 期货, **不是** App `FTTradeEnableMarketHKFund=13`.
114 pub const FUTURES_SIMULATE_JP: i32 = 13;
115
116 // ── Fund 子市场 (OpenAPI canonical NN_TrdMarket values) ──
117 pub const HK_FUND: i32 = 113;
118 pub const US_FUND: i32 = 123;
119 pub const SG_FUND: i32 = 124;
120 pub const MY_FUND: i32 = 125;
121 pub const JP_FUND: i32 = 126;
122}
123
124/// Backend raw `Account.market` fund 子市场值 (v1.4.106 Finding D).
125///
126/// `bridge/account.rs::account_to_cached` 把 backend raw 13/23/24 映射到
127/// `trd_market_auth_list` 用 NN_TrdMarket 值 113/123/124, **但** `acc.market`
128/// 字段 (top-level account market) 直接当 raw 存进 `CachedTrdAcc.trd_market`.
129/// 所以 cache-read 看 `trd_market` 时仍可能见 13/23/24 raw 值.
130///
131/// 这与 App `FTTradeEnableMarket` 数值碰巧 alias (HK_FUND=13 / US_FUND=23 /
132/// SG_FUND=24), 但 **来源完全不同** — 这里是 backend `FTUsrTrdAcc.proto`
133/// 下发的内部协议值. 不要用 App 上下文的语义解释.
134pub mod legacy_backend_fund_market_id {
135 pub const HK_FUND: i32 = 13;
136 pub const US_FUND_OLD: i32 = 22; // legacy old encoding
137 pub const US_FUND: i32 = 23;
138 pub const SG_FUND: i32 = 24;
139}