交易操作

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 个方法(账户管理 / 资产分析 / 资金调拨 / 外汇下单等)。v0.5.0 新增 TradeClient::from_config() 便捷构造,无需手动创建 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();
    // v0.5.0 起:直接用 from_config() 创建,无需手动构造 HttpClient
    let tc = TradeClient::from_config(config, &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 将 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());  // 8

Order.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 包含 symbolsec_typecurrencyexchangenamemarketcontract_idconidlot_sizemultipliertradeabletick_sizesshort_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>

返回衍生品合约数组,包含 strikeexpiryrightCALL / PUT)、multiplieridentifier 等衍生品特有字段。

示例

let opt_contracts = tc.get_quote_contract("AAPL", "OPT", "20260619").await?;
println!("count={}", opt_contracts.len());

订单操作

OrderRequest 字段说明

下单 / 预览 / 改单接口接收 OrderRequest 对象(字段按 snake_case 序列化发送到服务端)。推荐通过 limit_ordermarket_order 等辅助函数构造基础结构,再按需填充附加字段:

字段类型描述
accountOption<String>账户 ID(SDK 会在下单时自动填入 TradeClient 的账户)
idOption<i64>全局订单 ID(改单时必填,SDK 自动填入)
order_idOption<i64>账户级订单 ID
symbolOption<String>合约代码
sec_typeOption<String>合约类型:"STK" / "OPT" / "FUT" / "WAR" / "IOPT"
actionOption<String>买卖方向:"BUY" / "SELL"
order_typeOption<String>订单类型:"MKT" / "LMT" / "STP" / "STP_LMT" / "TRAIL" / "AM" / "AL" / "TWAP" / "VWAP" / "ICEBERG"
total_quantityOption<i64>委托数量
limit_priceOption<f64>限价价格(LMT / STP_LMT 必填)
aux_priceOption<f64>触发价(STP / STP_LMT / TRAIL 必填)
trailing_percentOption<f64>追踪止损百分比
time_in_forceOption<String>有效期:"DAY" / "GTC" / "GTD" / "OPG"
outside_rthOption<bool>是否允许盘前盘后交易(仅美股)
marketOption<String>市场
currencyOption<String>货币
expiryOption<String>期权/期货到期日
strikeOption<String>期权行权价
rightOption<String>期权方向:"CALL" / "PUT"
identifierOption<String>合约标识
order_legsOption<Vec<OrderLegRequest>>附加子单(止盈/止损)
algo_paramsOption<AlgoParamsRequest>算法单参数
remarkOption<String>备注
user_markOption<String>用户标记
display_sizeOption<i64>冰山单:每次展示数量
min_display_sizeOption<i64>冰山单:最小展示数量(须 ≤ display_size)
check_intervalsOption<i64>冰山单:价检间隔(秒)
price_typeOption<String>冰山单:"LIMIT_PRICE" / "ASK_PRICE" / "BID_PRICE" / "LATEST_PRICE",默认 "LIMIT_PRICE"
start_timeOption<i64>冰山单:生效开始时间(13位毫秒时间戳)
end_timeOption<i64>冰山单:生效结束时间(13位毫秒时间戳)

使用辅助函数构造 OrderRequest

use tigeropen::model::order::{
    market_order, limit_order, stop_order, stop_limit_order, trail_order,
    auction_limit_order, auction_market_order, iceberg_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 order = iceberg_order("YOUR_ACCOUNT", "AAPL", "STK", "BUY", 1000, 180.0, 100);

// 冰山单(设置可选参数)
let mut order = iceberg_order("YOUR_ACCOUNT", "AAPL", "STK", "BUY", 1000, 180.0, 100);
order.min_display_size = Some(50);
order.check_intervals = Some(30);
order.price_type = Some("LIMIT_PRICE".into());
order.start_time = Some(start_time);
order.end_time = Some(end_time);

// 市价单
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_idsub_idsorders 明细。

参数

参数名类型是否必填描述
orderOrderRequest订单请求对象

返回

Result<Option<PlaceOrderResult>, TigerError>

包含 id(全局订单 ID)、order_id(账户级订单 ID)、sub_idsorders

示例

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>

说明

在实际下单前预估订单的费用、保证金及可行性,不会真正提交到交易所。

参数

参数名类型是否必填描述
orderOrderRequest订单请求对象

返回

Result<Option<PreviewResult>, TigerError>

包含 is_passcommissioncommission_currencymargin_currencyinit_marginmaint_marginequity_with_loanavailable_eeexcess_liquiditygstmessage 等字段。

示例

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 会自动把 idaccount 写入请求。

参数

参数名类型是否必填描述
idi64要修改的全局订单 ID
orderOrderRequest包含新参数的订单对象

返回

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);
}

冰山单改单: 支持修改 total_quantitylimit_pricedisplay_sizemin_display_sizecheck_intervalsstart_timeend_time。不支持修改 price_type


cancel_order 取消订单

tc.cancel_order(id: i64) -> Result<Option<OrderIdResult>, TigerError>

说明

撤销指定订单。只能撤销状态为可撤单的订单,已成交订单无法撤销。

参数

参数名类型是否必填描述
idi64要撤销的全局订单 ID

返回

Result<Option<OrderIdResult>, TigerError>

包含撤销后的订单 id

示例

if let Some(r) = tc.cancel_order(12345).await? {
    println!("撤单 id={}", r.id);
}

订单查询

OrdersRequest 订单查询请求结构

OrdersRequestget_orders / get_active_orders / get_inactive_orders / get_filled_orders 共用的查询参数,所有字段均为 Optionaccount 留空自动填默认账户)。

参数名类型描述
accountOption<String>账户 ID
sec_typeOption<String>"STK" / "OPT" / "FUT"
marketOption<String>市场,如 "US" / "HK"
symbolOption<String>合约代码
start_dateOption<i64>开始时间(毫秒时间戳)
end_dateOption<i64>结束时间(毫秒时间戳)
limitOption<i32>单次返回条数
is_briefOption<bool>是否只返回精简字段
statesOption<Vec<String>>订单状态过滤,值参见上方 OrderStatus 枚举
sort_byOption<String>"LATEST_CREATED" / "LATEST_STATUS_UPDATED"
seg_typeOption<String>子账户分段
langOption<String>语言
page_tokenOption<String>分页 token
parent_idOption<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 包含 idorder_idsymbolsec_typeactionorder_typestatustotal_quantityfilled_quantitylimit_priceavg_fill_pricetime_in_forceoutside_rthopen_timeupdate_timecan_modifycan_cancelis_openexternal_idattr_descalgo_strategytrading_session_typelatest_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 查询单个订单

async fn get_order(&self, req: GetOrderRequest) -> Result<Option<Order>, TigerError>

说明

根据订单 ID 查询单个订单详情。id(全局订单 ID)与 order_id(账户级订单号)至少传一个。wire 方法 orders(服务端返回单个对象)。

参数

参数名类型是否必填描述
accountOption<String>账户 ID
idOption<i64>二选一全局订单 ID
order_idOption<i64>二选一账户级订单号
is_briefOption<bool>是否只返回精简字段
show_chargesOption<bool>是否展示费用
langOption<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 查询指定订单,也可按时间窗 / 合约批量过滤。

说明

查询订单的逐笔成交明细。

⚠️

symbol 在服务端为必填,不传会返回 field 'symbol' cannot be empty 错误。

参数

参数名类型是否必填描述
accountOption<String>账户 ID
order_idOption<i64>订单 ID(查询单订单时传)
symbolOption<String>合约代码(服务端必填)
sec_typeOption<String>合约类型
start_dateOption<i64>开始时间(毫秒时间戳)
end_dateOption<i64>结束时间(毫秒时间戳)
limitOption<i32>返回条数
page_tokenOption<String>分页 token
langOption<String>语言

返回

Result<Vec<Transaction>, TigerError>

每条 Transaction 包含 idorder_idaccountsymbolsec_typemarketcurrencyactionpricequantityfilled_quantityamountcommissiontransacted_attime 等字段。

示例

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 等字段过滤。

说明

查询当前账户的所有持仓信息,包括股票、期权、期货等各类合约。

参数

参数名类型是否必填描述
accountOption<String>账户 ID
symbolOption<String>合约代码
sec_typeOption<String>"STK" / "OPT" / "FUT"
currencyOption<String>币种
marketOption<String>市场
langOption<String>语言

返回

Result<Vec<Position>, TigerError>

每条 Position 包含 accountsymbolsec_typemarketcurrencypositionaverage_costmarket_valuerealized_pnlunrealized_pnlunrealized_pnl_percentcontract_ididentifiernamelatest_pricemultiplier 等字段(均为 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

说明

查询账户的资产概览,包括账户净值、现金余额、保证金使用情况等。

参数

参数名类型是否必填描述
accountOption<String>账户 ID
segmentOption<bool>是否返回分段明细
market_valueOption<bool>是否返回市值
langOption<String>语言

返回

Result<Vec<Asset>, TigerError>

每条 Asset 包含 accountcapabilitycurrencybuying_powercash_valuenet_liquidationrealized_pnlunrealized_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_idupdate_timestamp,以及 segments: Vec<PrimeAssetSegment>(每段含 capabilitycategorycurrencycash_balancecash_available_for_tradegross_position_valueequity_with_loannet_liquidationinit_marginmaintain_marginovernight_marginbuying_powerunrealized_plrealized_plcurrency_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
    );
}

账户管理

get_managed_accounts 查询机构子账户列表

async fn get_managed_accounts(&self, req: ManagedAccountsRequest) -> Result<Vec<ManagedAccount>, TigerError>

说明

查询当前主账户下可管理的机构子账户列表。wire 方法 accounts

参数

参数名类型是否必填描述
accountOption<String>账户 ID
langOption<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 查询衍生品合约

async fn get_derivative_contracts(&self, req: DerivativeContractsRequest) -> Result<Vec<Contract>, TigerError>

说明

symbols + 类型批量查询衍生品合约信息(期权 / 认股 / 牛熊)。wire 方法 quote_contract

参数

参数名类型是否必填描述
accountOption<String>账户 ID
symbolsVec<String>标的代码列表
sec_typeString"OPT" / "WAR" / "IOPT"
expiryOption<String>到期日 "YYYYMMDD"
langOption<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());

资产分析

get_analytics_asset 按日资产分析

async fn get_analytics_asset(&self, req: AnalyticsAssetRequest) -> Result<Vec<AnalyticsAsset>, TigerError>

说明

按日返回账户持仓价值、现金余额、盈亏与净值指数。wire 方法 analytics_asset

参数

参数名类型是否必填描述
accountOption<String>账户 ID
seg_typeOption<String>子账户分段
start_dateOption<String>起始日期("yyyy-MM-dd"
end_dateOption<String>结束日期("yyyy-MM-dd"
langOption<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 综合账户资产汇总

async fn get_aggregate_assets(&self, req: AggregateAssetsRequest) -> Result<Option<AggregateAssets>, TigerError>

说明

在指定 base_currency 视角下汇总综合账户资产(含各币种明细)。wire 方法 aggregate_assets

⚠️

仅支持机构账户,个人账户及模拟账户(PAPER)不支持此接口。

参数

参数名类型是否必填描述
accountOption<String>账户 ID
seg_typeOption<String>分段
base_currencyOption<String>基础币种
langOption<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 可交易数量估算

async fn get_estimate_tradable_quantity(&self, req: EstimateTradableQuantityRequest) -> Result<Option<EstimateTradableQuantity>, TigerError>

说明

根据账户可用资金、保证金、现价估算可下单数量。wire 方法 estimate_tradable_quantity

参数

参数名类型是否必填描述
accountOption<String>账户 ID
symbolString合约代码
sec_typeString合约类型
actionString"BUY" / "SELL"
order_typeOption<String>"MKT" / "LMT"
limit_priceOption<f64>条件"LMT" / "STP_LMT" 必填
marketOption<String>市场
langOption<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);
}

资金明细与调拨

get_fund_details 资金流水明细

async fn get_fund_details(&self, req: FundDetailsRequest) -> Result<Vec<FundDetails>, TigerError>

说明

按时间窗查询账户资金流水(入金 / 出金 / 费用 / 利息 / 分红等)。wire 方法 fund_details

参数

参数名类型是否必填描述
accountOption<String>账户 ID
fund_typeOption<String>资金类型
currencyOption<String>币种
start_dateOption<i64>起始时间(毫秒时间戳)
end_dateOption<i64>结束时间(毫秒时间戳)
limitOption<i32>返回条数
page_tokenOption<String>分页 token
langOption<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 资金调拨记录

async fn get_funding_history(&self, req: FundingHistoryRequest) -> Result<Vec<FundingHistoryItem>, TigerError>

说明

查询账户入金 / 出金的调拨记录。wire 方法 transfer_fund

参数

参数名类型是否必填描述
accountOption<String>账户 ID
seg_typeOption<String>分段
currencyOption<String>币种
start_dateOption<i64>起始时间(毫秒时间戳)
end_dateOption<i64>结束时间(毫秒时间戳)
limitOption<i32>返回条数
langOption<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 外汇下单

async fn place_forex_order(&self, req: ForexOrderRequest) -> Result<Option<ForexOrderResult>, TigerError>

说明

提交外汇兑换订单(货币之间转换)。wire 方法 place_forex_order

参数

参数名类型是否必填描述
accountOption<String>账户 ID
seg_typeOption<String>子账户分段
source_currencyString源币种
target_currencyString目标币种
source_amountOption<f64>源金额
target_amountOption<f64>目标金额
order_typeOption<String>订单类型
langOption<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 查询可调拨资金

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 子账户调拨历史

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 子账户资金调拨

async fn transfer_segment_fund(&self, req: SegmentFundRequest) -> Result<Option<SegmentFund>, TigerError>

说明

在子账户(分段)之间提交资金调拨申请。wire 方法 transfer_segment_fund

参数

参数名类型是否必填描述
accountOption<String>账户 ID
from_segmentString源分段
to_segmentString目标分段
currencyString币种
amountf64金额
langOption<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 撤销调拨申请

async fn cancel_segment_fund(&self, req: SegmentFundRequest) -> Result<Option<SegmentFund>, TigerError>

说明

撤销尚未执行的子账户调拨申请。wire 方法 cancel_segment_fund

参数

参数名类型是否必填描述
idString调拨申请 ID
accountOption<String>账户 ID
langOption<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()?;
// 交易接口用普通 HttpClient;行情接口须用 HttpClient::with_quote_server
let http = HttpClient::new(config);

// 直接调用 trade API
let resp = http.execute_trade_request("market_state", serde_json::json!({ "market": "US" })).await?;
println!("原始响应: {:?}", resp);

期权行权

v0.4.2 起,TradeClient 提供 5 个期权行权方法。

行权类型

说明
"Exercise"提前行权 — 在到期日前提前执行期权
"Expire"提前放弃行权 — 在到期日前主动放弃行权

option_exercise_check 行权检验

tc.option_exercise_check(req: OptionExerciseCheckRequest) -> Result<Option<OptionExerciseCheckResult>, TigerError>

预估行权或放弃行权后正股持仓变化,可在提交前确认结果。

请求字段

字段类型说明
contract_idOption<i64>期权合约 ID
exercise_typeOption<String>"Exercise" / "Expire"(wire 字段名 type
quantityOption<f64>行权数量(> 0)
executing_dateOption<String>行权执行日期 yyyy-MM-dd(Exercise 建议填)
is_forceOption<bool>是否强制行权(Exercise 建议填)
itm_rateOption<i32>价内率阈值 0–10(Expire 专用)
secret_keyOption<String>机构账户交易员密钥
accountOption<String>账户(SDK 自动注入)

返回(OptionExerciseCheckResult)

字段类型说明
available_quantityf64可行权数量
positionf64当前期权持仓
stk_positionf64正股当前持仓
stk_position_changef64行权后正股持仓变化量
stk_position_beforef64行权前正股持仓
stk_position_afterf64行权后正股持仓
symbolString正股代码

示例

use tigeropen::model::trade_requests::OptionExerciseCheckRequest;

let result = tc.option_exercise_check(OptionExerciseCheckRequest {
    contract_id: Some(1234567890),
    exercise_type: Some("Exercise".to_string()),
    quantity: Some(1.0),
    executing_date: Some("2025-06-20".to_string()),
    is_force: Some(false),
    ..Default::default()
}).await?;

if let Some(r) = result {
    println!("symbol={} availableQty={}", r.symbol, r.available_quantity);
    println!("stkPositionBefore={} stkPositionAfter={}", r.stk_position_before, r.stk_position_after);
}

// Expire 类型,设置价内率
let result = tc.option_exercise_check(OptionExerciseCheckRequest {
    contract_id: Some(1234567890),
    exercise_type: Some("Expire".to_string()),
    quantity: Some(1.0),
    itm_rate: Some(5),
    ..Default::default()
}).await?;

get_option_exercise_positions 查询可行权持仓

tc.get_option_exercise_positions(req: OptionExercisePositionRequest) -> Result<Option<OptionExercisePositionPageResult>, TigerError>

查询当前账户下可提交行权或放弃行权申请的期权持仓列表。

请求字段

字段类型说明
exercise_typeOption<String>"Exercise" / "Expire"
secret_keyOption<String>机构账户交易员密钥
accountOption<String>账户(SDK 自动注入)

返回(OptionExercisePositionPageResult)

字段类型说明
itemsVec<OptionExercisePosition>持仓列表
page_numi32当前页码
page_sizei32每页数量
item_counti32总记录数
page_counti32总页数

OptionExercisePosition 字段

字段类型说明
contract_idi64期权合约 ID
symbolString期权合约代码
stk_symbolString正股代码
expire_dateString到期日 yyyy-MM-dd
strikeString行权价
call_putStringCALL / PUT
marketString市场
account_idi64账户 ID
positionf64持仓数量
available_quantityf64可行权数量

示例

use tigeropen::model::trade_requests::OptionExercisePositionRequest;

if let Some(page) = tc.get_option_exercise_positions(OptionExercisePositionRequest {
    exercise_type: Some("Exercise".to_string()),
    ..Default::default()
}).await? {
    println!("itemCount={} pageCount={}", page.item_count, page.page_count);
    for pos in &page.items {
        println!("contractId={} symbol={} availableQty={}",
            pos.contract_id, pos.symbol, pos.available_quantity);
    }
}

submit_option_exercise 提交行权申请

tc.submit_option_exercise(req: OptionExerciseSubmitRequest) -> Result<Option<bool>, TigerError>

提交提前行权或提前放弃行权申请。返回 Some(true) 表示成功。

⚠️

注意

  • 提交前建议先调用 option_exercise_check 确认持仓变化
  • executing_dateis_force 仅在 Exercise 类型时有效
  • itm_rate 仅在 Expire 类型时有效
  • 此操作不可重试(不参与自动重试)

请求字段

字段类型说明
contract_idOption<i64>期权合约 ID
exercise_typeOption<String>"Exercise" / "Expire"
quantityOption<f64>行权数量(> 0)
executing_dateOption<String>行权执行日期(Exercise 必填)
is_forceOption<bool>是否强制行权(Exercise 必填)
itm_rateOption<i32>价内率阈值 0–10(Expire 专用)
secret_keyOption<String>机构账户交易员密钥

示例

use tigeropen::model::trade_requests::OptionExerciseSubmitRequest;

// 提前行权
let ok = tc.submit_option_exercise(OptionExerciseSubmitRequest {
    contract_id: Some(1234567890),
    exercise_type: Some("Exercise".to_string()),
    quantity: Some(1.0),
    executing_date: Some("2025-06-20".to_string()),
    is_force: Some(false),
    ..Default::default()
}).await?;
println!("{}", if ok.unwrap_or(false) { "提交成功" } else { "提交失败" });

// 提前放弃行权
let ok = tc.submit_option_exercise(OptionExerciseSubmitRequest {
    contract_id: Some(1234567890),
    exercise_type: Some("Expire".to_string()),
    quantity: Some(1.0),
    ..Default::default()
}).await?;

get_option_exercise_records 查询行权记录

tc.get_option_exercise_records(req: OptionExerciseRecordsRequest) -> Result<Option<OptionExerciseRecordPageResult>, TigerError>

分页查询已提交的行权申请记录。

请求字段

字段类型说明
pageOption<i32>页码,从 1 开始,默认 1
sizeOption<i32>每页数量,1–100,默认 20
statusOption<String>状态过滤:New / Cancel / Success / Fail
exercise_typeOption<String>行权类型过滤:Exercise / Expire
symbolOption<String>正股代码过滤
order_byOption<String>排序字段:symbol / expire_date / strike / is_call
secret_keyOption<String>机构账户交易员密钥
accountOption<String>账户(SDK 自动注入)

返回(OptionExerciseRecordPageResult)

字段类型说明
itemsVec<OptionExerciseRecord>记录列表
item_counti32总记录数
page_numi32当前页码
page_sizei32每页数量
page_counti32总页数

OptionExerciseRecord 字段

字段类型说明
idi64行权申请记录 ID
contract_idi64期权合约 ID
symbolString期权合约代码
stk_symbolString正股代码
expire_dateString到期日
strikeString行权价
call_putStringCALL / PUT
exercise_typeStringExercise / Expire(wire 字段名 type
request_quantityf64申请数量
quantityf64实际行权数量
statusStringNew / Cancel / Success / Fail
executing_dateString行权执行日期
itm_ratei32价内率
is_forcebool是否强制行权
reasonString拒绝原因(如有)
account_idi64账户 ID

示例

use tigeropen::model::trade_requests::OptionExerciseRecordsRequest;

if let Some(page) = tc.get_option_exercise_records(OptionExerciseRecordsRequest {
    page: Some(1),
    size: Some(20),
    ..Default::default()
}).await? {
    println!("itemCount={} pageCount={}", page.item_count, page.page_count);
    for r in &page.items {
        println!("id={} type={} status={}", r.id, r.exercise_type, r.status);
    }
}

cancel_option_exercise 撤销行权申请

tc.cancel_option_exercise(req: OptionExerciseCancelRequest) -> Result<Option<bool>, TigerError>

撤销尚未执行的行权申请。返回 Some(true) 表示成功。

请求字段

字段类型说明
idOption<i64>行权申请记录 ID(从查询行权记录接口获取)
secret_keyOption<String>机构账户交易员密钥
accountOption<String>账户(SDK 自动注入)

示例

use tigeropen::model::trade_requests::OptionExerciseCancelRequest;

let ok = tc.cancel_option_exercise(OptionExerciseCancelRequest {
    id: Some(record_id),
    ..Default::default()
}).await?;
println!("{}", if ok.unwrap_or(false) { "撤销成功" } else { "撤销失败" });