交易操作
Rust SDK 通过 TradeClient 提供全部交易接口。自 v0.3.0 起,查询接口均返回强类型数组(如 Vec<Order>、Vec<Position>、Vec<Asset>、Vec<Contract>),下单/预览/改单返回 Option<PlaceOrderResult> / Option<PreviewResult> / Option<OrderIdResult>;SDK 自动剥除服务端 {"items": [...]} 外壳,请求体按 snake_case 序列化,响应按 camelCase 反序列化。v0.4.0 将 8 个查询方法改为 Request struct 签名(breaking),并新增 13 个方法(账户管理 / 资产分析 / 资金调拨 / 外汇下单等)。以下为完整可运行示例:
use tigeropen::client::http_client::HttpClient;
use tigeropen::config::ClientConfig;
use tigeropen::model::order::limit_order;
use tigeropen::model::trade_requests::{OrdersRequest, PositionsRequest};
use tigeropen::trade::TradeClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = ClientConfig::builder().build()?;
let account = config.account.clone();
let http = HttpClient::new(config);
let tc = TradeClient::new(&http, &account);
// 查询持仓 (v0.4.0: Request struct)
let positions = tc.get_positions(PositionsRequest::default()).await?;
println!("持仓: {}", positions.len());
// 使用辅助函数构造 OrderRequest,再按需补充字段
let mut order_req = limit_order(&account, "AAPL", "STK", "BUY", 10, 150.0);
order_req.market = Some("US".into());
order_req.currency = Some("USD".into());
order_req.time_in_force = Some("DAY".into());
// 预览订单
let preview = tc.preview_order(order_req.clone()).await?;
println!("预览结果: {:?}", preview);
// 实际下单
if let Some(placed) = tc.place_order(order_req).await? {
println!("订单 id={} order_id={}", placed.id, placed.order_id);
}
Ok(())
}Order vs OrderRequest:查询接口返回的是
Order响应类型(字段更全);place_order/preview_order/modify_order接受的是OrderRequest请求类型。推荐使用limit_order/market_order/stop_order/stop_limit_order/trail_order/auction_limit_order/auction_market_order/algo_order等辅助函数构造请求。
OrderStatus 订单状态 (v0.4.0 对齐 Java)
v0.4.0 将 OrderStatus 枚举与 Java SDK 对齐,共 8 个值,同时实现了数字码到字符串的自动归一:
| 枚举变体 | 字符串 | 数字码 |
|---|---|---|
OrderStatus::Invalid | "Invalid" | -2 |
OrderStatus::Initial | "Initial" | -1 |
OrderStatus::PendingCancel | "PendingCancel" | 3 |
OrderStatus::Cancelled | "Cancelled" | 4 |
OrderStatus::Submitted | "Submitted" | 5 |
OrderStatus::Filled | "Filled" | 6 |
OrderStatus::Inactive | "Inactive" | 7 |
OrderStatus::PendingSubmit | "PendingSubmit" | 8 |
Breaking:从 Python 派生的
PendingNew/PartiallyFilled已移除(服务端不返回),新增PendingSubmit。
获取数字码使用 OrderStatus::code():
use tigeropen::model::enums::OrderStatus;
println!("{}", OrderStatus::Filled.code()); // 6
println!("{}", OrderStatus::PendingSubmit.code()); // 8Order.status 在反序列化时如服务端返回整数码会自动映射为上述字符串,因此 OrdersRequest.states 使用字符串数组过滤(如 vec!["Filled".to_string()])。
合约查询
get_contract 查询单个合约
tc.get_contract(symbol: &str, sec_type: &str) -> Result<Vec<Contract>, TigerError>
说明
查询单个合约的详细信息,包括名称、货币、最小交易单位等。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| symbol | &str | 是 | 合约代码,如 "AAPL"、"00700" |
| sec_type | &str | 是 | 合约类型:"STK"(股票)/ "OPT"(期权)/ "FUT"(期货)/ "WAR"(权证)/ "IOPT"(牛熊证) |
返回
Result<Vec<Contract>, TigerError>
每个 Contract 包含 symbol、sec_type、currency、exchange、name、market、contract_id、conid、lot_size、multiplier、tradeable、tick_sizes、short_margin 等字段。
示例
let cs = tc.get_contract("AAPL", "STK").await?;
if let Some(c) = cs.first() {
println!("{} contractId={:?} exchange={:?}", c.symbol, c.contract_id, c.exchange);
}
// 查询港股
let hk = tc.get_contract("00700", "STK").await?;get_contracts 批量查询合约
tc.get_contracts(symbols: &[&str], sec_type: &str) -> Result<Vec<Contract>, TigerError>
说明
批量查询多个合约信息,减少网络请求次数。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| symbols | &[&str] | 是 | 合约代码切片 |
| sec_type | &str | 是 | 合约类型,同 get_contract |
返回
Result<Vec<Contract>, TigerError>
字段结构同 get_contract。
示例
let cs = tc.get_contracts(&["AAPL", "TSLA", "MSFT"], "STK").await?;
let names: Vec<String> = cs.iter().map(|c| c.symbol.clone()).collect();
println!("count={} {}", cs.len(), names.join(","));get_quote_contract 查询衍生品合约
tc.get_quote_contract(symbol: &str, sec_type: &str, expiry: &str) -> Result<Vec<Contract>, TigerError>
说明
查询期权、权证、牛熊证等衍生品的合约明细。v0.3.0 起 expiry 为必填(格式 "YYYYMMDD"),SDK 会把 symbol 包装成 symbols 数组发送。仅适用于 OPT / WAR / IOPT。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| symbol | &str | 是 | 标的代码,如 "AAPL" |
| sec_type | &str | 是 | 合约类型:"OPT" / "WAR" / "IOPT" |
| expiry | &str | 是 | 到期日,格式 "YYYYMMDD",如 "20260619" |
返回
Result<Vec<Contract>, TigerError>
返回衍生品合约数组,包含 strike、expiry、right(CALL / PUT)、multiplier、identifier 等衍生品特有字段。
示例
let opt_contracts = tc.get_quote_contract("AAPL", "OPT", "20260619").await?;
println!("count={}", opt_contracts.len());订单操作
OrderRequest 字段说明
下单 / 预览 / 改单接口接收 OrderRequest 对象(字段按 snake_case 序列化发送到服务端)。推荐通过 limit_order、market_order 等辅助函数构造基础结构,再按需填充附加字段:
| 字段 | 类型 | 描述 |
|---|---|---|
| account | Option<String> | 账户 ID(SDK 会在下单时自动填入 TradeClient 的账户) |
| id | Option<i64> | 全局订单 ID(改单时必填,SDK 自动填入) |
| order_id | Option<i64> | 账户级订单 ID |
| symbol | Option<String> | 合约代码 |
| sec_type | Option<String> | 合约类型:"STK" / "OPT" / "FUT" / "WAR" / "IOPT" |
| action | Option<String> | 买卖方向:"BUY" / "SELL" |
| order_type | Option<String> | 订单类型:"MKT" / "LMT" / "STP" / "STP_LMT" / "TRAIL" / "AM" / "AL" / "TWAP" / "VWAP" |
| total_quantity | Option<i64> | 委托数量 |
| limit_price | Option<f64> | 限价价格(LMT / STP_LMT 必填) |
| aux_price | Option<f64> | 触发价(STP / STP_LMT / TRAIL 必填) |
| trailing_percent | Option<f64> | 追踪止损百分比 |
| time_in_force | Option<String> | 有效期:"DAY" / "GTC" / "GTD" / "OPG" |
| outside_rth | Option<bool> | 是否允许盘前盘后交易(仅美股) |
| market | Option<String> | 市场 |
| currency | Option<String> | 货币 |
| expiry | Option<String> | 期权/期货到期日 |
| strike | Option<String> | 期权行权价 |
| right | Option<String> | 期权方向:"CALL" / "PUT" |
| identifier | Option<String> | 合约标识 |
| order_legs | Option<Vec<OrderLegRequest>> | 附加子单(止盈/止损) |
| algo_params | Option<AlgoParamsRequest> | 算法单参数 |
| remark | Option<String> | 备注 |
| user_mark | Option<String> | 用户标记 |
使用辅助函数构造 OrderRequest
use tigeropen::model::order::{
market_order, limit_order, stop_order, stop_limit_order, trail_order,
auction_limit_order, auction_market_order, new_order_leg, OrderRequest,
};
// 限价单
let mut buy = limit_order("YOUR_ACCOUNT", "AAPL", "STK", "BUY", 10, 150.0);
buy.market = Some("US".into());
buy.currency = Some("USD".into());
// 市价单
let sell = market_order("YOUR_ACCOUNT", "AAPL", "STK", "SELL", 10);
// 止损单
let stop = stop_order("YOUR_ACCOUNT", "AAPL", "STK", "SELL", 100, 140.0);
// 止损限价单
let stp_lmt = stop_limit_order("YOUR_ACCOUNT", "AAPL", "STK", "SELL", 100, 139.0, 140.0);
// 追踪止损单
let trail = trail_order("YOUR_ACCOUNT", "AAPL", "STK", "SELL", 100, 5.0);
// 竞价限价 / 竞价市价(港股适用)
let al = auction_limit_order("YOUR_ACCOUNT", "00700", "STK", "BUY", 100, 400.0);
let am = auction_market_order("YOUR_ACCOUNT", "00700", "STK", "BUY", 100);
// 期权单(手动组装)
let opt = OrderRequest {
account: Some("YOUR_ACCOUNT".into()),
symbol: Some("AAPL".into()),
sec_type: Some("OPT".into()),
action: Some("BUY".into()),
order_type: Some("LMT".into()),
total_quantity: Some(1),
limit_price: Some(5.0),
expiry: Some("20250117".into()),
strike: Some("150".into()),
right: Some("CALL".into()),
time_in_force: Some("DAY".into()),
..OrderRequest::default()
};
// 附加止盈/止损子单
let mut with_legs = limit_order("YOUR_ACCOUNT", "AAPL", "STK", "BUY", 10, 150.0);
with_legs.order_legs = Some(vec![
new_order_leg("PROFIT", 160.0, "GTC"),
new_order_leg("LOSS", 145.0, "GTC"),
]);place_order 下单
tc.place_order(order: OrderRequest) -> Result<Option<PlaceOrderResult>, TigerError>
说明
提交订单到交易所。TradeClient 会在发送前自动把 account 字段填入;返回 PlaceOrderResult,包含全局订单 id、账户级 order_id、sub_ids、orders 明细。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| order | OrderRequest | 是 | 订单请求对象 |
返回
Result<Option<PlaceOrderResult>, TigerError>
包含 id(全局订单 ID)、order_id(账户级订单 ID)、sub_ids、orders。
示例
use tigeropen::model::order::{limit_order, market_order};
// 限价买入
let mut buy = limit_order(&account, "AAPL", "STK", "BUY", 10, 150.0);
buy.market = Some("US".into());
buy.currency = Some("USD".into());
if let Some(placed) = tc.place_order(buy).await? {
println!("id={} order_id={}", placed.id, placed.order_id);
}
// 市价卖出
let sell = market_order(&account, "AAPL", "STK", "SELL", 10);
tc.place_order(sell).await?;
// 盘前/盘后交易
let mut ext = limit_order(&account, "AAPL", "STK", "BUY", 5, 148.0);
ext.outside_rth = Some(true);
ext.time_in_force = Some("DAY".into());
tc.place_order(ext).await?;preview_order 预览订单
tc.preview_order(order: OrderRequest) -> Result<Option<PreviewResult>, TigerError>
说明
在实际下单前预估订单的费用、保证金及可行性,不会真正提交到交易所。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| order | OrderRequest | 是 | 订单请求对象 |
返回
Result<Option<PreviewResult>, TigerError>
包含 is_pass、commission、commission_currency、margin_currency、init_margin、maint_margin、equity_with_loan、available_ee、excess_liquidity、gst、message 等字段。
示例
let order_req = limit_order(&account, "AAPL", "STK", "BUY", 10, 150.0);
if let Some(p) = tc.preview_order(order_req).await? {
println!("isPass={} commission={:.2} initMargin={:.2}", p.is_pass, p.commission, p.init_margin);
}modify_order 修改订单
tc.modify_order(id: i64, order: OrderRequest) -> Result<Option<OrderIdResult>, TigerError>
说明
修改已提交但未完全成交的订单,可改价格、数量、时效等。仅支持状态为可改单的订单。SDK 会自动把 id 和 account 写入请求。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| id | i64 | 是 | 要修改的全局订单 ID |
| order | OrderRequest | 是 | 包含新参数的订单对象 |
返回
Result<Option<OrderIdResult>, TigerError>
包含修改后的订单 id。
示例
// 将订单 12345 的限价从 150 改为 148
let mut mod_req = limit_order(&account, "AAPL", "STK", "BUY", 10, 150.0);
mod_req.limit_price = Some(148.0);
if let Some(r) = tc.modify_order(12345, mod_req).await? {
println!("改单 id={}", r.id);
}cancel_order 取消订单
tc.cancel_order(id: i64) -> Result<Option<OrderIdResult>, TigerError>
说明
撤销指定订单。只能撤销状态为可撤单的订单,已成交订单无法撤销。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| id | i64 | 是 | 要撤销的全局订单 ID |
返回
Result<Option<OrderIdResult>, TigerError>
包含撤销后的订单 id。
示例
if let Some(r) = tc.cancel_order(12345).await? {
println!("撤单 id={}", r.id);
}订单查询
OrdersRequest 订单查询请求结构 (v0.4.0 新增)
OrdersRequest 是 get_orders / get_active_orders / get_inactive_orders / get_filled_orders 共用的查询参数,所有字段均为 Option(account 留空自动填默认账户)。
| 参数名 | 类型 | 描述 |
|---|---|---|
| account | Option<String> | 账户 ID |
| sec_type | Option<String> | "STK" / "OPT" / "FUT" 等 |
| market | Option<String> | 市场,如 "US" / "HK" |
| symbol | Option<String> | 合约代码 |
| start_date | Option<i64> | 开始时间(毫秒时间戳) |
| end_date | Option<i64> | 结束时间(毫秒时间戳) |
| limit | Option<i32> | 单次返回条数 |
| is_brief | Option<bool> | 是否只返回精简字段 |
| states | Option<Vec<String>> | 订单状态过滤,值参见上方 OrderStatus 枚举 |
| sort_by | Option<String> | "LATEST_CREATED" / "LATEST_STATUS_UPDATED" |
| seg_type | Option<String> | 子账户分段 |
| lang | Option<String> | 语言 |
| page_token | Option<String> | 分页 token |
| parent_id | Option<i64> | 父订单 ID(仅 get_active_orders 使用) |
get_orders 查询全部订单
async fn get_orders(&self, req: OrdersRequest) -> Result<Vec<Order>, TigerError>
v0.4.0 Breaking:由无参方法改为接收
OrdersRequest(所有字段均可选)。
说明
查询当前账户的全部历史订单,支持多种过滤条件。
参数
见上方 OrdersRequest。
返回
Result<Vec<Order>, TigerError>
每条 Order 包含 id、order_id、symbol、sec_type、action、order_type、status、total_quantity、filled_quantity、limit_price、avg_fill_price、time_in_force、outside_rth、open_time、update_time、can_modify、can_cancel、is_open、external_id、attr_desc、algo_strategy、trading_session_type、latest_price 等字段。
示例
use tigeropen::model::trade_requests::OrdersRequest;
// 最简调用
let orders = tc.get_orders(OrdersRequest::default()).await?;
println!("count={}", orders.len());
// 带过滤:近 100 条已成交的美股订单
let filtered = tc.get_orders(OrdersRequest {
market: Some("US".to_string()),
sec_type: Some("STK".to_string()),
states: Some(vec!["Filled".to_string()]),
limit: Some(100),
sort_by: Some("LATEST_CREATED".to_string()),
..Default::default()
}).await?;
for o in &filtered {
println!("{} {} {} status={}", o.id, o.symbol, o.action, o.status);
}get_order 按 ID 查询单个订单 (v0.4.0 新增)
async fn get_order(&self, req: GetOrderRequest) -> Result<Option<Order>, TigerError>
说明
根据订单 ID 查询单个订单详情。id(全局订单 ID)与 order_id(账户级订单号)至少传一个。wire 方法 orders(服务端返回单个对象)。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| id | Option<i64> | 二选一 | 全局订单 ID |
| order_id | Option<i64> | 二选一 | 账户级订单号 |
| is_brief | Option<bool> | 否 | 是否只返回精简字段 |
| show_charges | Option<bool> | 否 | 是否展示费用 |
| lang | Option<String> | 否 | 语言 |
示例
use tigeropen::model::trade_requests::GetOrderRequest;
let order = tc.get_order(GetOrderRequest {
id: Some(123456789),
..Default::default()
}).await?;
if let Some(o) = order {
println!("{} {} status={} filled={}/{}", o.id, o.symbol, o.status, o.filled_quantity, o.total_quantity);
}get_active_orders 查询待成交订单
async fn get_active_orders(&self, req: OrdersRequest) -> Result<Vec<Order>, TigerError>
v0.4.0 Breaking:由无参方法改为接收
OrdersRequest(新增parent_id过滤附加订单)。
说明
查询当前挂单中(未完全成交)的订单列表。
示例
// 最简调用
let active = tc.get_active_orders(OrdersRequest::default()).await?;
println!("active count={}", active.len());get_inactive_orders 查询已撤销订单
async fn get_inactive_orders(&self, req: OrdersRequest) -> Result<Vec<Order>, TigerError>
v0.4.0 Breaking:由无参方法改为接收
OrdersRequest。
说明
查询已撤销或已过期的订单列表。
示例
let inactive = tc.get_inactive_orders(OrdersRequest::default()).await?;
println!("inactive count={}", inactive.len());get_filled_orders 查询已成交订单
async fn get_filled_orders(&self, req: OrdersRequest) -> Result<Vec<Order>, TigerError>
v0.4.0 Breaking:由
(start_ms: i64, end_ms: i64)两个位置参数改为接收OrdersRequest,时间范围通过start_date/end_date字段传入(毫秒时间戳)。
说明
查询已成交订单。start_date / end_date 均为毫秒时间戳。
示例
use std::time::{SystemTime, UNIX_EPOCH};
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_millis() as i64)
.unwrap_or(0);
// 最简调用
let filled = tc.get_filled_orders(OrdersRequest::default()).await?;
// 带时间过滤:近 30 天已成交订单
let recent = tc.get_filled_orders(OrdersRequest {
start_date: Some(now - 30 * 24 * 3600 * 1000),
end_date: Some(now),
limit: Some(200),
..Default::default()
}).await?;
println!("近 30 天成交订单 count={}", recent.len());get_order_transactions 查询成交明细
async fn get_order_transactions(&self, req: OrderTransactionsRequest) -> Result<Vec<Transaction>, TigerError>
v0.4.0 Breaking:由
(order_id: i64, symbol: &str, sec_type: &str)三个位置参数改为接收OrderTransactionsRequest;所有字段变为可选,既可按order_id查询指定订单,也可按时间窗 / 合约批量过滤。
说明
查询订单的逐笔成交明细。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| order_id | Option<i64> | 否 | 订单 ID(查询单订单时传) |
| symbol | Option<String> | 否 | 合约代码 |
| sec_type | Option<String> | 否 | 合约类型 |
| start_date | Option<i64> | 否 | 开始时间(毫秒时间戳) |
| end_date | Option<i64> | 否 | 结束时间(毫秒时间戳) |
| limit | Option<i32> | 否 | 返回条数 |
| page_token | Option<String> | 否 | 分页 token |
| lang | Option<String> | 否 | 语言 |
返回
Result<Vec<Transaction>, TigerError>
每条 Transaction 包含 id、order_id、account、symbol、sec_type、market、currency、action、price、quantity、filled_quantity、amount、commission、transacted_at、time 等字段。
示例
use tigeropen::model::trade_requests::OrderTransactionsRequest;
// 查询指定订单成交明细
let txs = tc.get_order_transactions(OrderTransactionsRequest {
order_id: Some(12345),
symbol: Some("AAPL".to_string()),
sec_type: Some("STK".to_string()),
..Default::default()
}).await?;
for t in &txs {
println!("id={} price={:.2} qty={}", t.id, t.price, t.filled_quantity);
}持仓与资产
get_positions 查询持仓
async fn get_positions(&self, req: PositionsRequest) -> Result<Vec<Position>, TigerError>
v0.4.0 Breaking:由无参方法改为接收
PositionsRequest,支持按symbol/sec_type/currency/market等字段过滤。
说明
查询当前账户的所有持仓信息,包括股票、期权、期货等各类合约。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| symbol | Option<String> | 否 | 合约代码 |
| sec_type | Option<String> | 否 | "STK" / "OPT" / "FUT" 等 |
| currency | Option<String> | 否 | 币种 |
| market | Option<String> | 否 | 市场 |
| lang | Option<String> | 否 | 语言 |
返回
Result<Vec<Position>, TigerError>
每条 Position 包含 account、symbol、sec_type、market、currency、position、average_cost、market_value、realized_pnl、unrealized_pnl、unrealized_pnl_percent、contract_id、identifier、name、latest_price、multiplier 等字段(均为 Option 类型)。
示例
use tigeropen::model::trade_requests::PositionsRequest;
// 最简调用
let positions = tc.get_positions(PositionsRequest::default()).await?;
let total_mv: f64 = positions.iter().map(|p| p.market_value.unwrap_or(0.0)).sum();
println!("count={} totalMarketValue={:.2}", positions.len(), total_mv);
// 仅查询美股持仓
let us = tc.get_positions(PositionsRequest {
market: Some("US".to_string()),
sec_type: Some("STK".to_string()),
..Default::default()
}).await?;get_assets 查询资产
async fn get_assets(&self, req: AssetsRequest) -> Result<Vec<Asset>, TigerError>
v0.4.0 Breaking:由无参方法改为接收
AssetsRequest。
说明
查询账户的资产概览,包括账户净值、现金余额、保证金使用情况等。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| segment | Option<bool> | 否 | 是否返回分段明细 |
| market_value | Option<bool> | 否 | 是否返回市值 |
| lang | Option<String> | 否 | 语言 |
返回
Result<Vec<Asset>, TigerError>
每条 Asset 包含 account、capability、currency、buying_power、cash_value、net_liquidation、realized_pnl、unrealized_pnl,以及 segments: Vec<AssetSegment>(按 category / title 分段的详细数据)。
示例
use tigeropen::model::trade_requests::AssetsRequest;
let assets = tc.get_assets(AssetsRequest::default()).await?;
if let Some(a) = assets.first() {
println!(
"account={} buyingPower={:.2} netLiquidation={:.2} segments={}",
a.account, a.buying_power, a.net_liquidation, a.segments.len()
);
}get_prime_assets 查询综合账户资产
async fn get_prime_assets(&self, req: AssetsRequest) -> Result<Option<PrimeAsset>, TigerError>
v0.4.0 Breaking:由无参方法改为接收
AssetsRequest(与get_assets共用请求结构)。
说明
查询综合账户(Prime 账户)的资产信息,按币种/类别分段汇总。
参数
见 AssetsRequest(同 get_assets)。
返回
Result<Option<PrimeAsset>, TigerError>
包含 account_id、update_timestamp,以及 segments: Vec<PrimeAssetSegment>(每段含 capability、category、currency、cash_balance、cash_available_for_trade、gross_position_value、equity_with_loan、net_liquidation、init_margin、maintain_margin、overnight_margin、buying_power、unrealized_pl、realized_pl、currency_assets 等字段)。
示例
use tigeropen::model::trade_requests::AssetsRequest;
if let Some(pa) = tc.get_prime_assets(AssetsRequest::default()).await? {
let total_bp: f64 = pa.segments.iter().map(|s| s.buying_power).sum();
println!(
"account={} segments={} totalBuyingPower={:.2}",
pa.account_id, pa.segments.len(), total_bp
);
}账户管理 (v0.4.0 新增)
get_managed_accounts 查询机构子账户列表 (v0.4.0 新增)
async fn get_managed_accounts(&self, req: ManagedAccountsRequest) -> Result<Vec<ManagedAccount>, TigerError>
说明
查询当前主账户下可管理的机构子账户列表。wire 方法 accounts。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| lang | Option<String> | 否 | 语言 |
返回
Result<Vec<ManagedAccount>, TigerError>(account / account_type / capability / status)
示例
use tigeropen::model::trade_requests::ManagedAccountsRequest;
let subs = tc.get_managed_accounts(ManagedAccountsRequest::default()).await?;
for s in &subs {
println!("{} type={:?} capability={:?} status={:?}", s.account, s.account_type, s.capability, s.status);
}get_derivative_contracts 查询衍生品合约 (v0.4.0 新增)
async fn get_derivative_contracts(&self, req: DerivativeContractsRequest) -> Result<Vec<Contract>, TigerError>
说明
按 symbols + 类型批量查询衍生品合约信息(期权 / 认股 / 牛熊)。wire 方法 quote_contract。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| symbols | Vec<String> | 是 | 标的代码列表 |
| sec_type | String | 是 | "OPT" / "WAR" / "IOPT" |
| expiry | Option<String> | 否 | 到期日 "YYYYMMDD" |
| lang | Option<String> | 否 | 语言 |
示例
use tigeropen::model::trade_requests::DerivativeContractsRequest;
let cs = tc.get_derivative_contracts(DerivativeContractsRequest {
symbols: vec!["AAPL".to_string(), "TSLA".to_string()],
sec_type: "OPT".to_string(),
expiry: Some("20260619".to_string()),
..Default::default()
}).await?;
println!("contracts={}", cs.len());资产分析 (v0.4.0 新增)
get_analytics_asset 按日资产分析 (v0.4.0 新增)
async fn get_analytics_asset(&self, req: AnalyticsAssetRequest) -> Result<Vec<AnalyticsAsset>, TigerError>
说明
按日返回账户持仓价值、现金余额、盈亏与净值指数。wire 方法 analytics_asset。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| seg_type | Option<String> | 否 | 子账户分段 |
| start_date | Option<String> | 否 | 起始日期("yyyy-MM-dd") |
| end_date | Option<String> | 否 | 结束日期("yyyy-MM-dd") |
| lang | Option<String> | 否 | 语言 |
示例
use tigeropen::model::trade_requests::AnalyticsAssetRequest;
let rows = tc.get_analytics_asset(AnalyticsAssetRequest {
start_date: Some("2025-01-01".to_string()),
end_date: Some("2025-12-31".to_string()),
..Default::default()
}).await?;
for r in &rows {
println!("{} holding={:?} pnl={:?}", r.date, r.holding_value, r.pnl);
}get_aggregate_assets 综合账户资产汇总 (v0.4.0 新增)
async fn get_aggregate_assets(&self, req: AggregateAssetsRequest) -> Result<Option<AggregateAssets>, TigerError>
说明
在指定 base_currency 视角下汇总综合账户资产(含各币种明细)。wire 方法 aggregate_assets。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| seg_type | Option<String> | 否 | 分段 |
| base_currency | Option<String> | 否 | 基础币种 |
| lang | Option<String> | 否 | 语言 |
示例
use tigeropen::model::trade_requests::AggregateAssetsRequest;
if let Some(agg) = tc.get_aggregate_assets(AggregateAssetsRequest {
base_currency: Some("USD".to_string()),
..Default::default()
}).await? {
println!("netLiq={:?} currencies={}", agg.net_liquidation, agg.currency_assets.len());
}get_estimate_tradable_quantity 可交易数量估算 (v0.4.0 新增)
async fn get_estimate_tradable_quantity(&self, req: EstimateTradableQuantityRequest) -> Result<Option<EstimateTradableQuantity>, TigerError>
说明
根据账户可用资金、保证金、现价估算可下单数量。wire 方法 estimate_tradable_quantity。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| symbol | String | 是 | 合约代码 |
| sec_type | String | 是 | 合约类型 |
| action | String | 是 | "BUY" / "SELL" |
| order_type | Option<String> | 否 | "MKT" / "LMT" 等 |
| limit_price | Option<f64> | 条件 | "LMT" / "STP_LMT" 必填 |
| market | Option<String> | 否 | 市场 |
| lang | Option<String> | 否 | 语言 |
示例
use tigeropen::model::trade_requests::EstimateTradableQuantityRequest;
if let Some(est) = tc.get_estimate_tradable_quantity(EstimateTradableQuantityRequest {
symbol: "AAPL".to_string(),
sec_type: "STK".to_string(),
action: "BUY".to_string(),
order_type: Some("LMT".to_string()),
limit_price: Some(150.0),
..Default::default()
}).await? {
println!("tradable={:?} cashBuy={:?}", est.tradable_quantity, est.max_cash_buy_quantity);
}资金明细与调拨 (v0.4.0 新增)
get_fund_details 资金流水明细 (v0.4.0 新增)
async fn get_fund_details(&self, req: FundDetailsRequest) -> Result<Vec<FundDetails>, TigerError>
说明
按时间窗查询账户资金流水(入金 / 出金 / 费用 / 利息 / 分红等)。wire 方法 fund_details。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| fund_type | Option<String> | 否 | 资金类型 |
| currency | Option<String> | 否 | 币种 |
| start_date | Option<i64> | 否 | 起始时间(毫秒时间戳) |
| end_date | Option<i64> | 否 | 结束时间(毫秒时间戳) |
| limit | Option<i32> | 否 | 返回条数 |
| page_token | Option<String> | 否 | 分页 token |
| lang | Option<String> | 否 | 语言 |
示例
use std::time::{SystemTime, UNIX_EPOCH};
use tigeropen::model::trade_requests::FundDetailsRequest;
let now = SystemTime::now().duration_since(UNIX_EPOCH).map(|d| d.as_millis() as i64).unwrap_or(0);
let rows = tc.get_fund_details(FundDetailsRequest {
start_date: Some(now - 30 * 24 * 3600 * 1000),
end_date: Some(now),
currency: Some("USD".to_string()),
limit: Some(100),
..Default::default()
}).await?;
for r in &rows {
println!("{:?} {:?} amount={:?} balance={:?}", r.occur_time, r.fund_type, r.amount, r.balance);
}get_funding_history 资金调拨记录 (v0.4.0 新增)
async fn get_funding_history(&self, req: FundingHistoryRequest) -> Result<Vec<FundingHistoryItem>, TigerError>
说明
查询账户入金 / 出金的调拨记录。wire 方法 transfer_fund。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| seg_type | Option<String> | 否 | 分段 |
| currency | Option<String> | 否 | 币种 |
| start_date | Option<i64> | 否 | 起始时间(毫秒时间戳) |
| end_date | Option<i64> | 否 | 结束时间(毫秒时间戳) |
| limit | Option<i32> | 否 | 返回条数 |
| lang | Option<String> | 否 | 语言 |
示例
use tigeropen::model::trade_requests::FundingHistoryRequest;
let rows = tc.get_funding_history(FundingHistoryRequest::default()).await?;
for r in &rows {
println!("{:?} {:?} amount={:?} status={:?}", r.id, r.currency, r.amount, r.status);
}place_forex_order 外汇下单 (v0.4.0 新增)
async fn place_forex_order(&self, req: ForexOrderRequest) -> Result<Option<ForexOrderResult>, TigerError>
说明
提交外汇兑换订单(货币之间转换)。wire 方法 place_forex_order。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| seg_type | Option<String> | 否 | 子账户分段 |
| source_currency | String | 是 | 源币种 |
| target_currency | String | 是 | 目标币种 |
| source_amount | Option<f64> | 否 | 源金额 |
| target_amount | Option<f64> | 否 | 目标金额 |
| order_type | Option<String> | 否 | 订单类型 |
| lang | Option<String> | 否 | 语言 |
示例
use tigeropen::model::trade_requests::ForexOrderRequest;
if let Some(res) = tc.place_forex_order(ForexOrderRequest {
source_currency: "USD".to_string(),
source_amount: Some(10000.0),
target_currency: "HKD".to_string(),
..Default::default()
}).await? {
println!("id={:?} rate={:?} target={:?}", res.id, res.rate, res.target_amount);
}get_segment_fund_available 查询可调拨资金 (v0.4.0 新增)
async fn get_segment_fund_available(&self, req: SegmentFundRequest) -> Result<Vec<SegmentFund>, TigerError>
说明
查询子账户之间可调拨的资金上限。wire 方法 segment_fund_available。
示例
use tigeropen::model::trade_requests::SegmentFundRequest;
let avail = tc.get_segment_fund_available(SegmentFundRequest {
from_segment: Some("S".to_string()),
to_segment: Some("C".to_string()),
currency: Some("USD".to_string()),
..Default::default()
}).await?;
for a in &avail {
println!("{:?}->{:?} {:?} available={:?}", a.from_segment, a.to_segment, a.currency, a.available_amt);
}get_segment_fund_history 子账户调拨历史 (v0.4.0 新增)
async fn get_segment_fund_history(&self, req: SegmentFundRequest) -> Result<Vec<SegmentFundHistoryItem>, TigerError>
说明
查询子账户资金调拨的历史记录。wire 方法 segment_fund_history。
示例
let history = tc.get_segment_fund_history(SegmentFundRequest {
limit: Some(50),
..Default::default()
}).await?;
for h in &history {
println!("{:?} {:?}->{:?} amount={:?} status={:?}", h.id, h.from_segment, h.to_segment, h.amount, h.status);
}transfer_segment_fund 子账户资金调拨 (v0.4.0 新增)
async fn transfer_segment_fund(&self, req: SegmentFundRequest) -> Result<Option<SegmentFund>, TigerError>
说明
在子账户(分段)之间提交资金调拨申请。wire 方法 transfer_segment_fund。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| account | Option<String> | 否 | 账户 ID |
| from_segment | String | 是 | 源分段 |
| to_segment | String | 是 | 目标分段 |
| currency | String | 是 | 币种 |
| amount | f64 | 是 | 金额 |
| lang | Option<String> | 否 | 语言 |
示例
if let Some(res) = tc.transfer_segment_fund(SegmentFundRequest {
from_segment: Some("S".to_string()),
to_segment: Some("C".to_string()),
currency: Some("USD".to_string()),
amount: Some(1000.0),
..Default::default()
}).await? {
println!("transferId={:?} status={:?}", res.id, res.status);
}cancel_segment_fund 撤销调拨申请 (v0.4.0 新增)
async fn cancel_segment_fund(&self, req: SegmentFundRequest) -> Result<Option<SegmentFund>, TigerError>
说明
撤销尚未执行的子账户调拨申请。wire 方法 cancel_segment_fund。
参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| id | String | 是 | 调拨申请 ID |
| account | Option<String> | 否 | 账户 ID |
| lang | Option<String> | 否 | 语言 |
示例
if let Some(res) = tc.cancel_segment_fund(SegmentFundRequest {
id: Some("TX123456".to_string()),
..Default::default()
}).await? {
println!("cancelled id={:?} status={:?}", res.id, res.status);
}通用方法
当 SDK 尚未封装某个 API 时,可通过 HttpClient 直接调用底层接口:
use tigeropen::client::http_client::HttpClient;
use tigeropen::config::ClientConfig;
let config = ClientConfig::builder().build()?;
let http = HttpClient::new(config);
// 直接调用 trade API
let resp = http.execute_trade_request("market_state", serde_json::json!({ "market": "US" })).await?;
println!("原始响应: {:?}", resp);Updated 16 days ago
