BitMEX API 获取市场数据:一份详尽指南
BitMEX (Bitcoin Mercantile Exchange) 是一家知名的加密货币衍生品交易所,提供比特币、以太坊等数字货币的杠杆交易。对于量化交易者、数据分析师以及希望构建自动化交易系统的开发者来说,掌握 BitMEX API 如何获取市场数据至关重要。本文将深入探讨如何利用 BitMEX API 获取各种类型的市场数据,包括实时行情、历史数据、深度数据等。
理解 BitMEX API 基础
BitMEX 应用程序编程接口(API)提供了两种主要的交互方式,分别服务于不同的数据获取和交易执行需求:
-
REST API (Representational State Transfer API):
这种接口主要用于执行同步请求,比如获取历史交易数据、查询账户余额和持仓信息、创建和修改订单等。REST API 基于标准的 HTTP 协议,这意味着你可以使用任何支持 HTTP 请求的编程语言与之交互,常见的包括 Python、JavaScript、Go、Java 和 C# 等。REST API 使用不同的 HTTP 方法来执行不同的操作:
GET
用于检索数据,POST
用于创建新的资源,PUT
用于更新现有资源,而DELETE
用于删除资源。每个 REST API 请求都需要进行签名,以确保安全性和身份验证。 - WebSocket API: 这种接口专为实时数据流的订阅而设计,例如实时的市场行情(ticker data)、订单簿深度信息(order book depth)、以及最新的交易执行情况(trade executions)。WebSocket 协议提供了一种全双工、双向通信通道,允许服务器主动向客户端推送数据,无需客户端频繁发起请求。这种方式显著降低了数据延迟,对于高频交易和实时监控至关重要。通过 WebSocket API,你可以订阅特定的交易对或合约,并实时接收相关的数据更新。
在使用 BitMEX API 之前,必须先注册并创建一个 BitMEX 交易账户。随后,你需要生成一组 API 密钥(API Key),它由
apiKey
(API 密钥)和
apiSecret
(API 密钥私钥)两部分组成,用于对你的 API 请求进行身份验证和授权。
apiKey
标识你的账户,而
apiSecret
用于生成请求签名,确保请求的完整性和真实性。务必采取必要的安全措施,安全地存储你的 API 密钥,防止泄露给未经授权的第三方。同时,强烈建议你为 API 密钥设置适当的权限,例如限制提款权限或仅允许特定交易品种的交易,以此来最大限度地降低潜在的安全风险。启用双因素认证(2FA)也能进一步提高账户的安全性。
使用 REST API 获取市场数据
REST API(Representational State Transfer 应用编程接口)是访问加密货币市场历史数据和执行非实时操作的主要方式。相较于 WebSocket API 提供的实时流数据,REST API 更侧重于按需获取特定时间段或特定指标的历史数据快照。以下介绍如何利用 REST API 获取常见的市场数据,包括交易对信息、历史价格、交易量以及订单簿快照等。
1. 获取交易对信息: 通过 REST API,您可以查询交易所支持的交易对列表,以及每个交易对的详细参数,例如交易对的代码、基础货币和报价货币、价格精度、交易量精度、最小交易量限制等。这些信息对于了解交易所支持的交易品种以及制定交易策略至关重要。
2. 获取历史价格数据(K线数据): REST API 允许您获取特定交易对在特定时间范围内的历史价格数据,通常以 K 线(Candlestick Chart)的形式呈现。您可以指定 K 线的周期,例如 1 分钟、5 分钟、1 小时、1 天等。K 线数据包含开盘价、最高价、最低价和收盘价(OHLC),以及该周期的交易量。这些数据对于技术分析和回溯测试交易策略至关重要。
3. 获取历史交易数据: 您可以获取指定交易对的历史交易记录,包括每笔交易的价格、交易量、交易时间和买卖方向。这些数据可以用于分析市场交易活动、评估市场深度和流动性,以及识别潜在的交易机会。
4. 获取订单簿快照: REST API 允许您获取指定交易对的订单簿快照,其中包含买单和卖单的列表,以及每个订单的价格和数量。订单簿快照可以帮助您了解当前市场的供需关系和价格压力,并做出更明智的交易决策。订单簿深度通常也会提供,指示不同价格水平的累计挂单量。
5. 时间戳与数据同步: 在使用 REST API 获取数据时,务必注意时间戳的格式和时区,并确保数据同步。不同的交易所可能使用不同的时间戳格式(例如 Unix 时间戳或 ISO 8601 格式),并且可能存在时区差异。正确处理时间戳对于分析历史数据和构建时间序列模型至关重要。
6. 速率限制与API 密钥: 大多数交易所都会对 REST API 的请求频率进行限制(Rate Limit),以防止滥用和保证服务器稳定性。您需要仔细阅读交易所的 API 文档,了解速率限制的具体规则,并在代码中实现相应的重试机制。通常,您还需要注册 API 密钥(API Key)才能访问 REST API。API 密钥用于身份验证和授权,确保只有授权用户才能访问 API 数据。请妥善保管您的 API 密钥,避免泄露。
获取最近交易数据
你可以使用
/trade
接口获取最近的交易数据,该接口提供加密货币交易历史的快照。通过指定交易对和数据量,你可以检索指定时间范围内的交易信息。以下是一个示例:
GET /api/v1/trade?symbol=XBTUSD&count=100&reverse=true
-
symbol
: 指定交易对,用于筛选特定市场的交易数据。例如,XBTUSD
表示比特币/美元,ETHUSD
表示以太坊/美元。务必使用交易所支持的有效交易对。 -
count
: 指定返回的交易数量,控制每次API调用返回的数据量。该值最大值为 1000,超出此限制的请求将被截断。较小的数值可以提高响应速度。 -
reverse
: 如果设置为true
,则返回的数据按照时间倒序排列,即最新的交易记录将出现在列表的顶部。如果设置为false
或省略,则数据按时间顺序排列,最早的交易记录在顶部。
使用 Python 代码示例如下:
import requests
import
base_url = "https://www.bitmex.com/api/v1" # 如果使用测试网,则更改为 "https://testnet.bitmex.com/api/v1"
symbol = "XBTUSD"
count = 100
reverse = True
endpoint = f"{base_url}/trade?symbol={symbol}&count={count}&reverse={reverse}"
try:
response = requests.get(endpoint)
response.raise_for_status() # 检查请求是否成功
data = response.()
print(.dumps(data, indent=4)) # 格式化输出
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except .JSONDecodeError as e:
print(f"JSON 解析错误: {e}")
这段代码演示了如何从 BitMEX API 获取最近的 100 条 XBTUSD 交易数据,并以易于阅读的 JSON 格式打印出来。
response.raise_for_status()
函数用于捕获HTTP错误,例如404 Not Found或500 Internal Server Error。代码还包括JSON解析错误的异常处理,确保程序的健壮性。确保安装了
requests
库 (
pip install requests
)。
获取历史成交量数据
可以使用
/trade/bucketed
接口获取历史成交量数据。此接口允许你按照预定义的时间间隔对市场交易数据进行聚合,从而分析历史交易行为和趋势。
GET /api/v1/trade/bucketed?binSize=1m&symbol=XBTUSD&count=100&reverse=true
-
binSize
: 指定时间间隔,定义了聚合交易数据的时间窗口。有效值包括:-
1m
: 1 分钟 -
5m
: 5 分钟 -
1h
: 1 小时 -
1d
: 1 天
-
-
symbol
: 指定交易对,例如XBTUSD
(比特币/美元)。必须是交易所支持的有效交易对。 -
count
: 指定返回的数据点数量。此参数控制 API 返回的最大数据条目数,影响你所能分析的历史数据范围。 -
reverse
: 如果设置为true
,则返回的数据按照时间倒序排列,最新的数据在前。设置为false
则按时间顺序排列,最早的数据在前。
Python 代码示例,展示如何使用
requests
库从 BitMEX 获取历史成交量数据:
import requests
import
base_url = "https://www.bitmex.com/api/v1"
symbol = "XBTUSD"
bin_size = "1m"
count = 100
reverse = True
endpoint = f"{base_url}/trade/bucketed?binSize={bin_size}&symbol={symbol}&count={count}&reverse={reverse}"
try:
response = requests.get(endpoint)
response.raise_for_status() # 检查是否有HTTP错误
data = response.()
print(.dumps(data, indent=4))
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except .JSONDecodeError as e:
print(f"JSON 解析错误: {e}")
这段代码示例获取 XBTUSD 交易对最近 100 分钟的成交量数据,并以格式化的 JSON 格式打印出来。每个数据点包含多个关键信息,例如:
-
timestamp
: 数据点对应的时间戳,通常以 ISO 8601 格式表示。 -
open
: 时间间隔内的开盘价。 -
high
: 时间间隔内的最高价。 -
low
: 时间间隔内的最低价。 -
close
: 时间间隔内的收盘价。 -
volume
: 时间间隔内的总成交量。 -
trades
: 时间间隔内的成交笔数。
这些数据可以用于各种技术分析,例如识别趋势、计算移动平均线、评估波动性等。
获取指数成分股和权重
BitMEX 提供一系列加密货币指数,例如
.BXBT
(比特币指数)。开发者可以通过其API获取这些指数的详细成分股构成及相应的权重分配情况,这对于量化交易、风险评估和投资组合构建至关重要。
API 端点:
GET /api/v1/instrument
通过调用
/api/v1/instrument
接口,并筛选
symbol
属性以
.BXBT
开头的条目,可以获取到所需的指数信息。返回的数据结构中,关键字段是
indexComposite
。该字段是一个JSON数组,每个元素代表一个成分股,包含两个主要属性:
symbol
(成分股的交易代码) 和
weight
(该成分股在指数中的权重,通常表示为百分比)。
Python 代码示例:
以下Python代码演示了如何使用
requests
库从 BitMEX API 获取
.BXBT
指数的成分股和权重信息,并使用
库格式化输出结果。此代码示例需要安装
requests
库:
pip install requests
。
import requests
import
base_url = "https://www.bitmex.com/api/v1"
endpoint = f"{base_url}/instrument?symbol=.BXBT"
try:
response = requests.get(endpoint)
response.raise_for_status() # 检查HTTP状态码,如果不是200,则抛出异常
data = response.()
if data:
# indexComposite 是一个数组,包含所有成分股的权重信息
index_composite = data[0].get('indexComposite')
if index_composite:
print(.dumps(index_composite, indent=4))
else:
print("未找到 .BXBT 指数的 indexComposite 信息")
else:
print("未找到 .BXBT 的指数信息")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except .JSONDecodeError as e:
print(f"JSON 解析错误: {e}")
代码解释:
- 代码定义了BitMEX API的基础URL和请求的端点。
-
然后,使用
requests.get()
方法发送GET请求到指定的API端点。 -
response.raise_for_status()
方法用于检查HTTP响应状态码,如果状态码表示错误(例如404或500),则会引发一个异常,从而可以更好地处理错误情况。 -
response.()
方法将API响应的JSON数据解析为Python字典或列表。 -
代码检查返回的数据是否为空。如果数据存在,则提取
indexComposite
字段的值。 -
.dumps(index_composite, indent=4)
方法将indexComposite
数组格式化为带有缩进的JSON字符串,使其更易于阅读。 -
代码使用
try...except
块来捕获可能发生的异常,例如网络请求错误 (requests.exceptions.RequestException
) 和 JSON 解析错误 (.JSONDecodeError
),并打印相应的错误消息。
注意事项:
-
BitMEX API有速率限制,请合理控制请求频率,避免被限制访问。 可以通过查看响应头中的
X-RateLimit-Limit
,X-RateLimit-Remaining
, 和X-RateLimit-Reset
字段来了解当前的速率限制情况。 - 请确保你的代码能够正确处理API返回的各种错误情况。
- 指数的成分股和权重可能会定期调整,建议定期更新数据。
使用 WebSocket API 获取市场数据
WebSocket API 主要用于订阅实时市场数据流,它提供了一种持久化的双向通信连接,非常适合接收高频率、低延迟的数据更新。例如,您可以订阅实时行情数据(如最新成交价、买一价、卖一价)、深度数据(订单簿信息,包括买单和卖单的挂单价格和数量)、以及实时的交易信息(成交记录,包含成交价格、数量和时间)。
与传统的 HTTP 请求-响应模式不同,WebSocket 允许服务器主动向客户端推送数据,无需客户端频繁发起请求,这显著降低了延迟并提高了效率。对于需要快速响应市场变化的交易策略,WebSocket API 是一个关键的技术选择。
在使用 WebSocket API 时,通常需要进行身份验证,以确保只有授权用户才能访问敏感数据。身份验证过程可能涉及 API 密钥、签名或其他安全机制。不同的交易所或数据提供商可能采用不同的 WebSocket 协议和数据格式,因此在使用前务必详细阅读其 API 文档。
常见的 WebSocket 应用场景包括:高频交易、算法交易、实时风险监控、以及需要展示实时市场数据的用户界面等。 通过高效的数据传输,WebSocket API 能够帮助开发者构建更加灵敏和响应迅速的交易系统和应用。
建立 WebSocket 连接
建立与 BitMEX WebSocket 服务器的连接是使用 WebSocket API 的第一步。WebSocket 是一种在客户端和服务器之间提供全双工通信信道的协议,非常适合实时数据传输,这在加密货币交易中至关重要。你需要一个 WebSocket 客户端库来实现连接。
Python 中,
websocket-client
是一个常用的库,可以使用 pip 安装:
pip install websocket-client
以下代码展示了如何使用
websocket-client
建立连接:
import websocket
def on_message(ws, message):
print(f"接收到消息: {message}")
def on_error(ws, error):
print(f"发生错误: {error}")
def on_close(ws, close_status_code, close_msg):
print(f"连接关闭: {close_status_code}, {close_msg}")
def on_open(ws):
print("连接已建立")
if __name__ == "__main__":
ws = websocket.WebSocketApp(
"wss://ws.bitmex.com/realtime", # BitMEX 实时 WebSocket 地址
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever()
代码解释:
-
websocket.WebSocketApp
创建一个 WebSocket 应用程序实例,需要传入 WebSocket 服务器的 URL。BitMEX 实时 WebSocket 地址通常是wss://ws.bitmex.com/realtime
。 -
on_open
,on_message
,on_error
, 和on_close
是回调函数,分别在连接建立、接收到消息、发生错误和连接关闭时被调用。 -
ws.run_forever()
启动 WebSocket 客户端,保持连接直到手动中断或发生错误。
你需要处理连接建立、消息接收、错误处理和连接关闭等事件。
on_message
函数用于处理接收到的消息,通常是 JSON 格式的数据,需要进行解析。
on_error
函数用于处理连接过程中发生的错误,例如网络问题或服务器错误。
on_close
函数在连接关闭时被调用,可以进行清理工作或尝试重新连接。
使用测试网时,请将 WebSocket URL 更改为 "wss://testnet.bitmex.com/realtime"
ws_url = "wss://www.bitmex.com/realtime"
def on_message(ws, message):
data = .loads(message)
print(.dumps(data, indent=4))
def on_error(ws, error):
print(f"错误: {error}")
def on_close(ws):
print("连接已关闭")
def on_open(ws):
print("连接已建立")
# 订阅 XBTUSD 实时交易数据
ws.send('{"op": "subscribe", "args": ["trade:XBTUSD"]}')
if __name__ == "__main__":
websocket.enableTrace(False) # 禁用调试信息,设置为True可启用详细调试输出
ws = websocket.WebSocketApp(ws_url,
on_message = on_message,
on_error = on_error,
on_close = on_close)
ws.on_open = on_open
ws.run_forever()
这段代码使用 Python 的
websocket-client
库与 BitMEX 的 WebSocket API 建立连接。
ws_url
定义了连接的端点,指向 BitMEX 的实时数据流服务器。 使用回调函数处理不同的 WebSocket 事件,包括接收消息 (
on_message
)、错误 (
on_error
)、连接关闭 (
on_close
) 和连接建立 (
on_open
)。
on_open
函数在成功建立连接后被调用,向服务器发送一个 JSON 格式的订阅消息,请求订阅 XBTUSD 交易对的实时交易数据 (
trade:XBTUSD
)。 接收到的消息通过
.loads()
解析为 Python 字典,并使用
.dumps()
格式化打印,以便于阅读和调试。 通过调用
ws.run_forever()
保持 WebSocket 连接的活跃状态,持续监听来自 BitMEX 服务器的实时数据流。
订阅实时行情
为了获取 XBTUSD (比特币/美元) 永续合约的实时市场行情数据,您需要向指定的数据流服务发送订阅请求。该请求通常采用 JSON 格式,并通过 WebSocket 连接进行传输。以下详细描述了订阅过程和请求消息的构成:
用于订阅 XBTUSD 交易信息的JSON消息结构如下所示:
{
"op": "subscribe",
"args": ["trade:XBTUSD"]
}
消息中的关键字段解释:
-
op
: 这是一个字符串类型的字段,用于指定要执行的操作。在此例中,其值为"subscribe"
,表明客户端希望订阅特定的数据流。 -
args
: 这是一个数组类型的字段,包含了订阅操作的具体参数。数组中的每个元素代表一个需要订阅的频道或数据流。
关于
args
字段的进一步说明:
-
"trade:XBTUSD"
: 这是一个字符串,指定了要订阅的交易频道。trade
表示订阅的是交易数据,XBTUSD
则指明了具体的交易对,即比特币/美元永续合约。通过订阅该频道,您将接收到所有关于 XBTUSD 交易的实时更新,包括成交价格、成交数量和成交时间等信息。
除了
trade:XBTUSD
频道,您还可以订阅其他频道以获取不同的数据。例如:
-
quote:XBTUSD
: 订阅 XBTUSD 的最佳买卖报价(BBO)。 -
orderBookL2:XBTUSD
: 订阅 XBTUSD 的 Level 2 订单簿数据,提供更详细的买单和卖单信息。 -
instrument
: 订阅合约的详细信息, 例如合约乘数,保证金要求等。
在发送此 JSON 消息后,服务器将开始向客户端推送 XBTUSD 交易的实时数据。客户端需要保持 WebSocket 连接的稳定,以便持续接收数据更新。请参考具体交易所或数据提供商的API文档,以获取更详细的订阅频道列表和其他相关信息。同时,请注意频率限制,避免因过高的请求频率被服务器限制访问。
订阅深度数据
为了实时掌握市场动态,您可以订阅 XBTUSD 的深度数据。通过订阅,您可以接收到交易所的实时订单簿信息,从而更好地分析市场趋势和制定交易策略。
要订阅 XBTUSD 的深度数据,您需要向交易所的 WebSocket API 发送一个特定的 JSON 消息。该消息指示您希望订阅的频道和交易对。
以下是一个用于订阅 XBTUSD 深度数据的 JSON 消息示例:
{
"op": "subscribe",
"args": ["orderBookL2_25:XBTUSD"]
}
在此消息中,
op
字段设置为 "subscribe",表示这是一个订阅请求。
args
字段是一个数组,包含要订阅的频道名称。在这个例子中,我们订阅了 "orderBookL2_25:XBTUSD" 频道。
orderBookL2_25:XBTUSD
表示您正在订阅 XBTUSD 交易对的 Level 2 深度数据,但仅限于前 25 档最佳买入和卖出价格。这意味着您将收到订单簿中最接近市场价格的 25 个买单和 25 个卖单的信息,从而在数据量和信息密度之间取得平衡。
如果您需要完整的 Level 2 深度数据,即订单簿上的所有挂单信息,可以使用
orderBookL2
频道。订阅
orderBookL2:XBTUSD
将提供更全面的市场深度视图,但也会产生更大的数据流量。
请注意,不同的交易所可能对频道名称和数据格式有所不同。请务必查阅您所使用的交易所的 API 文档,以确保正确订阅和解析深度数据。
处理接收到的数据
on_message
回调函数是WebSocket客户端接收服务器推送消息的核心组件。该函数接收到的
message
参数通常为字符串形式,你需要使用JSON解析库(如 Python 的
模块)将其转换为可操作的数据结构。正确解析JSON数据至关重要,它确保了后续数据处理的准确性和可靠性。
以下代码示例展示了如何解析JSON格式的消息,并根据消息内容中的
table
字段,区分和处理不同类型的数据,例如交易数据和深度行情数据:
import
def on_message(ws, message):
try:
data = .loads(message)
if 'table' in data:
table = data['table']
if table == 'trade':
# 处理交易数据
trades = data['data']
for trade in trades:
print(f"交易价格: {trade['price']}, 数量: {trade['size']}, 交易时间: {trade['timestamp']}")
# 在此处添加你的交易数据处理逻辑,例如存储到数据库或进行实时分析
elif table == 'orderBookL2_25':
# 处理深度数据
order_book_entries = data['data']
for entry in order_book_entries:
print(f"价格: {entry['price']}, 数量: {entry['size']}, 卖/买: {entry['side']}, 时间戳: {entry['timestamp']}")
# 在此处添加你的深度数据处理逻辑,例如构建订单簿或计算市场深度
elif table == 'insurance':
#处理保险基金数据
insurance_data = data['data']
for insurance in insurance_data:
print(f"币种: {insurance['currency']}, 保险基金: {insurance['walletBalance']}, 时间戳: {insurance['timestamp']}")
else:
print(f"未知的table类型: {table}, 完整数据: {data}")
except .JSONDecodeError as e:
print(f"JSON解析错误: {e}, 原始消息: {message}")
except KeyError as e:
print(f"KeyError: 缺少键 {e}, 完整数据: {data}")
except Exception as e:
print(f"处理消息时发生错误: {e}, 完整数据: {data}")
这段代码首先尝试将接收到的
message
解析为 JSON 格式。如果解析成功,它会检查数据中是否存在
table
字段。根据
table
字段的值,代码会执行不同的数据处理逻辑。例如,当
table
为
trade
时,代码会遍历交易数据,并打印每笔交易的价格和数量。当
table
为
orderBookL2_25
时,代码会遍历深度数据,并打印每个订单簿条目的价格、数量和买/卖方向。同时包含了异常处理,能捕获JSON解析失败、键值缺失和其他运行时异常。
请注意,上述代码仅为示例,你需要根据你的实际需求修改数据处理逻辑。例如,你可以将交易数据存储到数据库中,或者使用深度数据构建订单簿。你还需要根据服务器推送的数据格式,调整JSON解析和数据提取的代码。
认证 WebSocket 连接
为了访问私有频道,例如账户余额、订单更新和交易执行等敏感信息,必须建立经过身份验证的 WebSocket 连接。未经验证的连接无法接收此类私有数据。身份验证流程旨在确保只有授权用户才能访问其账户相关的实时信息,具体步骤如下:
- 生成到期时间戳: 创建一个 Unix 时间戳,代表认证凭证的有效截止时间。该时间戳应为自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来经过的秒数。选择合理的过期时间,防止未授权访问,同时避免频繁重新认证。
-
构造签名字符串:
将字符串
GET/realtime
与上一步生成的到期时间戳进行拼接,形成用于签名的原始字符串。拼接顺序必须严格按照GET/realtime
+ 时间戳 的方式进行,任何偏差都会导致签名验证失败。 -
生成 HMAC-SHA256 签名:
使用您的 API 密钥 (
apiSecret
) 作为密钥,对上一步构造的签名字符串进行 HMAC-SHA256 签名。HMAC-SHA256 算法提供了一种安全的方式,使用密钥对数据进行哈希运算,确保数据完整性和身份验证。 - Base64 编码: 对 HMAC-SHA256 签名结果进行 Base64 编码。Base64 是一种将二进制数据转换为 ASCII 字符串的编码方式,便于在网络上传输和存储签名信息。
-
发送认证消息:
将生成的 API 密钥 (
apiKey
)、到期时间戳和 Base64 编码后的签名结果组合成 JSON 格式的认证消息,并通过 WebSocket 连接发送到服务器。服务器将验证这些信息,以确认连接的身份和授权。认证消息的格式通常如下:
确保{ "op": "auth", "args": [apiKey, timestamp, signature] }
op
字段设置为 "auth",args
数组包含您的 API 密钥、时间戳和签名。
以下 Python 代码片段展示了如何生成认证信息:
import websocket
import hashlib
import hmac
import base64
import time
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
timestamp = str(int(time.time() + 60)) # 设置过期时间为 60 秒后
message = "GET/realtime" + timestamp
signature = hmac.new(api_secret.encode("utf-8"), message.encode("utf-8"), hashlib.sha256).digest()
signature_b64 = base64.b64encode(signature).decode()
print(f"API Key: {api_key}")
print(f"Timestamp: {timestamp}")
print(f"Signature: {signature_b64}")
# 构建认证消息 (需要根据交易所的具体要求调整格式)
auth_message = {
"op": "auth",
"args": [api_key, timestamp, signature_b64]
}
# 使用 websocket 客户端发送 auth_message
请务必替换
YOUR_API_KEY
和
YOUR_API_SECRET
为您真实的 API 密钥和密钥。过期时间 (timestamp) 的选择需要根据实际情况调整,建议在保证安全性的前提下,避免过于频繁的重新认证。
auth_message
的具体格式也需要参考交易所提供的 API 文档。
如果使用测试网,请将 WebSocket URL 更改为 "wss://testnet.bitmex.com/realtime"
WebSocket URL 用于建立与 BitMEX 交易所的实时数据连接。
ws_url = "wss://www.bitmex.com/realtime"
该变量定义了BitMEX主网的WebSocket URL。所有实时数据流都通过此连接传输。
def generate_signature(api_secret, expires):
data = "GET/realtime" + str(expires)
message = data.encode('utf-8')
secret = api_secret.encode('utf-8')
signature = hmac.new(secret, message, digestmod=hashlib.sha256).digest()
return base64.b64encode(signature).decode('utf-8')
此函数使用您的 API 密钥和密钥生成签名,以便对 WebSocket 连接进行身份验证。 其工作原理是创建一个包含动词“GET”、路径“/realtime”和过期时间戳的字符串。 然后,它使用您的 API 密钥作为密钥,使用 HMAC-SHA256 对此字符串进行哈希处理。 它对哈希值进行 base64 编码,并返回生成的签名。
def on_message(ws, message):
data = .loads(message)
print(.dumps(data, indent=4))
此函数在通过 WebSocket 连接收到消息时调用。 它首先使用
.loads()
将消息解析为 Python 字典。 然后,它使用
.dumps()
将字典打印到控制台,使用缩进以便于阅读。
库需要导入(
import
)。
def on_error(ws, error):
print(f"错误: {error}")
此函数在 WebSocket 连接上发生错误时调用。 它只是将错误消息打印到控制台。
def on_close(ws):
print("连接已关闭")
此函数在 WebSocket 连接关闭时调用。 它只是将一条消息打印到控制台。
def on_open(ws):
print("连接已建立")
# 认证
expires = int(time.time()) + 60 # 60 秒过期
signature = generate_signature(api_secret, expires)
auth_message = {
"op": "authKey",
"args": [api_key, expires, signature]
}
ws.send(.dumps(auth_message))
此函数在建立 WebSocket 连接后调用。 它首先打印一条消息到控制台。 然后,它生成一个签名,并发送一个身份验证消息到 BitMEX。 身份验证消息包含您的 API 密钥、过期时间和签名。 过期时间设置为当前时间加 60 秒。请注意,时间戳的准确性至关重要,服务器端通常有时间窗口限制。时间模块需要导入 (
import time
)。
# 订阅账户信息
ws.send('{"op": "subscribe", "args": ["margin"]}')
此代码片段演示了如何订阅 BitMEX 上的账户信息。
"op": "subscribe"
指定执行订阅操作。
"args": ["margin"]
指定您要订阅“margin”频道,该频道提供账户余额和未平仓头寸的更新。
if __name__ == "__main__":
websocket.enableTrace(False)
ws = websocket.WebSocketApp(ws_url,
on_message = on_message,
on_error = on_error,
on_close = on_close)
ws.on_open = on_open
ws.run_forever()
此代码启动 WebSocket 应用程序。 它禁用跟踪以减少输出。 然后,它创建一个新的
WebSocketApp
对象,并将 WebSocket URL 以及事件处理程序传递给它。 它调用
run_forever()
方法来启动应用程序并连接到 BitMEX。
websocket
库需要导入 (
import websocket
)。
这段代码示例展示了如何使用 Python 连接到 BitMEX WebSocket API、生成身份验证签名以及订阅私有频道。要运行此代码,您需要安装
websocket-client
、
hmac
,
hashlib
, 和
base64
库。安装方法:
pip install websocket-client
。
成功认证后,您就可以订阅私有频道,例如
margin
(账户信息)、
order
(订单信息) 等。请务必将
api_key
和
api_secret
变量替换成您真实的 BitMEX API 密钥和密钥。 请安全保管您的API密钥,不要泄露给他人,避免造成资产损失。