实时推送
推送使用 Protobuf、TCP 和 TLS。行情订阅需要相应牌照;账户订阅需要账户权限。subscribe/unsubscribe 仅返回消息是否写入内部通道,不代表服务端已接受。自动重连默认开启,退避上限 60 秒,并恢复通过状态管理方法记录的订阅。
创建推送客户端
pub fn new(config: ClientConfig, options: Option<PushClientOptions>) -> PushClientPushClientOptions 字段均为 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(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。
连接与状态
订阅
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>) -> boolsymbols 是逗号分隔字符串。行情使用 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 不自动更新上述状态;如需重连恢复,应同时记录,或使用以下便捷方法。
便捷方法
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 分页;频率由服务端事件流决定。慢回调会阻塞分派,应将耗时工作转交其他任务。源码:PushClient、Callbacks、SubjectType。
本节页面
Updated 9 days ago
