Skip to main content

classify_account

Function classify_account 

Source
pub fn classify_account(
    trd_market: Option<i32>,
    security_firm: Option<i32>,
    uni_card_num: Option<&str>,
) -> AccountKind
Expand description

账户类型识别 — 对齐 C++ INNData_Trd_CommonCurrency::GetAccountValidCurrency (cpp:92-126) 的 3 分支结构:

if (enTrdMkt == NN_TrdMarket_Futures)        → futures set per broker
else if (enTrdMkt == NN_TrdMarket_SG /*6*/)  → universal set per broker
else                                          → single currency from
                                                GetTrdMarketCurrency(enTrdMkt)
                                                (HK→HKD / US→USD / CN/HKCC→CNH /
                                                 default→Unknown+warn)

本 fn 是 Rust cache normalization defense, 不是 C++ direct copy. (Per v1.4.106 Finding C from codex source audit 2026-05-01).

C++ 严格按 accItem.enTrdMkt == NN_TrdMarket_SG 判 Universal, 没有任何 fallback. Rust 加 uni_card_num + security_firm fallback 是因为 Rust cache (CachedTrdAcc.trd_market) 直接存 backend raw Account.market, raw 值跟 OpenAPI TrdMarket 不一定 1:1 对齐 (e.g. backend raw=13=HK_Fund vs OpenAPI 113=HK_Fund). 本 fn 防止 cache drift 把真 Universal 账户错认为 SingleCurrency 静默放宽 currency 校验.

risk of fallback: 万一 fallback 路径误把 single-market HK/US 账户认成 Universal, 会让 validate_currency_for_account 走 universal supported set, 可能 reject C++ 接受的 currency. 本 fn 的 fallback 仅当 trd_market 不在 official 表里时启用 — 见 Step 3 实现注释.

现实背景 (用户 2026-04-30 强调): “不论 hk/us/sg 等, 各个券商实体开给 客户的都是 Universal account; single account 是老的账户形态, 已经被 禁用, 只能浏览了”. 所以现代活跃账户99% 是 Universal (trd_market=6), SingleCurrency 路径仅服务遗留浏览-only 账户.

输入信号 (按优先级 + 与 C++ 对齐 + cache drift 防御):

  1. trd_market = FUTURES (5): Futures 账户 (C++ 第 1 分支, 不受 fallback 影响)
  2. trd_market = SG (6) = AccountMarket::UNIVERSAL: Universal (C++ 第 2 分支, canonical)
  3. uni_card_num 非空 + security_firm 已识别: 仍按 Universal 处理 (cache drift 防御 — 真 Universal 账户必有 uni_card_num + security_firm). 必须排在第 4 步前, 防 cache 把 trd_market 错存成 raw NN_TrdMarket 值 (CA=112 / AU=8 / JP=15 / MY=111) 落进 SingleCurrency 静默放行.
  4. trd_market ∈ legacy single 表 (HK=1 / US=2 / CN=3 / HKCC=4 + backend-raw fund 13/22/23/24 + OpenAPI fund 113/123/124/125/126): legacy SingleCurrency (浏览-only 老账户, C++ 第 3 分支的具体派生路径)
  5. 其他: SingleCurrency (supported 返 None → Unknown, 让 backend 决定)

历史触发 (codex round 1 F1, v1.4.105 review): 之前只看 trd_market == SG (6), 真实 cache 若存 raw NN_TrdMarket 值 (CA=112 / AU=8 / JP=15 / MY=111) 则错落进 SingleCurrency, Layer A 静默放 行 → HKD/SGD silent fallback regression 可能复活.

用户 2026-04-30 进一步纠偏: legacy single-market HK/US/HKCC 账户在现实里 都是浏览-only, 不应早 return 抑制 Universal fallback — 真 Universal 账 户即使 cache 漂移到 1/2/4, fallback 仍要识别正确.