BitMEX API接口指南:掌握数字货币自动化交易

频道: 答疑 日期: 浏览:108

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 可以构建高响应速度的交易系统和监控工具。
REST API: REST API基于HTTP协议,使用标准的GET、POST、PUT、DELETE等方法进行数据请求和操作。REST API适用于执行下单、查询账户信息、获取历史数据等操作。
  • Streaming API: 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签名过程的关键步骤如下:

    1. 构建签名消息: 将构成签名消息的各个部分按特定顺序连接起来。这些部分包括HTTP请求方法(例如:GET、POST、PUT、DELETE)、请求的规范化路径(包含查询参数)、请求过期时间戳以及请求体(如果存在)。规范化路径是指URL中域名之后的部分,包括路径和查询字符串。
    2. 计算HMAC-SHA256签名: 使用您的API Secret作为密钥,对签名消息应用HMAC-SHA256算法。API Secret是您在BitMEX平台上创建API密钥时获得的,务必妥善保管,切勿泄露。HMAC-SHA256算法将API Secret和签名消息作为输入,生成一个唯一的哈希值,即签名。
    3. 添加请求头: 将以下信息添加到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 ,如果存在)计算得出的。

    签名的生成过程通常如下:

    1. 准备签名材料: 收集所有必要的参数: api_secret , verb , uri , expires , 和 data 。 确保 api_secret 是保密的,不要泄露给任何人。
    2. 构建签名字符串: 将这些参数按照特定的顺序连接成一个字符串。这个顺序和连接方式通常由API提供商指定,必须严格遵守。常见的做法是将 verb uri expires data (如果存在,需要序列化成字符串,例如JSON字符串)依次连接。
    3. 计算哈希值: 使用哈希算法(如HMAC-SHA256)对构建的字符串进行哈希运算。 HMAC算法需要使用 api_secret 作为密钥。
    4. 生成最终签名: 将计算得到的哈希值进行编码(例如,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 密钥具有访问这些端点的权限。