交易操作

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());  // 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"
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>用户标记

使用辅助函数构造 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_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);
}

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 订单查询请求结构 (v0.4.0 新增)

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 查询单个订单 (v0.4.0 新增)

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 查询指定订单,也可按时间窗 / 合约批量过滤。

说明

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

参数

参数名类型是否必填描述
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
    );
}

账户管理 (v0.4.0 新增)

get_managed_accounts 查询机构子账户列表 (v0.4.0 新增)

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 查询衍生品合约 (v0.4.0 新增)

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

资产分析 (v0.4.0 新增)

get_analytics_asset 按日资产分析 (v0.4.0 新增)

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 综合账户资产汇总 (v0.4.0 新增)

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

说明

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

参数

参数名类型是否必填描述
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 可交易数量估算 (v0.4.0 新增)

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

资金明细与调拨 (v0.4.0 新增)

get_fund_details 资金流水明细 (v0.4.0 新增)

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 资金调拨记录 (v0.4.0 新增)

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 外汇下单 (v0.4.0 新增)

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 查询可调拨资金 (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

参数

参数名类型是否必填描述
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 撤销调拨申请 (v0.4.0 新增)

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()?;
let http = HttpClient::new(config);

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