Skip to main content

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}