Skip to main content

futu_trd/
lib.rs

1//! FutuOpenD 交易业务模块
2//!
3//! 实装 "交易侧" 所有业务:账户列表 / 解锁 / 下单 / 改单 / 撤单 / 资金 / 持仓
4//! / 订单查询 / 历史订单 / 流水 / 费率 / 最大可交易量 / 推送订阅,对齐 C++
5//! OpenD 的 `NN_ProtoCmd_Trd_*` 全集。
6//!
7//! 主要模块:
8//! - [`account`] — 账户列表 / 解锁 / 资金 / 持仓([`account::unlock_trade`])
9//! - [`order`] — 下单 / 改单 / 撤单([`order::place_order`])
10//! - [`query`] — 今日订单 / 今日成交
11//! - [`misc`] — 历史订单 / 历史成交 / 费率 / 最大可交易量 / 反确认
12//! - [`push`] — 交易推送分发([`push::TradePushDispatcher`])
13//! - [`types`] — 核心类型([`types::TrdHeader`] / [`types::TrdMarket`] / [`types::TrdSide`] / ...)
14
15pub mod account;
16pub mod currency;
17pub mod market;
18pub mod misc;
19pub mod order;
20pub mod projection;
21pub mod push;
22pub mod query;
23pub mod read_plan;
24pub mod types;
25
26/// 把服务端 `ret_type / ret_msg / err_code` 三元组汇成一个可读 `FutuError::ServerError`。
27///
28/// v1.4.27 BUG-2 修复首版:仅在 `err_code != 0` 时加前缀。
29///
30/// v1.4.30 BUG-2b 修复(eli v1.4.29 回归测试发现):sim 下单服务端经常
31/// 返回 `err_code=None`,首版逻辑会吞掉这个信号——用户看到
32/// "PlaceOrder: 错误,请稍后重试或联系客服"完全不知道是我们代码吞了还是
33/// 服务端就返这个。改成**永远**把 err_code 原始值(含 `none` / `0`)体现
34/// 在 msg 前缀里,让用户看到完整的 `[err_code=none]` / `[err_code=10001]`,
35/// 和 `ret_type` 一起构成完整的服务端诊断三元组。
36#[inline]
37pub(crate) fn server_err(
38    ret_type: i32,
39    ret_msg: Option<String>,
40    err_code: Option<i32>,
41) -> futu_core::error::FutuError {
42    let raw = ret_msg.unwrap_or_default();
43    let err_code_label = match err_code {
44        Some(code) => code.to_string(),
45        None => "none".to_string(),
46    };
47    let msg = if raw.is_empty() {
48        format!("[err_code={err_code_label}]")
49    } else {
50        format!("[err_code={err_code_label}] {raw}")
51    };
52    futu_core::error::FutuError::ServerError { ret_type, msg }
53}
54
55// Re-export 常用类型
56pub use account::{
57    TrdAcc, get_acc_list, get_funds, get_position_list, get_position_list_with_filter_market,
58    unlock_trade,
59};
60pub use misc::{
61    HistoryFilterConditions, MaxTrdQtysParams, get_history_order_fill_list, get_history_order_list,
62    get_max_trd_qtys, reconfirm_order, sub_acc_push,
63};
64pub use order::{cancel_order, modify_order, place_order};
65pub use push::{TradeHandler, TradePushDispatcher, TrdNotifyInfo};
66pub use query::{Order, OrderFill, get_order_fill_list, get_order_list};
67pub use types::{
68    Funds, ModifyOrderOp, ModifyOrderParams, OrderType, PlaceOrderParams, PlaceOrderResult,
69    Position, TrdEnv, TrdHeader, TrdMarket, TrdSide,
70};
71
72#[cfg(test)]
73mod server_err_tests;