pub fn validate_currency_for_account(
requested_currency: Option<i32>,
security_firm: Option<i32>,
trd_market: Option<i32>,
uni_card_num: Option<&str>,
) -> CurrencyValidationExpand description
Layer A pre-check — 严格对齐 C++ CheckReqParams_GetFunds /
CheckCurrencyValid (APIServer_Trd_GetFunds.cpp:457-491):
// 期货综合账户或全能账户需要传货币参数
if (accItem.enTrdMkt == NN_TrdMarket_Futures || accItem.enTrdMkt == NN_TrdMarket_SG)
{
if (!c2s.has_currency()) return false; // missing → reject
if (!CheckCurrencyValid(...)) return false; // out-of-set → reject
}
return true;C++ 只对 Futures (trd_market=5) + SG/Universal (trd_market=6)
验证 currency. 其他账户 (legacy HK Sec / US Sec / HKCC / Crypto / Forex
/ HK_Fund / US_Fund / sim) 完全不验证 — backend 在 FillFunds else
branch 用 nnFunds.enCurrency 返 native currency, 静默忽略 client 传的
currency 参数.
v1.4.106 修法 (P0 + Finding F1, 真机 vs C++ OpenD 4/4 不一致 catalog 触发): 之前 v1.4.105 对所有账户 strict reject, 违反 pitfall #51 “对齐 C++ = 减法”. legacy 单市场账户 + USD/CAD/SGD daemon reject 但 C++ 接受. 现在严格只 validate Futures + Universal, SingleCurrency 直接 pass-through.
v1.4.106 Finding F1 收紧: 之前 requested_currency=None 全部账户都
pass-through (太宽松). C++ CheckReqParams_GetFunds 对 Futures + SG/Universal
强制要求 c2s.has_currency(), 缺则返 missing-parameter. 现在分两层:
- SingleCurrency 缺 currency →
Ok(legacy pass-through 不变) - Futures / Universal 缺 currency →
Missing(loud reject)
SGD silent-trust regression 防御仍由 Universal 分支锁住:
Moomoo CA Universal (security_firm=5 + uni_card_num + AccountMarket=6)
进 AccountKind::Universal 分支, supported set 不含 SGD → reject.
Return 分类:
Ok:- SingleCurrency kind (legacy 单市场 / Crypto / Forex / Fund / sim) — pass-through, 无论 requested 是否 = None.
- Futures/Universal + supported list 已知 + requested ∈ set
Missing(v1.4.106 新加):- Futures / Universal kind + requested = None + supported list 已知
Unsupported:- Futures / Universal kind + supported list 已知 + requested ∉ set
Unknown:- Futures / Universal kind 但 broker 未识别 (security_firm=None / cache miss) → 让 backend 决定 (无法构造 supported list, 也无 Missing loud-reject 上下文)