实时推送

推送使用 Protobuf、TCP 和 TLS。行情订阅需要相应牌照;账户订阅需要账户权限。subscribe/unsubscribe 仅返回消息是否写入内部通道,不代表服务端已接受。自动重连默认开启,退避上限 60 秒,并恢复通过状态管理方法记录的订阅。

创建推送客户端

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

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

设置回调

pub fn set_callbacks(&self, cb: Callbacks)

替换整组回调。行情回调为 on_quote(QuoteData)on_tick(TradeTickData)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_quote_bbo(QuoteData);账户回调为 on_asset(AssetData)on_position(PositionData)on_order(OrderStatusData)on_transaction(OrderTransactionData);连接回调为 on_connect()on_disconnect()on_error(String)on_kickout(String)。类型位于 tigeropen::push::pb

连接与状态

方法与方法签名行为、默认值与错误
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。SubjectTypeQuote/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 不自动更新上述状态;如需重连恢复,应同时记录,或使用以下便捷方法。

便捷方法

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) 取消全部加密货币记录。这些方法当前忽略底层 bool 并在本地更新状态,因此 Ok(()) 不保证服务端已接受。

公开协议方法

handle_message(&self, data: &[u8]) 解码 varint32 帧并分派回调,主要用于测试/自定义传输。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","latestPrice":150.5,"volume":1000000}

推送无 HTTP 分页;频率由服务端事件流决定。慢回调会阻塞分派,应将耗时工作转交其他任务。源码:PushClientCallbacksSubjectType

本节页面


Did this page help you?