第三讲:Hyperliquid API 基础——REST 与 WebSocket 的抉择

说实话,刚接触 Hyperliquid 的时候,我第一反应就是翻 API 文档。毕竟做量化嘛,数据就是命。但很多新手上来就踩坑——分不清什么时候该用 REST,什么时候该上 WebSocket。今天咱们就把这事彻底聊透。

REST API 与 WebSocket API:到底有啥区别?

先给个最直白的结论:REST 适合查一次性的数据,WebSocket 适合盯持续变化的数据

我刚开始做交易系统时,犯过一个低级错误——用 REST 去轮询订单簿。每 200 毫秒拉一次,结果被限流不说,数据还总是滞后。后来换成 WebSocket,问题迎刃而解。你想想看,订单簿这种每秒变几十次的东西,用 REST 去轮询,不是自找麻烦吗?

特性 REST API WebSocket API
连接方式 请求-响应,每次独立 长连接,全双工
数据时效性 有延迟(取决于轮询频率) 实时推送,毫秒级
适用场景 查询账户余额、历史K线、下单 订阅订单簿、交易对价格、成交记录
资源消耗 低(但频繁请求会高) 中等(需维持心跳)
限流风险 高(尤其高频轮询) 低(订阅后持续推送)

核心原则:需要「当前快照」用 REST,需要「持续流」用 WebSocket。别混着用,更别用 REST 模拟 WebSocket 的功能。

API 文档速览:别被吓到,其实就这几块

Hyperliquid 的 API 文档,说实话,第一眼看上去有点乱。但拆开来看,核心就三块:

  • 公开市场数据:不需要 API Key,谁都能调。包括订单簿、K线、交易对信息、最近成交等。
  • 账户与交易:需要签名认证。查余额、下订单、撤单、查持仓。
  • WebSocket 订阅:实时数据流。订单簿快照、增量更新、成交推送。

我个人习惯,先看公开数据接口。因为不需要认证,调试起来最快。等跑通了数据流,再搞交易接口。

小技巧:文档里有个「Try it out」按钮,可以直接在浏览器里测试接口。我经常用它来验证参数格式,比写代码快多了。

获取公开市场数据:动手实操

好,咱们直接上代码。先拿公开数据练练手。

1. 获取所有交易对信息

import requests

BASE_URL = "https://api.hyperliquid.xyz"

def get_all_markets():
    """获取所有交易对信息"""
    url = f"{BASE_URL}/info"
    payload = {"type": "allMids"}
    resp = requests.post(url, json=payload)
    return resp.json()

markets = get_all_markets()
print(markets)

嗯,这里要注意。Hyperliquid 的 REST 接口用的是 POST 方法,不是常见的 GET。我第一次调的时候也愣了一下,后来发现文档里写得很清楚——所有查询都用 POST,请求体里放 type 参数。

2. 获取订单簿数据

def get_orderbook(coin: str):
    """获取指定币种的订单簿"""
    url = f"{BASE_URL}/info"
    payload = {
        "type": "l2Book",
        "coin": coin
    }
    resp = requests.post(url, json=payload)
    return resp.json()

btc_book = get_orderbook("BTC")
print(btc_book)

返回的数据结构是这样的:

{
  "coin": "BTC",
  "levels": [
    [{"px": "50000.0", "sz": "1.5", "n": 2}, ...],  // 卖单
    [{"px": "49980.0", "sz": "2.3", "n": 3}, ...]   // 买单
  ]
}

levels[0] 是卖单(asks),levels[1] 是买单(bids)。每个 level 包含价格(px)、数量(sz)和订单数(n)。

我曾经踩过的坑:订单簿的深度是有限的,默认只返回前 50 档。如果你需要全量深度,得用 WebSocket 订阅。用 REST 拉全量?别想了,数据量太大,接口会直接拒绝。

3. 获取历史K线

def get_candles(coin: str, interval: str = "1h", limit: int = 100):
    """获取K线数据"""
    url = f"{BASE_URL}/info"
    payload = {
        "type": "candleSnapshot",
        "coin": coin,
        "interval": interval,
        "limit": limit
    }
    resp = requests.post(url, json=payload)
    return resp.json()

btc_candles = get_candles("BTC", "15m", 50)
print(btc_candles)

支持的 interval 参数:1m、5m、15m、1h、4h、1d。limit 最大 500。

知识体系总览

下面这张图,是我自己梳理的 Hyperliquid API 知识结构。你看一眼,心里就有谱了。

Hyperliquid API 知识体系 REST API WebSocket API 公开数据 账户/交易 订阅数据流 allMids l2Book candleSnapshot order cancel orderbook 核心区别:REST = 快照查询 | WebSocket = 实时流 ⚠️ 避坑:不要用 REST 轮询订单簿!用 WebSocket 订阅增量更新 限流风险高 + 数据滞后 + 带宽浪费 公众号:蓝海资料掘金营,微信deep3321

实战建议:先跑通,再优化

我个人建议,刚开始别想太复杂。先拿 REST 把公开数据拉下来,打印到控制台看看。确认数据格式、字段含义都搞明白了,再上 WebSocket。

我曾经见过一个团队,上来就搞 WebSocket 全量订单簿,结果数据量太大,程序直接 OOM 了。你想想看,全量订单簿每秒推送几十次,每次几千条数据,内存不爆才怪。

正确的做法是:先用 REST 拉一次快照,然后用 WebSocket 订阅增量更新。这样既保证了数据完整,又控制了内存消耗。

我的调试习惯:先用 curl 或 Postman 调一次接口,确认返回数据没问题,再写 Python 代码。这样能快速定位是网络问题还是代码问题。

好了,这一讲的内容就到这。REST 和 WebSocket 的区别、文档结构、公开数据获取,咱们都过了一遍。下一讲,咱们会深入 WebSocket 的订阅机制,包括如何维护心跳、如何处理断线重连——这些可都是实战中的硬骨头。

专注资料整理