WebSocket API
WebSocket API 实时数据订阅服务
概述
ChainStream DEX WebSocket API 提供实时数据订阅服务,支持以下数据类型:
- K线数据 (Candles)
- 代币统计 (Token Stats)
- 交易事件 (Trade Events)
- 钱包交易事件 (Wallet Trade Event)
- 钱包余额 (Wallet Balance)
- 代币持有者 (Token Holders)
基础 URL
wss://realtime-dex.chainstream.io/connection/websocket
快速开始
1. 建立连接
首先需要创建 WebSocket 连接并进行认证:
const ws = new WebSocket("wss://realtime-dex.chainstream.io/connection/websocket");
ws.onopen = () => {
// 发送认证消息
ws.send(JSON.stringify({
type: "auth",
token: "YOUR_ACCESS_TOKEN"
}));
};
2. 订阅数据
选择需要的数据类型进行订阅:
// 订阅K线数据示例
ws.send(JSON.stringify({
type: "subscribe",
channel: "dex-candle:sol_6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN_1m"
}));
3. 处理数据
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('收到数据:', data);
};
数据订阅
K线数据
实时获取代币价格走势的K线图数据。
订阅格式
dex-candle:{chain}_{tokenAddress}_{resolution}
参数说明
区块链名称,例如:sol
代币合约地址,例如:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN
K线周期,支持:1m, 5m, 15m, 1h, 4h, 1d
响应数据格式
WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。
{
"o": number, // 开盘价
"c": number, // 收盘价
"h": number, // 最高价
"l": number, // 最低价
"v": number, // 交易量
"r": string, // 周期
"t": number // 时间戳
}
{
"o": number, // 开盘价
"c": number, // 收盘价
"h": number, // 最高价
"l": number, // 最低价
"v": number, // 交易量
"r": string, // 周期
"t": number // 时间戳
}
{
"open": number, // 开盘价
"close": number, // 收盘价
"high": number, // 最高价
"low": number, // 最低价
"volume": number, // 交易量
"resolution": string, // 周期
"time": number // 时间戳
}
代币统计
实时获取代币的市场统计数据。
订阅格式
dex-token-stats:{chain}_{tokenAddress}
参数说明
区块链名称,例如:sol
代币合约地址,例如:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN
响应数据格式
WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。
{
"a": string, // 代币地址
"t": number, // 时间戳
"b1m": number, // 1分钟内买入次数
"s1m": number, // 1分钟内卖出次数
"be1m": number, // 1分钟内买入人数
"se1m": number, // 1分钟内卖出人数
"bviu1m": number, // 1分钟内买入美元金额
"sviu1m": number, // 1分钟内卖出美元金额
"p1m": number, // 1分钟价格
"b5m": number, // 5分钟内买入次数
"s5m": number, // 5分钟内卖出次数
"be5m": number, // 5分钟内买入人数
"se5m": number, // 5分钟内卖出人数
"bviu5m": number, // 5分钟内买入美元金额
"sviu5m": number, // 5分钟内卖出美元金额
"p5m": number, // 5分钟价格
"b15m": number, // 15分钟内买入次数
"s15m": number, // 15分钟内卖出次数
"be15m": number, // 15分钟内买入人数
"se15m": number, // 15分钟内卖出人数
"bviu15m": number,// 15分钟内买入美元金额
"sviu15m": number,// 15分钟内卖出美元金额
"p15m": number, // 15分钟价格
"b30m": number, // 30分钟内买入次数
"s30m": number, // 30分钟内卖出次数
"be30m": number, // 30分钟内买入人数
"se30m": number, // 30分钟内卖出人数
"bviu30m": number,// 30分钟内买入美元金额
"sviu30m": number,// 30分钟内卖出美元金额
"p30m": number, // 30分钟价格
"b1h": number, // 1小时内买入次数
"s1h": number, // 1小时内卖出次数
"be1h": number, // 1小时内买入人数
"se1h": number, // 1小时内卖出人数
"bviu1h": number, // 1小时内买入美元金额
"sviu1h": number, // 1小时内卖出美元金额
"p1h": number, // 1小时价格
"b4h": number, // 4小时内买入次数
"s4h": number, // 4小时内卖出次数
"be4h": number, // 4小时内买入人数
"se4h": number, // 4小时内卖出人数
"bviu4h": number, // 4小时内买入美元金额
"sviu4h": number, // 4小时内卖出美元金额
"p4h": number, // 4小时价格
"b24h": number, // 24小时内买入次数
"s24h": number, // 24小时内卖出次数
"be24h": number, // 24小时内买入人数
"se24h": number, // 24小时内卖出人数
"bviu24h": number,// 24小时内买入美元金额
"sviu24h": number,// 24小时内卖出美元金额
"p24h": number, // 24小时价格
"p": number // 当前价格
}
{
"a": string, // 代币地址
"t": number, // 时间戳
"b1m": number, // 1分钟内买入次数
"s1m": number, // 1分钟内卖出次数
"be1m": number, // 1分钟内买入人数
"se1m": number, // 1分钟内卖出人数
"bviu1m": number, // 1分钟内买入美元金额
"sviu1m": number, // 1分钟内卖出美元金额
"p1m": number, // 1分钟价格
"b5m": number, // 5分钟内买入次数
"s5m": number, // 5分钟内卖出次数
"be5m": number, // 5分钟内买入人数
"se5m": number, // 5分钟内卖出人数
"bviu5m": number, // 5分钟内买入美元金额
"sviu5m": number, // 5分钟内卖出美元金额
"p5m": number, // 5分钟价格
"b15m": number, // 15分钟内买入次数
"s15m": number, // 15分钟内卖出次数
"be15m": number, // 15分钟内买入人数
"se15m": number, // 15分钟内卖出人数
"bviu15m": number,// 15分钟内买入美元金额
"sviu15m": number,// 15分钟内卖出美元金额
"p15m": number, // 15分钟价格
"b30m": number, // 30分钟内买入次数
"s30m": number, // 30分钟内卖出次数
"be30m": number, // 30分钟内买入人数
"se30m": number, // 30分钟内卖出人数
"bviu30m": number,// 30分钟内买入美元金额
"sviu30m": number,// 30分钟内卖出美元金额
"p30m": number, // 30分钟价格
"b1h": number, // 1小时内买入次数
"s1h": number, // 1小时内卖出次数
"be1h": number, // 1小时内买入人数
"se1h": number, // 1小时内卖出人数
"bviu1h": number, // 1小时内买入美元金额
"sviu1h": number, // 1小时内卖出美元金额
"p1h": number, // 1小时价格
"b4h": number, // 4小时内买入次数
"s4h": number, // 4小时内卖出次数
"be4h": number, // 4小时内买入人数
"se4h": number, // 4小时内卖出人数
"bviu4h": number, // 4小时内买入美元金额
"sviu4h": number, // 4小时内卖出美元金额
"p4h": number, // 4小时价格
"b24h": number, // 24小时内买入次数
"s24h": number, // 24小时内卖出次数
"be24h": number, // 24小时内买入人数
"se24h": number, // 24小时内卖出人数
"bviu24h": number,// 24小时内买入美元金额
"sviu24h": number,// 24小时内卖出美元金额
"p24h": number, // 24小时价格
"p": number // 当前价格
}
{
"address": string, // 代币地址
"timestamp": number, // 时间戳
"buys1m": number, // 1分钟内买入次数
"sells1m": number, // 1分钟内卖出次数
"buyers1m": number, // 1分钟内买入人数
"sellers1m": number, // 1分钟内卖出人数
"buyVolumeInUsd1m": number, // 1分钟内买入美元金额
"sellVolumeInUsd1m": number,// 1分钟内卖出美元金额
"price1m": number, // 1分钟价格
"buys5m": number, // 5分钟内买入次数
"sells5m": number, // 5分钟内卖出次数
"buyers5m": number, // 5分钟内买入人数
"sellers5m": number, // 5分钟内卖出人数
"buyVolumeInUsd5m": number, // 5分钟内买入美元金额
"sellVolumeInUsd5m": number,// 5分钟内卖出美元金额
"price5m": number, // 5分钟价格
"buys15m": number, // 15分钟内买入次数
"sells15m": number, // 15分钟内卖出次数
"buyers15m": number, // 15分钟内买入人数
"sellers15m": number, // 15分钟内卖出人数
"buyVolumeInUsd15m": number,// 15分钟内买入美元金额
"sellVolumeInUsd15m": number,// 15分钟内卖出美元金额
"price15m": number, // 15分钟价格
"buys30m": number, // 30分钟内买入次数
"sells30m": number, // 30分钟内卖出次数
"buyers30m": number, // 30分钟内买入人数
"sellers30m": number, // 30分钟内卖出人数
"buyVolumeInUsd30m": number,// 30分钟内买入美元金额
"sellVolumeInUsd30m": number,// 30分钟内卖出美元金额
"price30m": number, // 30分钟价格
"buys1h": number, // 1小时内买入次数
"sells1h": number, // 1小时内卖出次数
"buyers1h": number, // 1小时内买入人数
"sellers1h": number, // 1小时内卖出人数
"buyVolumeInUsd1h": number, // 1小时内买入美元金额
"sellVolumeInUsd1h": number,// 1小时内卖出美元金额
"price1h": number, // 1小时价格
"buys4h": number, // 4小时内买入次数
"sells4h": number, // 4小时内卖出次数
"buyers4h": number, // 4小时内买入人数
"sellers4h": number, // 4小时内卖出人数
"buyVolumeInUsd4h": number, // 4小时内买入美元金额
"sellVolumeInUsd4h": number,// 4小时内卖出美元金额
"price4h": number, // 4小时价格
"buys24h": number, // 24小时内买入次数
"sells24h": number, // 24小时内卖出次数
"buyers24h": number, // 24小时内买入人数
"sellers24h": number, // 24小时内卖出人数
"buyVolumeInUsd24h": number,// 24小时内买入美元金额
"sellVolumeInUsd24h": number,// 24小时内卖出美元金额
"price24h": number, // 24小时价格
"price": number // 当前价格
}
交易事件
实时获取代币的交易事件。
订阅格式
dex-trades:{chain}_{tokenAddress}
参数说明
区块链名称,例如:sol
代币合约地址,例如:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN
响应数据格式
WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。
{
"bwa": string, // maker地址
"ba": number, // 基础代币数量
"sa": number, // 报价代币数量
"swa": string, // 报价代币地址
"bais": number, // 美元金额
"t": number, // 时间戳
"k": string, // 事件类型
"h": string, // 交易哈希
"a": string // 代币地址
}
{
"bwa": string, // maker地址
"ba": number, // 基础代币数量
"sa": number, // 报价代币数量
"swa": string, // 报价代币地址
"bais": number, // 美元金额
"t": number, // 时间戳
"k": string, // 事件类型
"h": string, // 交易哈希
"a": string // 代币地址
}
{
"maker": string, // maker地址
"baseAmount": number, // 基础代币数量
"quoteAmount": number, // 报价代币数量
"quoteAddress": string, // 报价代币地址
"amountInUsd": number, // 美元金额
"timestamp": number, // 时间戳
"event": string, // 事件类型
"txHash": string, // 交易哈希
"tokenAddress": string // 代币地址
}
钱包交易事件
实时获取指定钱包的交易事件。
订阅格式
dex-wallet-trade:{chain}_{walletAddress}
参数说明
区块链名称,例如:sol
钱包地址,例如:GDekof7TtgeBKJtoVpkvzPin5mvhxSDyoUY2c1FK1T3i
响应数据格式
WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。
{
"bwa": string, // maker地址
"ba": number, // 基础代币数量
"sa": number, // 报价代币数量
"swa": string, // 报价代币地址
"bais": number, // 美元金额
"t": number, // 时间戳
"k": string, // 事件类型
"h": string, // 交易哈希
"a": string // 代币地址
}
{
"bwa": string, // maker地址
"ba": number, // 基础代币数量
"sa": number, // 报价代币数量
"swa": string, // 报价代币地址
"bais": number, // 美元金额
"t": number, // 时间戳
"k": string, // 事件类型
"h": string, // 交易哈希
"a": string // 代币地址
}
{
"maker": string, // maker地址
"baseAmount": number, // 基础代币数量
"quoteAmount": number, // 报价代币数量
"quoteAddress": string, // 报价代币地址
"amountInUsd": number, // 美元金额
"timestamp": number, // 时间戳
"event": string, // 事件类型
"txHash": string, // 交易哈希
"tokenAddress": string // 代币地址
}
钱包余额
实时获取钱包的余额信息。
订阅格式
dex-wallet-balance:{chain}_{walletAddress}
参数说明
区块链名称,例如:sol
钱包地址,例如:HN7cABqLq46Es1jh92dQQisAq662SmxELLLsHHe4YWrH
响应数据格式
WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。
{
"a": string, // 钱包地址
"ta": string, // 代币地址
"tpiu": number, // 代币美元价格
"t": number, // 时间戳
"ba": number, // 买入数量
"baiu": number, // 买入美元金额
"bs": number, // 买入次数
"sa": number, // 卖出数量
"saiu": number, // 卖出美元金额
"ss": number, // 卖出次数
"abp": number, // 平均买入价格
"asp": number, // 平均卖出价格
"upiu": number, // 未实现盈亏(USD)
"upr": number, // 未实现盈亏率
"rpiu": number, // 已实现盈亏(USD)
"rpr": number, // 已实现盈亏率
"trpiu": number, // 总实现盈亏(USD)
"trr": number // 总实现盈亏率
}
{
"a": string, // 钱包地址
"ta": string, // 代币地址
"tpiu": number, // 代币美元价格
"t": number, // 时间戳
"ba": number, // 买入数量
"baiu": number, // 买入美元金额
"bs": number, // 买入次数
"sa": number, // 卖出数量
"saiu": number, // 卖出美元金额
"ss": number, // 卖出次数
"abp": number, // 平均买入价格
"asp": number, // 平均卖出价格
"upiu": number, // 未实现盈亏(USD)
"upr": number, // 未实现盈亏率
"rpiu": number, // 已实现盈亏(USD)
"rpr": number, // 已实现盈亏率
"trpiu": number, // 总实现盈亏(USD)
"trr": number // 总实现盈亏率
}
{
"walletAddress": string, // 钱包地址
"tokenAddress": string, // 代币地址
"tokenPriceInUsd": number, // 代币美元价格
"timestamp": number, // 时间戳
"buyAmount": number, // 买入数量
"buyAmountInUsd": number, // 买入美元金额
"buys": number, // 买入次数
"sellAmount": number, // 卖出数量
"sellAmountInUsd": number, // 卖出美元金额
"sells": number, // 卖出次数
"averageBuyPrice": number, // 平均买入价格
"averageSellPrice": number, // 平均卖出价格
"unrealizedProfitInUsd": number, // 未实现盈亏(USD)
"unrealizedProfitRatio": number, // 未实现盈亏率
"realizedProfitInUsd": number, // 已实现盈亏(USD)
"realizedProfitRatio": number, // 已实现盈亏率
"totalRealizedProfitInUsd": number, // 总实现盈亏(USD)
"totalRealizedProfitRatio": number // 总实现盈亏率
}
代币持有者统计
实时获取代币持有者统计信息。
订阅格式
dex-token-general-stat-num:{chain}_{tokenAddress}
参数说明
区块链名称,例如:sol
代币合约地址,例如:6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN
响应数据格式
WebSocket API 返回简短字段名以优化传输效率,SDK 返回完整字段名以提高代码可读性。
{
"a": string, // 代币地址
"v": number, // 持有者数量
"ts": number // 时间戳
}
{
"a": string, // 代币地址
"v": number, // 持有者数量
"ts": number // 时间戳
}
{
"tokenAddress": string, // 代币地址
"holders": number, // 持有者数量
"timestamp": number // 时间戳
}
使用示例
const streamApi = new StreamApi(context);
// 订阅K线数据
streamApi.subscribeTokenCandles({
chain: "sol",
tokenAddress: "6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN",
resolution: "1m",
callback: (data) => {
console.log("K线数据:", data);
}
});
// 订阅钱包余额
streamApi.subscribeWalletBalance({
chain: "sol",
walletAddress: "YOUR_WALLET_ADDRESS",
callback: (data) => {
console.log("钱包余额:", data);
}
});
重连策略
推荐使用指数退避算法进行重连:
function reconnect(attempt) {
const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
setTimeout(() => {
connect();
}, delay);
}
使用限制
限制项 | 限制值 | 说明 |
---|---|---|
最大订阅数 | 100个/连接 | 超出将被拒绝 |
消息大小 | 100KB | 超出将被截断 |
心跳间隔 | 30秒 | 需定期发送 |
最佳实践
-
连接管理
- 保持单个WebSocket连接
- 实现自动重连机制
- 定期发送心跳
-
错误处理
- 实现完整的错误处理流程
- 记录详细的错误日志
- 使用指数退避重连
-
性能优化
- 合理控制订阅数量
- 实现消息队列机制
- 及时清理无用订阅
完整示例
class DexWebSocket {
private ws: WebSocket;
private reconnectAttempts = 0;
private maxReconnectAttempts = 5;
private messageHandlers = new Map<string, Set<(data: any) => void>>();
constructor(
private url: string,
private accessToken: string
) {
this.connect();
}
private connect() {
this.ws = new WebSocket(this.url);
this.ws.onopen = () => {
// 发送认证
this.authenticate();
// 重新订阅
this.resubscribe();
};
this.ws.onmessage = (event) => {
this.handleMessage(JSON.parse(event.data));
};
this.ws.onclose = () => {
this.reconnect();
};
}
private authenticate() {
this.send({
type: "auth",
token: this.accessToken
});
}
public subscribe(channel: string, handler: (data: any) => void) {
// 订阅实现
}
public unsubscribe(channel: string) {
// 取消订阅实现
}
}
此页面对您有帮助吗?