Skip to main content

futu_backend/trade_query/orders/
helpers.rs

1//! trade_query/orders/helpers — validation / decimal / market derivation / cmd dispatch (12 fn)
2//! (v1.4.110 CC Batch J: 拆自 orders.rs L70-204)
3
4use futu_cache::trd_cache::TrdCache;
5
6use crate::trade_cmd::{TradeQueryEnvironment, trade_query_route};
7
8use super::super::*;
9
10/// 从 cache 派生 `(trd_env, account_trd_market, enabled_markets, broker_id)`,
11/// 用于 `build_*_req` helper。
12///
13/// **空 list 兜底**: 如 cache 未填 (启动期 / 账户 list 未到), 返
14/// `(env=0, account_market=None, vec![], broker_id=None)` — 让 caller 仍能发请求
15/// (backend 默认行为是返全部),
16/// 不阻塞主流程. 这与 C++ 行为略偏: C++ `accItem.nEnableMarketLength = 0`
17/// 时 add_market 0 次, 等价我们 vec![] (backend 视为不过滤).
18pub fn derive_acc_query_context_with_broker(
19    trd_cache: &TrdCache,
20    acc_id: u64,
21) -> (i32, Option<i32>, Vec<i32>, Option<u32>) {
22    if let Some(entry) = trd_cache.accounts.get(&acc_id) {
23        let acc = entry.value();
24        let broker_id = acc
25            .security_firm
26            .and_then(futu_core::trade_broker::broker_id_for_security_firm_like_cpp);
27        return (
28            acc.trd_env,
29            acc.trd_market,
30            acc.trd_market_auth_list.clone(),
31            broker_id,
32        );
33    }
34    (0, None, Vec::new(), None)
35}
36
37pub fn derive_acc_query_context(trd_cache: &TrdCache, acc_id: u64) -> (i32, Option<i32>, Vec<i32>) {
38    let (trd_env, account_trd_market, enabled_markets, _) =
39        derive_acc_query_context_with_broker(trd_cache, acc_id);
40    (trd_env, account_trd_market, enabled_markets)
41}
42
43fn query_environment(trd_env: i32) -> TradeQueryEnvironment {
44    if trd_env == 1 {
45        TradeQueryEnvironment::Real
46    } else {
47        TradeQueryEnvironment::Sim
48    }
49}
50
51pub fn order_fill_list_cmd_for_env(trd_env: i32) -> Option<u16> {
52    trade_query_route(TradeQueryOperation::Fills, query_environment(trd_env))
53        .map(|route| route.cmd_id)
54}
55
56pub fn order_info_cmd_for_env(trd_env: i32) -> Option<u16> {
57    trade_query_route(TradeQueryOperation::OrderInfo, query_environment(trd_env))
58        .map(|route| route.cmd_id)
59}
60
61pub fn order_fill_info_cmd_for_env(trd_env: i32) -> Option<u16> {
62    trade_query_route(TradeQueryOperation::FillInfo, query_environment(trd_env))
63        .map(|route| route.cmd_id)
64}
65
66pub fn history_order_list_cmd_for_env(trd_env: i32) -> Option<u16> {
67    trade_query_route(
68        TradeQueryOperation::HistoryOrders,
69        query_environment(trd_env),
70    )
71    .map(|route| route.cmd_id)
72}
73
74pub fn history_order_fill_list_cmd_for_env(trd_env: i32) -> Option<u16> {
75    trade_query_route(
76        TradeQueryOperation::HistoryFills,
77        query_environment(trd_env),
78    )
79    .map(|route| route.cmd_id)
80}