Skip to main content

validate_currency_for_account

Function validate_currency_for_account 

Source
pub fn validate_currency_for_account(
    requested_currency: Option<i32>,
    security_firm: Option<i32>,
    trd_market: Option<i32>,
    uni_card_num: Option<&str>,
) -> CurrencyValidation
Expand 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:
    1. SingleCurrency kind (legacy 单市场 / Crypto / Forex / Fund / sim) — pass-through, 无论 requested 是否 = None.
    2. 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 上下文)