BitMEX API 接口使用指南:开启你的数字货币交易之旅
BitMEX,作为一家知名的加密货币衍生品交易所,提供强大的API接口,允许开发者和交易者通过编程方式访问其平台功能。本文将深入探讨BitMEX API的使用方法,帮助你更好地利用它进行交易策略的开发和执行。
1. API 密钥和认证
要通过应用程序编程接口 (API) 与 BitMEX 平台进行交互,您需要拥有一个有效的 BitMEX 账户。 拥有账户后,登录您的账户,导航至账户设置页面,找到 API 密钥管理部分。 在此处,您可以创建和管理您的 API 密钥。
每个 API 密钥由两个关键组件构成:API 密钥 ID (也称为 API Key) 和 API 密钥密钥 (也称为 API Secret)。
API 密钥 ID (API Key) :这是一个公开的标识符,用于唯一地识别您的应用程序或交易策略。 当您向 BitMEX API 发送请求时,您需要提供此 ID,以便 BitMEX 知道请求来自哪个账户。 可以把它理解为用户名。
API 密钥密钥 (API Secret) :这是一个私有的、保密的密钥,用于对您的 API 请求进行数字签名。 签名过程涉及使用 API Secret 和请求的参数生成一个加密哈希值。 这个签名附加到您的请求中,BitMEX 使用它来验证请求的真实性和完整性。 只有拥有 API Secret 的人才能够生成有效的签名,从而防止未经授权的访问和潜在的恶意活动。 务必妥善保管您的 API Secret,切勿与他人分享或在不安全的地方存储。 如果您的 API Secret 泄露,请立即撤销并生成新的密钥。 可以把它理解为密码。
安全性是 API 使用的核心。通过使用 API 密钥 ID 和 API Secret 进行认证,BitMEX 确保只有经过授权的用户才能访问其 API 并执行交易。
重要提示: 务必妥善保管你的API Secret,切勿泄露给他人。建议开启IP白名单和提现权限限制,以进一步保障账户安全。2. API 接口类型
BitMEX API 主要提供两种核心接口类型:REST API 和 Streaming API, 满足不同用户的需求,提供灵活的数据访问方式。
- REST API (代表性状态传输 API): 这是一种基于请求-响应模式的 API。 您通过发送 HTTP 请求 (例如 GET, POST, PUT, DELETE) 到指定的 API 端点,然后服务器会返回包含您所请求数据的 JSON 格式的响应。 REST API 适合于执行交易、获取历史数据、管理账户信息等操作。 它采用同步通信方式,即发送请求后需要等待服务器响应。 REST API 的优势在于易于理解和使用,适合对数据准确性要求较高,但对实时性要求不高的场景。 BitMEX REST API 提供了丰富的端点,覆盖了市场数据、交易、账户管理等多个方面。
- Streaming API (流式 API): 也称为 WebSocket API,它提供了一种实时的、双向的通信通道。 一旦建立连接,服务器会主动向客户端推送更新的数据,无需客户端不断发送请求。 Streaming API 适合于实时监控市场行情、获取实时交易信息等场景。 这种方式减少了延迟,提高了数据更新的效率。 BitMEX Streaming API 基于 WebSocket 协议,允许用户订阅特定的市场数据流,例如实时价格、深度行情、交易数据等。 使用 Streaming API 可以构建高响应速度的交易系统和监控工具。
3. REST API 使用
3.1 认证请求
为了安全地访问BitMEX的REST API,所有请求都需要进行签名认证。BitMEX采用行业标准的HMAC-SHA256(Hash-based Message Authentication Code with SHA-256)算法来验证请求的真实性和完整性,防止恶意篡改或重放攻击。认证过程涉及生成一个唯一的签名,并将其附加到每个API请求的头部。
HMAC-SHA256签名过程的关键步骤如下:
- 构建签名消息: 将构成签名消息的各个部分按特定顺序连接起来。这些部分包括HTTP请求方法(例如:GET、POST、PUT、DELETE)、请求的规范化路径(包含查询参数)、请求过期时间戳以及请求体(如果存在)。规范化路径是指URL中域名之后的部分,包括路径和查询字符串。
- 计算HMAC-SHA256签名: 使用您的API Secret作为密钥,对签名消息应用HMAC-SHA256算法。API Secret是您在BitMEX平台上创建API密钥时获得的,务必妥善保管,切勿泄露。HMAC-SHA256算法将API Secret和签名消息作为输入,生成一个唯一的哈希值,即签名。
-
添加请求头:
将以下信息添加到HTTP请求头中,以便BitMEX服务器验证请求的合法性:
-
api-signature
:包含上一步计算出的HMAC-SHA256签名。 -
api-key
:包含您的API Key ID,用于标识您的账户。API Key ID也是在创建API密钥时获得的。 -
api-expires
:包含请求的过期时间,表示签名有效的时间范围。过期时间以Unix时间戳表示,即自1970年1月1日午夜(UTC)以来经过的秒数。建议设置合理的过期时间,以提高安全性。
-
以下是一个使用Python演示如何生成BitMEX API请求签名的示例代码。此代码片段展示了如何计算签名,并生成相应的请求头。
import hashlib
import hmac
import time
import requests
import urllib.parse
def generate_signature(api_secret, verb, uri, expires, data):
"""生成BitMEX API请求签名."""
parsed_uri = urllib.parse.urlparse(uri)
path = parsed_uri.path
if parsed_uri.query:
path += '?' + parsed_uri.query
message = verb + path + str(expires) + data
signature = hmac.new(api_secret.encode('utf-8'), message.encode('utf-8'), digestmod=hashlib.sha256).hexdigest()
return signature
代码解释:
-
urllib.parse.urlparse(uri)
:此函数用于解析URL,提取路径和查询参数。 -
path = parsed_uri.path
:获取URL的路径部分。 -
if parsed_uri.query: path += '?' + parsed_uri.query
:如果URL包含查询参数,将其添加到路径中。 -
message = verb + path + str(expires) + data
:构建签名消息,将HTTP方法、路径、过期时间和请求数据连接在一起。 -
hmac.new(api_secret.encode('utf-8'), message.encode('utf-8'), digestmod=hashlib.sha256).hexdigest()
:使用API Secret作为密钥,使用HMAC-SHA256算法对消息进行签名,并将结果转换为十六进制字符串。
3.2 发送请求
为了与交易所的API进行交互,你需要使用编程语言提供的HTTP客户端库来构建和发送请求。常见的选择包括Python的
requests
库、Java的
HttpClient
库、以及Node.js的
axios
或内置
http
/
https
模块。选择合适的库取决于你的编程语言偏好和项目需求。需要注意的是,不同交易所对于请求头的要求可能不同,需要仔细阅读其官方API文档。
以下是一个使用Python的
requests
库发送GET请求,并包含身份验证信息的示例代码,以供参考:
import requests
import time
import urllib.parse
import hashlib
import hmac
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
base_url = 'https://testnet.bitmex.com' # 强烈建议使用测试网进行开发和测试
endpoint = '/api/v1/instrument'
# 构建请求路径和参数
path = endpoint
expires = int(time.time()) + 60 # 请求过期时间,一般设置为60秒
verb = 'GET'
data = '' # GET 请求通常没有 body, POST 请求才有
# 创建签名
message = verb + path + str(expires) + data
signature = hmac.new(api_secret.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).hexdigest()
headers = {
'api-key': api_key,
'api-expires': str(expires),
'api-signature': signature
}
url = base_url + path
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查 HTTP 状态码,如果不是 200,则抛出异常
print(response.()) # 将响应内容解析为 JSON 格式并打印
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
这段代码展示了如何使用
requests
库发送一个GET请求到BitMEX测试网的
/api/v1/instrument
端点。关键步骤包括:
-
导入必要的库:
requests
用于发送HTTP请求,time
用于生成过期时间,urllib.parse
(虽然本例未使用,但常用于URL编码),hashlib
和hmac
用于生成请求签名。 -
设置API密钥和Secret:
将
YOUR_API_KEY
和YOUR_API_SECRET
替换为你从交易所获得的真实凭证。 -
构建请求头:
请求头中包含
api-key
、api-expires
(请求过期时间戳)、和api-signature
(使用API Secret对请求信息进行签名)。 - 生成签名: 签名是安全的关键,它验证请求的来源和完整性。签名算法通常涉及将请求方法 (verb, 如 GET, POST),请求路径 (path),过期时间 (expires) 以及请求数据 (data) 组合起来,然后使用API Secret进行哈希计算 (HMAC-SHA256)。
-
发送请求:
使用
requests.get()
方法发送GET请求,并将请求头添加到请求中。 -
处理响应:
检查响应状态码,如果请求成功(状态码为200),则将响应内容解析为JSON格式并打印。如果请求失败,则捕获异常并打印错误信息。
response.raise_for_status()
会在状态码表示错误时抛出异常。
重要提示:
- 始终使用测试网进行开发和测试,以避免在生产环境中意外损失资金。
- 仔细阅读交易所的API文档,了解其身份验证机制和请求限制。
- 确保你的API密钥和Secret安全存储,不要将其泄露给他人。
- 根据交易所的要求,设置适当的请求过期时间,避免请求被拒绝。
- 实施错误处理机制,以应对网络问题、API限制和其他意外情况。
- 注意API的速率限制,避免频繁请求导致被封禁。
设置请求参数
构建与加密货币交易所API交互的请求,首要任务是精确定义请求参数。以下代码段展示了如何为GET请求设置必要的参数,包括请求方法、统一资源标识符(URI)、过期时间和请求数据。
verb = 'GET'
:指定HTTP请求的方法为GET。GET方法常用于从服务器检索数据,且通常不包含请求体。选择GET方法需确保请求操作不会修改服务器端数据状态。
uri = base_url + endpoint
:构建完整的请求URI。
base_url
代表API的基础地址,例如
https://api.example.com
。
endpoint
定义具体的API端点,例如
/v1/ticker
。两者组合成完整的URI,如
https://api.example.com/v1/ticker
,指向特定的资源。
expires = int(time.time()) + 60
:设置请求的过期时间戳。
time.time()
函数返回当前时间的Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数)。加上60秒,意味着请求将在当前时间后60秒过期。过期时间用于防止重放攻击,确保请求在指定时间内有效。将时间戳转换为整数类型
int()
以符合API的要求。
data = ''
:对于GET请求,通常不包含请求体数据。因此,
data
变量被设置为空字符串。在其他请求类型(如POST或PUT)中,
data
变量将包含需要发送到服务器的数据,通常以JSON格式编码。
生成签名
为了保障API请求的安全性,你需要生成一个签名。这个签名是基于你的API密钥(
api_secret
)、请求方法(
verb
,例如GET或POST)、请求的URI(
uri
)、过期时间戳(
expires
,通常是Unix时间戳)以及请求的数据(
data
,如果存在)计算得出的。
签名的生成过程通常如下:
-
准备签名材料:
收集所有必要的参数:
api_secret
,verb
,uri
,expires
, 和data
。 确保api_secret
是保密的,不要泄露给任何人。 -
构建签名字符串:
将这些参数按照特定的顺序连接成一个字符串。这个顺序和连接方式通常由API提供商指定,必须严格遵守。常见的做法是将
verb
、uri
、expires
和data
(如果存在,需要序列化成字符串,例如JSON字符串)依次连接。 -
计算哈希值:
使用哈希算法(如HMAC-SHA256)对构建的字符串进行哈希运算。 HMAC算法需要使用
api_secret
作为密钥。 - 生成最终签名: 将计算得到的哈希值进行编码(例如,Base64编码)以得到最终的签名字符串。这个签名字符串将作为请求头的一部分发送给API服务器。
signature = generate_signature(api_secret, verb, uri, expires, data)
这行伪代码描述了生成签名的函数调用。你需要根据你的编程语言和API提供商的文档实现
generate_signature
函数。 务必参考API文档,了解具体的签名算法和参数要求。 不正确的签名会导致API请求失败。
注意:
expires
参数非常重要,用于防止重放攻击。 API服务器通常会验证请求的时间戳是否在允许的范围内。 因此,你需要确保你的服务器时间与UTC时间同步,并且
expires
的值设置合理。 过期时间过短可能会导致请求频繁失效, 过期时间过长则会增加安全风险。
设置请求头
在与交易所或加密货币服务提供商的API交互时,设置正确的请求头至关重要。这些头部信息通常用于身份验证、授权和指定请求的元数据。
常见的请求头包括:
-
api-key
: 您的API密钥,用于标识您的账户。这通常是由服务提供商分配的唯一字符串,务必妥善保管,避免泄露。 -
api-signature
: 使用您的私钥对请求参数进行加密签名。这是为了验证请求的完整性和真实性,防止篡改。签名算法通常由API文档指定,例如HMAC-SHA256。 -
api-expires
: 请求的过期时间戳,通常以Unix时间表示。这可以防止重放攻击,确保请求在指定时间窗口内有效。
以下代码段展示了如何构建包含这些请求头的字典:
headers = {
'api-key': api_key,
'api-signature': signature,
'api-expires': str(expires)
}
注意:
-
api_key
、signature
和expires
是变量,需要根据实际情况替换为您的API密钥、签名和过期时间戳。 - 确保时间戳的单位与API文档的要求一致(通常是秒或毫秒)。
-
有些API可能需要额外的请求头,例如
Content-Type
来指定请求体的格式 (例如application/
)。请务必参考API文档。 -
请求头的键名(例如
api-key
)对大小写敏感,请与API文档保持一致。
发送 HTTP 请求
使用 Python 的
requests
库发送 HTTP GET 请求,这是与区块链节点或 API 交互的常见方式。以下代码展示了如何构造并发送一个请求:
import requests
uri = "YOUR_API_ENDPOINT" # 替换为你的 API 端点 URL,例如:https://api.example.com/data
headers = {
"Content-Type": "application/",
"Authorization": "Bearer YOUR_API_KEY" # 如果 API 需要认证,则添加 Authorization 头
}
response = requests.get(uri, headers=headers)
# 检查响应状态码
if response.status_code == 200:
data = response.() # 将响应内容解析为 JSON 格式
print(data) # 打印从 API 接收的数据
else:
print(f"请求失败,状态码:{response.status_code}")
print(response.text) # 打印错误信息,方便调试
requests.get(uri, headers=headers)
方法发送一个 GET 请求到指定的
uri
,并附带自定义的
headers
。
uri
参数是 API 终点的 URL。
headers
参数是一个字典,允许你设置 HTTP 请求头,例如
Content-Type
指定请求体的格式,
Authorization
用于身份验证。正确的设置请求头对于与 API 交互至关重要。
需要注意的是,实际应用中,
uri
和
headers
的内容需要根据目标 API 的具体要求进行调整。某些 API 可能需要特定的认证方式或其他请求头信息。在发送请求后,务必检查
response.status_code
来确认请求是否成功。常见的状态码包括:
-
200
:请求成功。 -
400
:客户端错误,例如请求参数错误。 -
401
:未授权,通常需要提供身份验证信息。 -
403
:禁止访问,通常是权限不足。 -
404
:未找到资源。 -
500
:服务器内部错误。
如果
response.status_code
不是
200
,应该检查
response.text
以获取更详细的错误信息,这有助于诊断问题。
处理响应
当收到服务器的响应后,需要根据 HTTP 状态码来判断请求是否成功。
response.status_code
属性包含了服务器返回的 HTTP 状态码。常见的状态码 200 表示请求成功。
成功响应 (Status Code 200):
如果
response.status_code
等于 200,表示请求成功。此时,可以通过以下方法获取响应内容:
-
response.text
: 获取响应的文本内容,通常用于处理 HTML、XML、JSON 等文本格式的数据。 -
response.content
: 获取响应的原始字节内容,适用于处理图片、视频等二进制格式的数据。 -
response.()
: 如果响应内容是 JSON 格式,可以使用此方法将 JSON 字符串转换为 Python 字典或列表。如果响应不是有效的JSON,会抛出异常。
示例代码:
if response.status_code == 200:
try:
data = response.()
print(data) # 处理JSON数据
except ValueError:
print(response.text) # 处理文本数据
except Exception as e:
print(f"Error processing response: {e}") # 处理其他异常
else:
print(f"Error: {response.status_code}, {response.text}")
错误响应 (Status Code != 200):
如果
response.status_code
不等于 200,表示请求失败。常见的错误状态码包括:
- 400: 客户端请求错误,例如请求参数错误。
- 401: 需要身份验证。
- 403: 禁止访问。
- 404: 请求的资源未找到。
- 500: 服务器内部错误。
当发生错误时,
response.text
属性通常包含错误信息,可以用于调试和排错。
示例代码:
if response.status_code == 200:
print(response.text)
else:
print(f"Error: {response.status_code}, {response.text}")
在实际应用中,应该根据具体的 API 规范和业务需求,对不同类型的响应进行适当的处理。添加适当的异常处理可以增强代码的健壮性。
3.3 常用 REST API 接口
- /api/v1/instrument: 获取合约信息。 详细提供了交易标的物的各项参数,包括合约代码、合约类型(如永续合约、交割合约)、最小变动单位(Tick Size)、合约乘数、保证金率、结算货币等重要信息。通过该接口,开发者可以获取最新的合约规格,为交易策略提供数据基础。
- /api/v1/order: 下单、修改订单、取消订单。 该接口是交易的核心接口,支持创建限价单、市价单等多种订单类型。允许用户指定价格、数量、交易方向(买入/卖出)等参数进行下单操作。同时,也支持对已存在的订单进行修改,例如调整价格或数量。用户还可以通过此接口取消未成交的订单。订单管理功能完善,满足各种交易场景的需求。
- /api/v1/position: 获取账户持仓信息。 实时反映账户的持仓状态,包括当前持有的合约种类、数量、平均持仓成本、未实现盈亏、已实现盈亏、保证金占用等关键数据。该接口帮助用户监控账户风险,评估交易策略的有效性。
- /api/v1/user/wallet: 获取账户余额。 提供账户资金的快照信息,包括可用余额、冻结余额、总余额等。允许用户随时掌握资金状况,进行资金调拨和风险控制。同时,该接口也可能包含不同币种的余额信息,方便用户管理多币种资产。
- /api/v1/trade: 获取成交记录。 记录了用户所有的历史成交信息,包括成交时间、成交价格、成交数量、交易手续费等。该接口为用户提供详细的交易历史记录,便于进行交易分析、盈亏统计和税务申报。部分平台可能还提供成交ID等附加信息,方便用户追踪每一笔交易的细节。
4. Streaming API 使用
4.1 连接 WebSocket
建立与BitMEX Streaming API的连接需要使用WebSocket客户端。BitMEX API提供两个不同的WebSocket端点,分别用于公共数据流和需要身份验证的私有数据流。
-
公共频道:
用于访问公开市场数据,例如交易、行情和深度数据。连接到公共频道无需身份验证。生产环境的WebSocket地址是
wss://www.bitmex.com/realtime
,而测试网的WebSocket地址是wss://testnet.bitmex.com/realtime
。使用测试网进行开发和测试可以避免对真实交易环境造成影响。 - 私有频道: 用于访问用户的账户信息、订单信息和仓位信息等私有数据。订阅私有频道 必须 进行身份验证,以确保数据的安全性。身份验证过程涉及生成签名并将其作为WebSocket连接请求的一部分发送。有关身份验证的详细信息,请参阅BitMEX API文档的相关章节。
在建立WebSocket连接时,建议实现自动重连机制,以应对网络中断或其他可能导致连接断开的情况。可以使用各种编程语言和库来实现WebSocket客户端。
4.2 身份验证
要访问私有频道的数据流,例如账户持仓信息和订单更新,必须先通过身份验证流程。 身份验证消息用于验证用户的身份和权限,确保只有授权用户才能访问敏感数据。
身份验证消息采用特定的JSON格式,如下所示:
{
"op": "authKeyExpires",
"args": [API_KEY, expires, signature]
}
各个字段的含义如下:
-
op
: 字符串类型,固定值为 "authKeyExpires",指示这是一个身份验证操作。 -
args
: 数组类型,包含三个元素,分别是:-
API_KEY
: 字符串类型,是用户的API Key ID,用于标识用户的身份。 必须替换为你自己在交易所申请的 API Key。 -
expires
: 数字类型,表示请求的过期时间,以Unix时间戳表示。 Unix时间戳是从1970年1月1日UTC到现在的秒数。 建议设置一个合理的过期时间,例如几分钟或几小时,以防止重放攻击。 -
signature
: 字符串类型,是对特定字符串进行签名后的结果。 签名用于验证请求的完整性和真实性。
-
签名的生成方式如下: 将字符串
GET/realtime
与
expires
(Unix 时间戳) 拼接在一起, 然后使用你的 API Secret Key 对拼接后的字符串进行HMAC-SHA256签名。 签名算法必须严格按照交易所的规范进行,否则验证将失败。 不同的编程语言和库提供了 HMAC-SHA256 算法的实现。 请参考交易所提供的官方文档或示例代码,确保签名算法的正确性。
4.3 订阅频道
成功建立 WebSocket 连接并通过身份验证后,下一步是订阅您感兴趣的特定数据流,这通过发送订阅消息来实现。订阅允许您接收来自交易所的实时更新,例如交易数据、订单簿变化和账户信息。订阅消息遵循特定的 JSON 格式,以便服务器能够正确解析和处理您的请求。
订阅消息的基本结构如下所示:
{
"op": "subscribe",
"args": ["instrument:XBTUSD", "trade:XBTUSD", "order:XBTUSD"]
}
在这个结构中,
op
字段指定操作类型,对于订阅操作,其值为 "subscribe"。
args
字段是一个数组,包含一个或多个要订阅的频道名称。每个频道名称代表一种特定的数据流。 例如:
-
instrument:XBTUSD
:订阅 XBTUSD 交易对的instrument数据,包括合约信息、指数价格等。 -
trade:XBTUSD
:订阅 XBTUSD 交易对的实时成交数据,包括成交价格、数量和时间戳。 -
order:XBTUSD
:订阅 XBTUSD 交易对的订单簿数据,包括买单和卖单的价格和数量。
您可以同时订阅多个频道,只需将它们添加到
args
数组中即可。请注意,不同的交易所可能支持不同的频道名称和格式,因此请务必查阅交易所的 API 文档以获取详细信息。 部分频道可能需要额外的权限或满足特定的账户要求才能订阅。
4.4 处理消息
WebSocket 连接建立完成后,BitMEX 服务器会推送各类实时数据消息,涵盖市场行情(例如最新成交价、买卖盘口)、订单簿更新(新增、修改或删除订单)以及账户持仓变动(可用余额、持仓数量、盈亏等)。因此,需要设计和实现相应的代码逻辑,以便高效、准确地解析和处理这些消息。
下方示例展示了如何使用 Python 的
websocket-client
库连接 BitMEX Streaming API 并对接收到的消息进行处理。此示例使用了 BitMEX 测试网 (testnet) 环境,方便进行实验和调试,避免对真实交易产生影响。请务必使用 API 密钥和密钥,不要泄露。
import websocket
import
import time
import hmac
import hashlib
import urllib.parse
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
def generate_auth_signature(api_secret, verb, uri, expires):
"""为 API 请求生成身份验证签名。"""
message = verb + uri + str(expires)
signature = hmac.new(api_secret.encode('utf-8'), message.encode('utf-8'), digestmod=hashlib.sha256).hexdigest()
return signature
def on_message(ws, message):
"""处理接收到的 WebSocket 消息。"""
print(message)
# 在此添加你的消息处理逻辑,例如解析 JSON 数据,更新本地数据,或者触发其他操作。
try:
data = .loads(message)
# 根据消息类型进行不同的处理
if 'table' in data:
table = data['table']
if table == 'trade':
# 处理交易数据
print("Trade Data:", data['data'])
elif table == 'orderBookL2':
#处理订单簿数据
print("OrderBook Data:", data['data'])
except .JSONDecodeError as e:
print(f"JSONDecodeError: {e}")
def on_error(ws, error):
"""处理 WebSocket 错误。"""
print(error)
def on_close(ws, close_status_code, close_msg):
"""处理 WebSocket 连接关闭事件。"""
print("### closed ###")
print("Close status code: ", close_status_code)
print("Close message: ", close_msg)
def on_open(ws):
"""处理 WebSocket 连接打开事件。"""
print("### opened ###")
# 身份验证
expires = int(time.time()) + 60
signature = generate_auth_signature(api_secret, 'GET', '/realtime', expires)
auth_message = {
"op": "authKeyExpires",
"args": [api_key, expires, signature]
}
ws.send(.dumps(auth_message))
# 订阅频道
subscribe_message = {
"op": "subscribe",
"args": ["instrument:XBTUSD", "trade:XBTUSD", "orderBookL2:XBTUSD"] # 同时订阅 orderBookL2,修改了原有的 'order',因为实际应该是订阅 orderBookL2 数据,而 order 数据应该是订阅 private/order
}
ws.send(.dumps(subscribe_message))
# 身份验证
expires = int(time.time()) + 60
signature = generate_auth_signature(api_secret, 'GET', '/realtime', expires)
auth_message = {
"op": "authKeyExpires",
"args": [api_key, expires, signature]
}
ws.send(.dumps(auth_message))
# 订阅频道
subscribe_message = {
"op": "subscribe",
"args": ["instrument:XBTUSD", "trade:XBTUSD", "orderBookL2:XBTUSD"] # 同时订阅 orderBookL2,修改了原有的 'order',因为实际应该是订阅 orderBookL2 数据,而 order 数据应该是订阅 private/order
}
ws.send(.dumps(subscribe_message))
if __name__ == "__main__":
websocket.enableTrace(True) # 启用 WebSocket 跟踪,方便调试
ws = websocket.WebSocketApp("wss://testnet.bitmex.com/realtime",
on_message=on_message,
on_error=on_error,
on_close=on_close,
on_open=on_open,
on_ping=lambda wsapp, message: print("Received Ping, sending pong"), # 可选:处理 Ping 消息
on_pong=lambda wsapp, message: print("Received Pong")) # 可选:处理 Pong 消息
ws.run_forever(ping_interval=30, ping_timeout=10) # 添加 ping 机制,保持连接活跃
4.5 常用 Streaming API 频道
Streaming API 提供多种频道,用于实时推送不同类型的市场和账户数据。以下列出一些常用的频道及其用途:
-
instrument:
合约信息频道,实时推送合约的最新信息,例如:
- 合约代码(Symbol)
- 合约类型(例如:永续合约、交割合约)
- 标的资产
- 合约乘数
- 最小价格变动单位(Tick Size)
- 涨跌停价格
-
trade:
交易记录频道,实时推送最新的交易信息,包括:
- 交易时间戳
- 交易价格
- 交易数量
- 买卖方向(买入/卖出)
- 交易ID
该频道可用于分析市场成交活跃度,追踪大额交易等。
-
orderBookL2:
订单簿(完整快照)频道,提供Level 2深度的订单簿数据,包含:
- 买单价格及数量
- 卖单价格及数量
- 订单簿更新的时间戳
通过该频道可以获取市场深度信息,进行更精细的交易策略。
-
order:
订单更新频道,实时推送用户订单状态的更新,例如:
- 订单创建
- 订单成交
- 订单取消
- 订单状态变更(例如:部分成交、完全成交、已取消)
- 订单价格
- 订单数量
注意: 此频道需要身份验证,只有通过身份验证的用户才能订阅自己的订单信息。
-
position:
账户持仓频道,实时推送用户的账户持仓信息,包括:
- 持仓合约代码
- 持仓数量
- 平均持仓成本
- 未实现盈亏
- 已实现盈亏
- 杠杆倍数
注意: 此频道需要身份验证,只有通过身份验证的用户才能订阅自己的持仓信息。
5. 错误处理
在使用BitMEX API时,可能会遇到各种错误。常见的错误包括:
- 400 Bad Request: 请求参数错误。
- 401 Unauthorized: 身份验证失败。
- 403 Forbidden: 没有权限访问该接口。
- 429 Too Many Requests: 超过API请求频率限制。
你需要仔细阅读API文档,了解每个接口的参数要求和错误码,并编写代码来处理这些错误。
6. API 文档
BitMEX 提供了一套完整的 REST API,允许开发者以编程方式访问其平台功能,包括交易、账户管理、市场数据查询等。详细的 API 文档是进行有效集成的关键资源,您可以在官方提供的 API Explorer 中找到所有接口的详细信息: https://www.bitmex.com/api/explorer/ 。该 Explorer 提供交互式界面,方便您直接测试 API 调用并查看返回结果。
强烈建议您在使用 BitMEX API 之前,务必仔细阅读 API 文档。 理解每个接口的参数要求(包括数据类型、必填项和可选参数)、请求方法(GET、POST、PUT、DELETE)、返回值(包括成功响应和错误响应的结构)以及可能出现的错误码及其含义至关重要。 文档通常包含请求示例和响应示例,有助于您快速理解 API 的使用方式。请注意 API 的速率限制,避免因过度请求而被限制访问。BitMEX 可能会对不同的 API 端点设置不同的速率限制,因此请仔细阅读相关文档,以确保您的应用程序符合这些限制。
API 文档通常还会包含认证授权的相关信息。BitMEX API 使用 API 密钥和 Secret 密钥进行认证。您需要在请求头中包含正确的认证信息,才能成功调用 API。请务必妥善保管您的 API 密钥和 Secret 密钥,避免泄露,并定期轮换密钥以提高安全性。某些 API 端点可能需要特定的权限,请确保您的 API 密钥具有访问这些端点的权限。