Rust SDK (Beta)
老虎证券 OpenAPI Rust SDK,提供行情查询、交易下单、账户管理和实时推送等功能。
- 要求 Rust 1.70 或更高版本
- 源码仓库:openapi-rust-sdk
- Crates.io:tigeropen
v0.3.0 起:
QuoteClient/TradeClient的全部方法改为get_*前缀并返回强类型响应(如Vec<MarketState>、Vec<Brief>、Vec<Order>、Option<PlaceOrderResult>),不再返回Result<Option<serde_json::Value>, TigerError>。请求体字段自动序列化为 snake_case,响应字段自动按 camelCase 反序列化;交易查询接口的{items: [...]}外壳也已被 SDK 自动剥除。Order为响应模型,OrderRequest为下单请求模型,推荐使用limit_order/market_order/stop_order等辅助函数构造请求。详见本页与quote-rust、trade-rust、push-rust小节。
安装
在 Cargo.toml 中添加依赖:
[dependencies]
tigeropen = "0.3.0"
tokio = { version = "1", features = ["full"] }要求 Rust 1.70 或更高版本。
配置
SDK 支持多种配置方式,优先级:环境变量 > Builder 设置(含配置文件) > 自动发现配置文件 > 默认值。
SDK 会自动搜索以下路径的配置文件(无需显式指定):
- 当前目录
./tiger_openapi_config.properties - 用户目录
~/.tigeropen/tiger_openapi_config.properties
方式一:从 properties 配置文件加载(推荐)
use tigeropen::config::ClientConfig;
// 指定配置文件路径
let config = ClientConfig::builder()
.properties_file("/path/to/tiger_openapi_config.properties")
.build()?;
// 或不传参数,SDK 自动搜索默认路径
let config = ClientConfig::builder().build()?;配置文件格式:
tiger_id=你的开发者ID
private_key=你的RSA私钥
account=你的交易账户
license=TBUS方式二:Builder 模式
use tigeropen::config::ClientConfig;
let config = ClientConfig::builder()
.tiger_id("你的 tiger_id")
.private_key("你的 RSA 私钥")
.account("你的交易账户")
.build()?;方式三:环境变量
export TIGEROPEN_TIGER_ID=你的开发者ID
export TIGEROPEN_PRIVATE_KEY=你的RSA私钥
export TIGEROPEN_ACCOUNT=你的交易账户
export TIGEROPEN_TOKEN=你的Token # TBHK 牌照需要配置项说明
| 配置项 | 说明 | 必填 | 默认值 |
|---|---|---|---|
| tiger_id | 开发者 ID | 是 | - |
| private_key | RSA 私钥(PK1与PK8都兼容) | 是 | - |
| account | 交易账户 | 否 | - |
| license | 牌照类型(如 TBUS) | 否 | - |
| language | 语言(ZhCn/EnUs) | 否 | ZhCn |
| timeout | 请求超时 | 否 | 15s |
| token | TBHK 牌照 Token | 否 | - |
自动检测
- 设备 ID:SDK 自动从网卡 MAC 地址获取(
mac_addresscrate),无需手动设置 - 动态域名:SDK 自动从域名花园获取最新服务器地址,默认启用
- 行情服务器:SDK 自动解析独立的行情服务器地址(
LICENSE-QUOTE域名键) - 签名验证:SDK 内置 Tiger 公钥,自动验证 HTTP 响应签名
构造客户端
SDK 的业务客户端(QuoteClient / TradeClient)不直接接受 ClientConfig,而是接受一个 HttpClient 引用;行情客户端需使用 HttpClient::with_quote_server 指向行情专用服务器,交易客户端使用 HttpClient::new 并额外传入账户号。
行情客户端
use tigeropen::client::http_client::HttpClient;
use tigeropen::config::ClientConfig;
use tigeropen::quote::QuoteClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = ClientConfig::builder().build()?;
// 行情请求发往 config.quote_server_url
let http = HttpClient::with_quote_server(config);
let qc = QuoteClient::new(&http);
// v0.3.0 起返回强类型数组
let states = qc.get_market_state("US").await?;
if let Some(s) = states.first() {
println!("market={} status={}", s.market, s.market_status);
}
Ok(())
}交易客户端
use tigeropen::client::http_client::HttpClient;
use tigeropen::config::ClientConfig;
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();
// 交易请求发往 config.server_url
let http = HttpClient::new(config);
let tc = TradeClient::new(&http, &account);
let positions = tc.get_positions().await?;
println!("持仓数量: {}", positions.len());
Ok(())
}推送客户端
use std::sync::Arc;
use tigeropen::config::ClientConfig;
use tigeropen::push::PushClient;
let config = ClientConfig::builder().build()?;
let pc = Arc::new(PushClient::new(config, None));Updated 16 days ago
