Skip to main content

futu_core/
qot_trade_date_market.rs

1//! QOT trading-days `TradeDateMarket` contract.
2//!
3//! `Qot_RequestTradeDate` uses `Qot_Common.TradeDateMarket`, not the generic
4//! `QotMarket` enum used by stock-list or IPO-style endpoints. C++ first maps
5//! this public API enum into its internal `NN_TradeDateMarket`, whose later
6//! values differ from the API enum, so keep this as a dedicated contract.
7
8pub const TRADE_DATE_MARKET_VALID_VALUES: &str = "TradeDateMarket=1..=10 (HK=1, US=2, CN=3, NT=4, ST=5, JP_FUTURE=6, \
9     SG_FUTURE=7, SG=8, MY=9, JP=10); legacy numeric QotMarket aliases: \
10     US=11, SH/CN=21, SZ=22";
11
12#[must_use]
13pub fn is_trade_date_market(value: i32) -> bool {
14    matches!(value, 1..=10 | 11 | 21 | 22)
15}
16
17#[must_use]
18pub fn trade_date_market_from_str_alias(raw: &str) -> Option<i32> {
19    let trimmed = raw.trim();
20    if let Ok(value) = trimmed.parse::<i32>() {
21        return is_trade_date_market(value).then_some(value);
22    }
23
24    let value = match trimmed.to_ascii_uppercase().as_str() {
25        "HK" => 1,
26        "US" => 2,
27        "CN" => 3,
28        "NT" => 4,
29        "ST" => 5,
30        "JP_FUTURE" | "JPFUTURE" | "JPF" => 6,
31        "SG_FUTURE" | "SGFUTURE" | "SGF" => 7,
32        "SG" | "SG_STOCK" | "SG_SECURITY" => 8,
33        "MY" | "MY_STOCK" | "MY_SECURITY" => 9,
34        "JP" | "JP_STOCK" | "JP_SECURITY" => 10,
35        _ => return None,
36    };
37    Some(value)
38}
39
40#[must_use]
41pub fn backend_market_id_for_trade_date_market(market: i32) -> Option<u32> {
42    match market {
43        // Ref: FutuOpenD Src/APIServer/Business/Quote/APIServer_Qot_TradeDate.cpp:88-128
44        // plus GetMktIDByTradeMkt in the same file. These are protocol enum
45        // constants, not server-configured dynamic markets.
46        1 => Some(1),
47        2 => Some(10),
48        3 => Some(30),
49        4 => Some(51),
50        5 => Some(50),
51        6 => Some(185),
52        7 => Some(160),
53        8 => Some(180),
54        9 => Some(1350),
55        10 => Some(830),
56        // Legacy numeric QotMarket aliases accepted by old Rust surfaces.
57        11 => Some(10),
58        21 => Some(30),
59        22 => Some(31),
60        _ => None,
61    }
62}