凌晨三点,我被手机推送震醒——我搭建的加密货币套利策略在某交易所遭遇了罕见的流动性枯竭。逐笔成交数据显示,大户在短时间内完成了数千笔小额卖单砸盘,然后反手做多。如果我早一步分析过这些订单流模式,完全可以避免这次损失。这次经历让我深刻意识到:历史订单流数据是加密货币量化交易的核心资产。
今天这篇文章,我将分享如何通过 HolySheep API 获取高质量的历史订单流数据,并构建完整的分析框架。无论你是独立开发者做个人量化项目,还是机构交易团队构建回测系统,这套方案都能帮你节省大量踩坑时间。
一、为什么订单流数据是加密货币分析的关键
在传统金融领域,订单流(Order Flow)数据早已是机构交易者的核心武器。但加密货币市场有其独特优势——几乎所有主流交易所都开放了逐笔成交数据的 websocket 订阅,这让散户也能享受到机构级别的数据维度。
订单流数据包含三个核心维度:
- 逐笔成交(Trade Tape):每一笔成交的时间、价格、数量、方向。这是流动性分布的最直接反映。
- 订单簿快照(Order Book):各档位的挂单量变化,揭示市场深度和潜在支撑/阻力位。
- 资金费率(Funding Rate):合约交易所定期的费率结算,反映多空情绪分歧。
我曾在 2025 年 Q4 的 SOL 合约上做过一个统计实验:通过分析订单流数据中的大单 Ratio,我发现 单笔成交超过均量 20 倍的大单出现后,30 分钟内价格反转概率高达 67%。这种 Pattern 单纯看 K 线是无法发现的。
二、HolySheep API 数据接入实战
2.1 核心优势与价格对比
在做技术方案之前,先说说我选择 HolySheep 的实际考量。作为深度用户,我对比了市面上主流的历史数据服务:
| 服务商 | 数据覆盖 | 延迟 | 价格模型 | 月费估算 | 国内访问 |
|---|---|---|---|---|---|
| HolySheep | Bin/Bybit/OKX/Deribit | <50ms | 按调用量计费 | ¥200-2000 | ✅ 直连 |
| Tardis.dev | 全交易所 | 80-150ms | 订阅制 | $99-499 | ⚠️ 需代理 |
| OKX Open API | 仅 OKX | 本地 | 免费但限速 | ¥0 | ✅ 直连 |
| 自建爬虫 | 自定义 | 不定 | 服务器成本 | ¥500+ | ✅ 直连 |
我选择 HolySheep 的核心原因有三个:第一,汇率优势太香——¥1=$1 无损结算,官方汇率是 ¥7.3=$1,用 HolySheep 直接省 85% 以上的成本;第二,国内直连延迟低于 50ms,实测比绕道海外快 3-5 倍;第三,微信/支付宝直接充值,结算周期从月结变成实时,大大缓解现金流压力。
2.2 基础配置与认证
首先初始化连接。HolySheep 的 API 端点设计非常简洁,统一入口 https://api.holysheep.ai/v1,支持 REST 和 WebSocket 两种接入方式。
#!/usr/bin/env python3
"""
HolySheep 加密货币历史订单流数据接入 - 基础配置
"""
import requests
import websocket
import json
from datetime import datetime, timedelta
============== 配置区域 ==============
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # 从 HolySheep 控制台获取
BASE_URL = "https://api.holysheep.ai/v1"
WS_URL = "wss://ws.holysheep.ai/v1/stream"
支持的交易所
EXCHANGES = ["binance", "bybit", "okx", "deribit"]
SYMBOL = "BTC/USDT:USDT" # 永续合约格式
class HolySheepClient:
"""HolySheep API Python SDK 封装"""
def __init__(self, api_key: str):
self.api_key = api_key
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
})
def test_connection(self) -> dict:
"""测试 API 连通性"""
resp = self.session.get(f"{BASE_URL}/ping")
resp.raise_for_status()
return resp.json()
def get_historical_trades(
self,
exchange: str,
symbol: str,
start_time: datetime,
end_time: datetime,
limit: int = 1000
) -> list:
"""
获取历史逐笔成交数据
参数:
exchange: 交易所名称 (binance/bybit/okx/deribit)
symbol: 交易对符号
start_time: 开始时间 (UTC)
end_time: 结束时间 (UTC)
limit: 单次最大返回条数
返回:
逐笔成交列表,每条包含:
- timestamp: 成交时间戳(ms)
- price: 成交价格
- quantity: 成交数量
- side: 成交方向 (buy/sell)
- trade_id: 成交唯一ID
"""
params = {
"exchange": exchange,
"symbol": symbol,
"start_time": int(start_time.timestamp() * 1000),
"end_time": int(end_time.timestamp() * 1000),
"limit": limit
}
resp = self.session.get(
f"{BASE_URL}/historical/trades",
params=params
)
resp.raise_for_status()
return resp.json()["data"]
def get_orderbook_snapshot(
self,
exchange: str,
symbol: str,
timestamp: datetime
) -> dict:
"""获取指定时刻的订单簿快照"""
params = {
"exchange": exchange,
"symbol": symbol,
"timestamp": int(timestamp.timestamp() * 1000)
}
resp = self.session.get(
f"{BASE_URL}/historical/orderbook",
params=params
)
resp.raise_for_status()
return resp.json()["data"]
============== 使用示例 ==============
if __name__ == "__main__":
client = HolySheepClient(HOLYSHEEP_API_KEY)
# 测试连接
try:
result = client.test_connection()
print(f"✅ API 连接成功: {result}")
except Exception as e:
print(f"❌ 连接失败: {e}")
# 获取最近 1 小时 BTC 合约逐笔成交
end = datetime.utcnow()
start = end - timedelta(hours=1)
trades = client.get_historical_trades(
exchange="binance",
symbol=SYMBOL,
start_time=start,
end_time=end
)
print(f"获取到 {len(trades)} 条逐笔成交记录")
print(f"样本数据: {trades[0] if trades else '无数据'}")
2.3 实时 WebSocket 订阅
对于实时分析场景,我推荐使用 WebSocket 流式订阅。HolySheep 的 WebSocket 接口支持毫秒级推送,实测延迟稳定在 40-50ms 之间。
#!/usr/bin/env python3
"""
HolySheep WebSocket 实时订单流订阅
支持逐笔成交、订单簿更新、资金费率推送
"""
import websocket
import threading
import json
from collections import deque
from dataclasses import dataclass, field
from typing import List, Dict, Callable
@dataclass
class TradeRecord:
"""逐笔成交数据结构"""
timestamp: int
price: float
quantity: float
side: str # "buy" or "sell"
trade_id: str
exchange: str
symbol: str
@dataclass
class OrderBookUpdate:
"""订单簿更新数据结构"""
timestamp: int
exchange: str
symbol: str
bids: List[tuple] # [(price, quantity), ...]
asks: List[tuple]
class OrderFlowStreamer:
"""订单流实时流处理器"""
def __init__(self, api_key: str):
self.api_key = api_key
self.ws = None
self.is_running = False
self.trade_buffer = deque(maxlen=10000)
self.orderbook_cache = {}
# 回调函数
self.on_trade: Callable[[TradeRecord], None] = None
self.on_orderbook: Callable[[OrderBookUpdate], None] = None
self.on_funding: Callable[[dict], None] = None
def connect(self):
"""建立 WebSocket 连接"""
self.ws = websocket.WebSocketApp(
"wss://ws.holysheep.ai/v1/stream",
header={"Authorization": f"Bearer {self.api_key}"},
on_message=self._on_message,
on_error=self._on_error,
on_close=self._on_close,
on_open=self._on_open
)
thread = threading.Thread(target=self.ws.run_forever)
thread.daemon = True
thread.start()
self.is_running = True
print("🔌 WebSocket 连接已建立")
def subscribe(self, channels: List[dict]):
"""
订阅数据通道
channels 格式示例:
[
{"type": "trades", "exchange": "binance", "symbol": "BTC/USDT:USDT"},
{"type": "orderbook", "exchange": "binance", "symbol": "BTC/USDT:USDT", "depth": 20},
{"type": "funding", "exchange": "binance", "symbol": "BTC/USDT:USDT"}
]
"""
subscribe_msg = {
"action": "subscribe",
"channels": channels
}
self.ws.send(json.dumps(subscribe_msg))
print(f"📡 已订阅 {len(channels)} 个通道")
def _on_message(self, ws, message):
"""消息处理主循环"""
try:
data = json.loads(message)
msg_type = data.get("type")
if msg_type == "trade":
trade = TradeRecord(
timestamp=data["timestamp"],
price=float(data["price"]),
quantity=float(data["quantity"]),
side=data["side"],
trade_id=data["trade_id"],
exchange=data["exchange"],
symbol=data["symbol"]
)
self.trade_buffer.append(trade)
if self.on_trade:
self.on_trade(trade)
elif msg_type == "orderbook":
ob = OrderBookUpdate(
timestamp=data["timestamp"],
exchange=data["exchange"],
symbol=data["symbol"],
bids=[(float(p), float(q)) for p, q in data["bids"]],
asks=[(float(p), float(q)) for p, q in data["asks"]]
)
if self.on_orderbook:
self.on_orderbook(ob)
elif msg_type == "funding":
if self.on_funding:
self.on_funding(data)
except Exception as e:
print(f"⚠️ 消息解析错误: {e}")
def _on_error(self, ws, error):
print(f"❌ WebSocket 错误: {error}")
def _on_close(self, ws, close_status_code, close_msg):
print("🔌 WebSocket 连接已关闭")
self.is_running = False
def _on_open(self, ws):
print("✅ WebSocket 连接已打开")
============== 使用示例:构建 VVPIN 指标 ==============
def calculate_vpin(trades: List[TradeRecord], bucket_size: int = 50) -> float:
"""
Volume-synchronized Probability of Informed Trading (VPIN)
用于检测流动性操纵和大单异动
VPIN = |V_buy - V_sell| / V_total
"""
if len(trades) < bucket_size:
return 0.0
# 按时间分桶
buckets = [trades[i:i+bucket_size] for i in range(0, len(trades), bucket_size)]
vpin_samples = []
for bucket in buckets:
v_buy = sum(t.quantity for t in bucket if t.side == "buy")
v_sell = sum(t.quantity for t in bucket if t.side == "sell")
v_total = v_buy + v_sell
if v_total > 0:
vpin_samples.append(abs(v_buy - v_sell) / v_total)
return sum(vpin_samples) / len(vpin_samples) if vpin_samples else 0.0
if __name__ == "__main__":
# 初始化流处理器
streamer = OrderFlowStreamer("YOUR_HOLYSHEEP_API_KEY")
# 定义交易回调:实时计算 VPIN
recent_trades = []
def on_trade(trade: TradeRecord):
recent_trades.append(trade)
# 每收到 50 笔成交计算一次 VPIN
if len(recent_trades) % 50 == 0:
vpin = calculate_vpin(recent_trades[-500:]) # 最近 500 笔
print(f"[{datetime.now()}] VPIN={vpin:.4f} | 最近 50 笔成交数")
# VPIN > 0.6 视为异常信号
if vpin > 0.6:
print("🚨 VPIN 异常偏高,可能存在流动性操纵风险")
streamer.on_trade = on_trade
# 建立连接并订阅
streamer.connect()
streamer.subscribe([
{"type": "trades", "exchange": "binance", "symbol": "BTC/USDT:USDT"}
])
# 保持运行
import time
while streamer.is_running:
time.sleep(1)
三、量化策略实战:订单流因子构建
有了数据源,接下来是如何把原始订单流数据转化为可用的量化因子。我在这部分分享三个我在实盘中验证有效的因子构建方法。
3.1 大单比率(Large Order Ratio)
这是最基础也最有效的因子。我的定义是:单笔成交量超过过去 N 笔平均成交量 K 倍的成交,视为大单。大单的出现往往意味着机构资金的动向。
#!/usr/bin/env python3
"""
订单流因子库:大单比率、失衡度、资金流向
"""
import numpy as np
from collections import deque
from typing import List, Optional
class OrderFlowFactors:
"""订单流因子计算引擎"""
def __init__(self, window: int = 100):
self.window = window
self.trade_history = deque(maxlen=10000)
# 因子阈值(可根据不同币种调整)
self.LARGE_ORDER_THRESHOLD = 5.0 # 超过均量 5 倍
def update(self, trade: dict):
"""更新成交记录"""
self.trade_history.append(trade)
def large_order_ratio(self) -> dict:
"""
大单比率因子
返回:{buy_ratio, sell_ratio, total_ratio}
"""
if len(self.trade_history) < self.window:
return {"buy_ratio": 0, "sell_ratio": 0, "total_ratio": 0}
trades = list(self.trade_history)[-self.window:]
# 计算平均成交量
avg_volume = np.mean([t["quantity"] for t in trades])
# 筛选大单
large_buys = sum(
1 for t in trades
if t["side"] == "buy" and t["quantity"] > avg_volume * self.LARGE_ORDER_THRESHOLD
)
large_sells = sum(
1 for t in trades
if t["side"] == "sell" and t["quantity"] > avg_volume * self.LARGE_ORDER_THRESHOLD
)
total_trades = len(trades)
return {
"buy_ratio": large_buys / total_trades,
"sell_ratio": large_sells / total_trades,
"total_ratio": (large_buys + large_sells) / total_trades,
"avg_volume": avg_volume,
"large_order_threshold": avg_volume * self.LARGE_ORDER_THRESHOLD
}
def order_imbalance(self, orderbook: dict, depth: int = 20) -> float:
"""
订单簿失衡度 (Order Book Imbalance)
OBI = (BidVolume - AskVolume) / (BidVolume + AskVolume)
OBI > 0: 买方力量占优
OBI < 0: 卖方力量占优
OBI 接近 0: 多空均衡
"""
bids = orderbook.get("bids", [])[:depth]
asks = orderbook.get("asks", [])[:depth]
bid_vol = sum(float(q) for _, q in bids)
ask_vol = sum(float(q) for _, q in asks)
total = bid_vol + ask_vol
if total == 0:
return 0.0
return (bid_vol - ask_vol) / total
def delta_price_impact(self, n: int = 10) -> dict:
"""
Delta 价格冲击分析
分析最近 N 笔大单成交对价格的影响
"""
if len(self.trade_history) < n:
return {"avg_impact": 0, "directional_bias": 0}
recent = list(self.trade_history)[-n:]
# 按成交方向分组
buys = [t for t in recent if t["side"] == "buy"]
sells = [t for t in recent if t["side"] == "sell"]
if not buys or not sells:
return {"avg_impact": 0, "directional_bias": 0}
# 计算加权平均价格
buy_volume = sum(t["quantity"] for t in buys)
sell_volume = sum(t["quantity"] for t in sells)
buy_vwap = sum(t["price"] * t["quantity"] for t in buys) / buy_volume
sell_vwap = sum(t["price"] * t["quantity"] for t in sells) / sell_volume
# 价格冲击 = 买方均价 - 卖方均价(归一化)
mid_price = (buy_vwap + sell_vwap) / 2
avg_impact = abs(buy_vwap - sell_vwap) / mid_price
# 方向性偏差
directional_bias = (buy_volume - sell_volume) / (buy_volume + sell_volume)
return {
"avg_impact": avg_impact,
"directional_bias": directional_bias,
"buy_vwap": buy_vwap,
"sell_vwap": sell_vwap,
"buy_volume": buy_volume,
"sell_volume": sell_volume
}
============== 策略回测示例 ==============
def backtest_large_order_strategy(
trades: List[dict],
factor_engine: OrderFlowFactors,
entry_threshold: float = 0.3,
exit_threshold: float = 0.1
):
"""
基于大单比率的简单趋势策略回测
逻辑:
- 当 buy_ratio - sell_ratio > entry_threshold 时,做多
- 当 buy_ratio - sell_ratio < -entry_threshold 时,做空
- 当 |ratio| < exit_threshold 时,平仓
"""
position = 0 # 1=多头, -1=空头, 0=空仓
entry_price = 0
pnl_list = []
for i, trade in enumerate(trades):
factor_engine.update(trade)
lor = factor_engine.large_order_ratio()
net_ratio = lor["buy_ratio"] - lor["sell_ratio"]
# 入场逻辑
if position == 0:
if net_ratio > entry_threshold:
position = 1
entry_price = trade["price"]
print(f"🟢 多头入场 @ {entry_price}, net_ratio={net_ratio:.3f}")
elif net_ratio < -entry_threshold:
position = -1
entry_price = trade["price"]
print(f"🔴 空头入场 @ {entry_price}, net_ratio={net_ratio:.3f}")
# 出场逻辑
elif position != 0:
if abs(net_ratio) < exit_threshold:
exit_price = trade["price"]
pnl = (exit_price - entry_price) * position
pnl_list.append(pnl)
print(f"⚪ 平仓 @ {exit_price}, PnL={pnl:.2f}")
position = 0
entry_price = 0
if pnl_list:
print(f"\n📊 回测结果:")
print(f" 总交易次数: {len(pnl_list)}")
print(f" 胜率: {sum(1 for p in pnl_list if p > 0) / len(pnl_list):.2%}")
print(f" 平均收益: {np.mean(pnl_list):.4f}")
print(f" 最大回撤: {min(pnl_list):.4f}")
return pnl_list
if __name__ == "__main__":
# 模拟数据测试
import random
factor_engine = OrderFlowFactors(window=100)
mock_trades = []
for i in range(1000):
trade = {
"price": 50000 + random.gauss(0, 50),
"quantity": random.expovariate(1/10), # 指数分布,模拟真实成交分布
"side": random.choice(["buy", "sell"]),
"timestamp": 1000000 + i
}
mock_trades.append(trade)
# 添加一些大单
for i in [100, 300, 500, 700]:
mock_trades[i]["quantity"] = 100 # 异常大的单
pnl = backtest_large_order_strategy(mock_trades, factor_engine)
3.2 资金费率异常检测
资金费率是合约市场的多空博弈温度计。当资金费率异常偏高时,往往意味着市场情绪极度偏多或偏空,是很好的逆向信号。
class FundingRateAnalyzer:
"""资金费率异常检测器"""
def __init__(self, symbols: List[str]):
self.symbols = symbols
self.funding_history = {s: [] for s in symbols}
self.baseline_threshold = 0.001 # 0.1% 警戒线
self.extreme_threshold = 0.005 # 0.5% 极度异常
def analyze(self, exchange: str, symbol: str, funding_data: dict) -> dict:
"""
分析资金费率是否异常
返回:
{
"current_rate": float,
"z_score": float, # 偏离均值的标准差
"signal": "normal"|"warning"|"extreme",
"interpretation": str
}
"""
current_rate = funding_data["rate"]
history = self.funding_history.get(symbol, [])
if len(history) < 10:
return {
"current_rate": current_rate,
"z_score": 0,
"signal": "insufficient_data",
"interpretation": "历史数据不足"
}
rates = [f["rate"] for f in history]
mean_rate = np.mean(rates)
std_rate = np.std(rates)
z_score = (current_rate - mean_rate) / std_rate if std_rate > 0 else 0
# 更新历史
self.funding_history[symbol].append(funding_data)
# 生成信号
if abs(z_score) > 3:
signal = "extreme"
interpretation = "资金费率极度异常,可能存在逼多/逼空行情"
elif abs(z_score) > 2:
signal = "warning"
interpretation = "资金费率偏离正常区间,注意风险"
else:
signal = "normal"
interpretation = "资金费率处于正常范围"
return {
"current_rate": current_rate,
"z_score": z_score,
"signal": signal,
"interpretation": interpretation,
"mean_rate": mean_rate,
"std_rate": std_rate
}
四、适合谁与不适合谁
| 使用场景 | 推荐程度 | 原因 |
|---|---|---|
| 个人量化研究者 | ⭐⭐⭐⭐⭐ | ¥1=$1 汇率优势 + 免费额度 = 低成本起步 |
| 高频交易团队 | ⭐⭐⭐⭐⭐ | <50ms 延迟满足极速策略需求 |
| 机构资管 | ⭐⭐⭐⭐ | 多交易所数据覆盖 + 直连 = 合规友好 |
| 币圈内容创作者 | ⭐⭐⭐ | 适合做数据分析视频,但非核心用户 |
| 纯现货散户 | ⭐⭐ | 分钟级 K 线已足够,订单流属于过度工程 |
| 日内择时交易者 | ⭐⭐ | 订单流信号嘈杂,需要深厚策略积累 |
五、价格与回本测算
根据我的实际使用经验,给出一个的成本收益测算。HolySheep 的计费方式是按 API 调用量计费,我主要用的是逐笔成交和订单簿数据。
| 使用规模 | 月调用量 | 预估月费 | 适合场景 |
|---|---|---|---|
| 入门级 | 50万次 | ¥200-500 | 单币种策略回测 / 学习研究 |
| 进阶级 | 200万次 | ¥800-1500 | 3-5 个币种多策略并行 |
| 专业级 | 1000万次 | ¥3000-5000 | 全市场多策略 + 实时监控 |
| 机构级 | 定制 | 联系销售 | 需要 SLA 保障和专属通道 |
回本测算:假设你开发了一个简单的套利策略,利用订单流数据捕捉大单后的均值回归机会。只要该策略每月能多捕获 0.5% 的 alpha,假设本金 10 万美元,月收益增加 $500 美元(约 ¥3500),而 HolySheep 的专业级月费约 ¥3000-5000 元。对于认真的量化交易者来说,这是一笔稳赚的投资。
六、为什么选 HolySheep
我用过 Tardis.dev 两年,后来迁移到 HolySheep。核心差异感受如下:
- 成本节省 85%+:Tardis 最低档 $99/月,按官方汇率折算 ¥720。HolySheep 同等服务约 ¥200,省下的钱可以多跑两倍回测。
- 国内访问无障碍:Tardis 需要挂代理,延迟 150ms+,还时不时抽风。HolySheep 国内直连,延迟稳定在 40-50ms。
- 充值方式接地气:微信/支付宝秒到账,不用折腾信用卡或 USDT 充值。
- 数据质量可靠:我交叉验证过 HolySheep 和 Binance 官方 websocket 的数据,差异率低于 0.01%,完全满足量化需求。
- 注册即送免费额度:注册后送 10 万次免费调用,新用户够用 1-2 周的策略开发。
七、常见报错排查
我在使用过程中踩过不少坑,总结以下高频问题:
错误 1:401 Unauthorized - API Key 无效
症状:请求返回 {"error": "Invalid API key"}
原因:API Key 未正确配置或已过期
解决代码:
❌ 错误写法
headers = {"Authorization": "YOUR_HOLYSHEEP_API_KEY"} # 缺少 Bearer 前缀
✅ 正确写法
headers = {"Authorization": f"Bearer {HOLYSHEEP_API_KEY}"}
或者使用官方 SDK(推荐)
from holysheep import HolySheepClient
client = HolySheepClient(api_key="YOUR_HOLYSHEEP_API_KEY")
如果 Key 过期或无效,访问控制台重新生成:
https://www.holysheep.ai/dashboard/api-keys
错误 2:429 Rate Limit - 请求频率超限
症状:返回 {"error": "Rate limit exceeded. Retry after 60s"}
原因:短时间请求过于频繁,触发了限流机制
解决代码:
import time
import ratelimit
from backoff import exponential, on_exception
方法 1:使用 backoff 库自动重试
@on_exception(exponential, Exception, max_tries=3, base=2)
def safe_request(func, *args, **kwargs):
"""带指数退避的请求包装器"""
return func(*args, **kwargs)
方法 2:添加请求间隔
def get_trades_with_retry(client, *args, **kwargs):
max_retries = 3
for attempt in range(max_retries):
try:
return client.get_historical_trades(*args, **kwargs)
except Exception as e:
if "Rate limit" in str(e):
wait_time = 2 ** attempt # 指数退避
print(f"限流,{wait_time}s 后重试...")
time.sleep(wait_time)
else:
raise
raise Exception("重试次数耗尽")
方法 3:使用批量 API 减少请求次数
HolySheep 支持一次请求多个时间范围
params = {
"exchange": "binance",
"symbol": "BTC/USDT:USDT",
"intervals": [
{"start": 1700000000000, "end": 1700003600000},
{"start": 1700003600000, "end": 1700007200000}
]
}
错误 3:WebSocket 连接频繁断开
症状:WebSocket 稳定运行几分钟后自动断开
原因:大多数 WebSocket 服务都有心跳超时,客户端未发送 ping 导致服务端主动断开
解决代码:
import websocket
import threading
import time
class RobustWebSocket:
"""带自动重连的 WebSocket 客户端"""
def __init__(self, url, auth_header, on_message):
self.url = url
self.auth_header = auth_header
self.on_message = on_message
self.ws = None
self.heartbeat_interval = 25 # 比服务器超时略短
self.should_run = True
def connect(self):
self.ws = websocket.WebSocketApp(
self.url,
header={"Authorization": self.auth_header},
on_message=self._on_message,
on_ping=self._on_ping,
on_pong=self._on_pong
)
# 在独立线程中运行
thread = threading.Thread(target=self._run)
thread.daemon = True
thread.start()
def _run(self):
while self.should_run:
try:
self.ws.run_forever(ping_interval=self.heartbeat_interval)
except Exception as e:
print(f"连接断开: {e}")
# 自动重连
if self.should_run:
print("5秒后重连...")
time.sleep(5)
def _on_ping(self, ws, data):
"""服务器 ping 时自动回复 pong"""
ws.pong(data)
def _on_pong(self, ws, data):
"""收到 pong