实时推送

推送使用 Protobuf、TCP 和 TLS。行情订阅需要相应牌照;账户订阅需要账户权限。subscribe/unsubscribe 仅返回消息是否写入内部通道,不代表服务端已接受。自动重连默认开启,退避上限 60 秒。重连后可恢复状态管理方法按 symbols 记录的标准行情订阅;subscribe_market 的港股全市场行情订阅、排行榜订阅以及账户订阅使用的自定义账户不会被完整保存,必须在连接成功后显式重新订阅。

安全警告:当前 Rust SDK 的 TLS 连接无条件接受任意服务端证书,不验证证书链或主机名,因此无法认证服务端身份并存在中间人攻击风险。连接官方端点或使用可信网络都不能弥补此缺失;需要 SDK 实现完整的证书链和主机名验证。

创建推送客户端

pub fn new(config: ClientConfig, options: Option<PushClientOptions>) -> PushClient

PushClientOptions 字段均为 Option:push_url 默认 openapi.tigerfintech.com:9883;heartbeat_interval_secs=10;reconnect_interval_secs=5;auto_reconnect=true;connect_timeout_secs=30。

设置回调

pub fn set_callbacks(&self, cb: Callbacks)

替换整组回调。行情回调为 on_quote(QuoteData)、on_tick(PushTradeTick)、on_depth(QuoteDepthData)、on_option(QuoteData)、on_future(QuoteData)、on_kline(KlineData)、on_stock_top(StockTopData)、on_option_top(OptionTopData)、on_full_tick(TickData);账户回调为 on_asset(AssetData)、on_position(PositionData)、on_order(OrderStatusData)、on_transaction(OrderTransactionData);连接回调为 on_connect()、on_disconnect()、on_error(String)、on_kickout(String)。PushTradeTick 从 tigeropen::push 导出,其余数据类型位于 tigeropen::push::pb。分派器为无法识别 data_type 的 QuoteData 保留 on_quote_bbo 回退分支,但 SubjectType::QuoteBbo 当前映射为 Quote,因此正常 BBO 数据仍由对应的 on_quote、on_option 或 on_future 接收。

连接与状态

方法与方法签名行为、默认值与错误
connect(client: &Arc<PushClient>) -> Result<(), String>异步自由函数;TCP/TLS、RSA 鉴权,等待 CONNECTED;重复连接返回错误,超时默认 30 秒。
disconnect(&self)尽力发送 DISCONNECT,停止任务,清理通道,触发 on_disconnect。
state(&self) -> ConnectionStateDisconnected/Connecting/Connected。
send_heartbeat(&self) -> bool写入心跳帧;未连接或通道关闭返回 false。

订阅

pub fn subscribe(&self, subject: &SubjectType, symbols: Option<&str>, account: Option<&str>, market: Option<&str>) -> bool
pub fn unsubscribe(&self, subject: &SubjectType, symbols: Option<&str>, account: Option<&str>, market: Option<&str>) -> bool

symbols 是逗号分隔字符串。行情使用 symbols,账户主题使用 account,市场/榜单使用 market。SubjectType 为 Quote/Tick/Depth/Option/Future/Kline/StockTop/OptionTop/FullTick/QuoteBbo/Asset/Position/Order/Transaction/Cc/Market。

状态管理方法

方法签名用途
add_subscription(&self, subject: SubjectType, symbols: &[String])记录行情订阅,用于查询和重连恢复。
remove_subscription(&self, subject: SubjectType, symbols: Option<&[String]>)删除指定标的;None 删除主题。
get_subscriptions(&self) -> HashMap<SubjectType, Vec<String>>返回记录的行情订阅。
add_account_sub(&self, subject: SubjectType)记录账户主题。
remove_account_sub(&self, subject: &SubjectType)删除账户主题。
get_account_subscriptions(&self) -> Vec<SubjectType>返回账户主题。

基础 subscribe 不自动更新上述状态;如需恢复 symbols 型标准行情订阅,应同时记录,或使用以下便捷方法。subscribe_market 的港股全市场行情订阅、排行榜订阅和自定义账户订阅仍需在连接成功后显式重新订阅。

便捷方法

pub fn subscribe_cc(&self, symbols: &[&str]) -> Result<(), TigerError>
pub fn unsubscribe_cc(&self, symbols: Option<&[&str]>) -> Result<(), TigerError>
pub fn subscribe_market(&self, market: &str) -> Result<(), TigerError>
pub fn unsubscribe_market(&self, market: &str) -> Result<(), TigerError>

subscribe_cc 接受任意切片,当前实现不校验空切片;unsubscribe_cc(None) 取消全部加密货币记录。subscribe_market 仅支持 HK,用于港股全市场行情,更新通过普通 on_quote 回调按标的送达,不是市场状态或快照。这些方法当前忽略底层 bool 并在本地更新状态,因此 Ok(()) 不保证协议帧已进入发送通道或服务端已接受。

公开协议方法

handle_message(&self, data: &[u8]) 解码一个完整的 varint32 帧并分派回调,主要用于测试/自定义传输;空切片或不完整帧会触发 on_error,不是有效示例。push::varint::{encode_varint32, decode_varint32} 和 push::proto_message::{build_connect_message, build_heartbeat_message, build_subscribe_message, build_unsubscribe_message, build_disconnect_message, subject_to_data_type} 也是公开函数;普通应用应使用 connect 和订阅 API。

示例

use std::sync::Arc;
use tigeropen::config::ClientConfig;
use tigeropen::push::{connect, Callbacks, PushClient, SubjectType};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Arc::new(PushClient::new(ClientConfig::builder().build()?, None));
    client.set_callbacks(Callbacks {
        on_quote: Some(Arc::new(|q| println!("{} {:?}", q.symbol, q.latest_price))),
        on_error: Some(Arc::new(|message| eprintln!("{message}"))),
        ..Default::default()
    });
    connect(&client).await.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
    let symbols = vec!["AAPL".to_string()];
    if client.subscribe(&SubjectType::Quote, Some("AAPL"), None, None) {
        client.add_subscription(SubjectType::Quote, &symbols);
    }
    client.disconnect();
    Ok(())
}
{"symbol":"AAPL","latest_price":150.5,"volume":1000000}

推送无 HTTP 分页。慢回调会阻塞分派,应将耗时工作转交其他任务。源码:PushClient、Callbacks、SubjectType。

本节页面


Did this page help you?