Rust SDK (Beta)

老虎证券 OpenAPI Rust SDK,提供行情查询、交易下单、账户管理和实时推送等功能。

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-rusttrade-rustpush-rust 小节。

安装

Cargo.toml 中添加依赖:

[dependencies]
tigeropen = "0.3.0"
tokio = { version = "1", features = ["full"] }

要求 Rust 1.70 或更高版本。

配置

SDK 支持多种配置方式,优先级:环境变量 > Builder 设置(含配置文件) > 自动发现配置文件 > 默认值

SDK 会自动搜索以下路径的配置文件(无需显式指定):

  1. 当前目录 ./tiger_openapi_config.properties
  2. 用户目录 ~/.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_keyRSA 私钥(PK1与PK8都兼容)-
account交易账户-
license牌照类型(如 TBUS)-
language语言(ZhCn/EnUs)ZhCn
timeout请求超时15s
tokenTBHK 牌照 Token-

自动检测

  • 设备 ID:SDK 自动从网卡 MAC 地址获取(mac_address crate),无需手动设置
  • 动态域名: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));