火币交易所 API 使用指南
火币全球站提供了一套强大的 API,允许开发者程序化地访问交易所的功能,包括获取市场数据、下单交易、管理账户信息等等。本指南将介绍火币交易所 API 的使用方法,帮助你快速上手。
1. API 密钥获取
在使用火币API进行程序化交易或数据分析之前,获取有效的API密钥是首要步骤。API密钥是连接你的应用程序与火币交易所服务器的桥梁,它允许你的程序安全地访问你的账户和交易所的各种功能。以下是详细的获取步骤:
- 登录你的火币全球站账户: 确保你拥有一个经过验证的火币全球站账户。使用你的用户名和密码登录,如果启用了两步验证(2FA),请完成验证过程。
- 前往“账户” - “API 管理”页面: 登录后,将鼠标悬停在页面右上角的“账户”图标上,在下拉菜单中选择“API 管理”。这将带你进入API密钥的管理页面。
-
创建新的API密钥:
在API管理页面,点击“创建”或类似的按钮来生成新的API密钥。
- 指定密钥名称: 为你的API密钥指定一个具有描述性的名称,例如“量化交易机器人”、“数据分析脚本”等。这有助于你区分不同的API密钥及其用途。
-
设置权限:
这是最关键的一步。你需要根据你的应用程序的需求,仔细选择API密钥的权限。火币提供的常见权限包括:
- 读取(Read): 允许你的应用程序获取市场数据,如价格、交易量、订单簿信息等。这是进行数据分析、构建交易策略的基础权限。
- 交易(Trade): 允许你的应用程序下单、取消订单、查询订单状态等。这是进行程序化交易的必要权限。
- 提币(Withdraw): 允许你的应用程序从你的火币账户中提币。 请谨慎授予此权限,除非你的应用程序确实需要自动提币功能。
- 其他权限: 火币可能提供其他类型的权限,例如杠杆交易权限、合约交易权限等。请根据你的具体需求进行选择。
- IP地址限制(可选): 为了增加安全性,你可以限制API密钥只能从特定的IP地址访问。这可以防止API密钥被盗用后,黑客从其他IP地址访问你的账户。
-
获取API Key 和 Secret Key:
创建完成后,你将立即获得API Key和Secret Key。
- API Key(也称为Public Key): 用于标识你的应用程序,可以公开分享。
- Secret Key(也称为Private Key): 是访问你账户的最高凭证, 必须严格保密,切勿泄露给任何人。 Secret Key泄露可能导致你的账户资金被盗。
-
妥善保管Secret Key:
- 不要将Secret Key存储在不安全的地方: 避免将其存储在纯文本文件中、电子邮件中或公共代码仓库中。
- 使用环境变量或配置文件存储Secret Key: 将Secret Key存储在环境变量或加密的配置文件中,可以提高安全性。
- 定期更换API Key: 为了进一步提高安全性,建议定期更换API Key和Secret Key。
- 启用2FA: 务必为你的火币账户启用两步验证(2FA),即使API Key泄露,黑客也难以访问你的账户。
2. API 端点
火币 API 提供了一系列 RESTful 风格的端点,开发者可以通过这些端点访问和操作火币交易所的各种功能,包括市场数据查询、账户管理、交易下单等。准确理解和有效使用这些端点对于开发自动化交易程序、行情分析工具或其他集成应用至关重要。
-
公共数据 API:
-
GET /market/tickers
: 获取所有交易对的最新ticker信息。Ticker信息包含交易对的最新成交价、最高价、最低价、成交量等关键数据,用于快速了解市场概况。 -
GET /market/detail/merged?symbol={symbol}
: 获取指定交易对的聚合行情,该行情是对多个深度档位数据合并后的结果,更易于分析市场深度和流动性。symbol
需要替换成实际的交易对名称,例如btcusdt
(比特币/USDT)。 -
GET /market/depth?symbol={symbol}&depth={depth}&type={type}
: 获取指定交易对的深度数据,即买单和卖单的挂单价格和数量。symbol
代表交易对,depth
(深度) 指返回的挂单档位数量,如5, 10, 20,数值越大,返回的数据越多;type
(深度类型) 用于指定深度数据的聚合级别,例如step0
,step1
,step2
,step3
,step4
,step5
等,数值越大,聚合程度越高,数据量越小。选择合适的深度类型可以有效控制数据量和精度。 -
GET /market/history/kline?symbol={symbol}&period={period}&size={size}
: 获取指定交易对的历史K线数据。K线图是技术分析的重要工具,用于分析价格走势和预测未来趋势。symbol
代表交易对,period
(周期) 指定K线的时间周期,如1min
(1分钟),5min
(5分钟),15min
(15分钟),30min
(30分钟),60min
(1小时),1day
(1天),1mon
(1月),1week
(1周),1year
(1年);size
(数据条数) 指定返回的K线数量,最大不超过2000。
-
-
账户 API:
-
GET /v1/account/accounts
: 获取用户所有账户的信息,包括现货账户、合约账户等。 -
GET /v1/account/accounts/{account-id}/balance
: 获取指定账户的余额信息。{account-id}
需要替换成实际的账户 ID,每个账户都有唯一的ID。余额信息包括可用余额、冻结余额等。
-
-
交易 API:
-
POST /v1/order/orders/place
: 下单。该接口用于创建新的交易订单,需要指定交易对、交易方向(买入/卖出)、订单类型(市价单/限价单)、价格和数量等参数。 -
GET /v1/order/orders/{order-id}
: 查询订单详情。{order-id}
需要替换成实际的订单 ID,用于查询指定订单的详细信息,包括订单状态、成交价格、成交数量等。 -
POST /v1/order/orders/{order-id}/submitcancel
: 撤销订单。{order-id}
需要替换成实际的订单 ID,用于取消尚未完全成交的订单。 -
POST /v1/order/orders/batchcancel
: 批量撤销订单。该接口允许一次性撤销多个订单,提高交易效率。
-
更多关于端点参数、请求方法、返回数据格式以及错误代码等详细信息,请务必参考火币官方 API 文档。开发者应仔细阅读文档,了解每个端点的具体用法和限制,以便更好地开发和维护应用程序。
3. API 请求构造
与火币 API 的交互需要构造符合规范的 HTTP 请求。以下示例展示了如何使用 Python 的
requests
库发送经过签名的 API 请求,并详细解释了签名生成过程和请求参数的构建。
requests
库是 Python 中常用的 HTTP 客户端库,可以使用
pip install requests
进行安装。 下面的代码片段展示了如何使用该库进行 API 请求的构造和发送。你需要替换示例中的
access_key
,
secret_key
和相应的 API 端点地址。
import requests
import hashlib
import hmac
import base64
import time
import urllib.parse
import datetime
import
def generate_signature(method, url, params, secret_key, timestamp):
"""
生成 API 请求签名,这是确保请求安全的关键步骤。
签名算法基于 HMAC-SHA256,涉及对请求方法、域名、路径和参数的组合进行哈希运算。
"""
host_url = 'api.huobi.pro' # 火币 API 的主域名。 国内用户请务必确认并替换为可用的API域名,例如:api.huobi.vn
host = urllib.parse.urlparse(host_url).netloc # 从 URL 中提取域名部分
request_path = urllib.parse.urlparse(url).path # 从 URL 中提取请求路径
# 对参数进行排序,确保签名的一致性
sorted_params = sorted(params.items(), key=lambda d: d[0], reverse=False)
# 将排序后的参数转换为 URL 编码的字符串
encode_params = urllib.parse.urlencode(sorted_params)
# 构建用于签名的 payload 字符串,包括请求方法、域名、请求路径和编码后的参数
payload = [method, host, request_path, encode_params, timestamp]
payload = '\n'.join(payload)
# 使用 HMAC-SHA256 算法生成签名
sha256_hmac = hmac.new(secret_key.encode('utf-8'), payload.encode('utf-8'), digestmod=hashlib.sha256)
# 将签名进行 Base64 编码
signature = base64.b64encode(sha256_hmac.digest()).decode()
return signature
generate_signature
函数负责生成请求签名。 签名生成的关键在于使用你的
secret_key
对请求的某些部分进行加密,从而验证请求的来源。 确保你的
secret_key
安全,切勿泄露。
def send_signed_request(url, method, access_key, secret_key, params=None, data=None):
"""
发送带签名的 API 请求。 此函数处理时间戳的生成、签名的添加,以及实际的 HTTP 请求。
"""
timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S') # 生成 UTC 时间戳,格式为 YYYY-MM-DDTHH:MM:SS
params['AccessKeyId'] = access_key # 添加 AccessKeyId 到请求参数
params['SignatureMethod'] = 'HmacSHA256' # 指定签名方法
params['SignatureVersion'] = '2' # 指定签名版本
params['Timestamp'] = timestamp # 添加时间戳到请求参数
# 生成签名
signature = generate_signature(method, url, params, secret_key, timestamp)
params['Signature'] = signature # 将签名添加到请求参数
try:
if method == 'GET':
# 发送 GET 请求
response = requests.get(url, params=params)
elif method == 'POST':
# 发送 POST 请求,并设置 Content-Type 为 application/
headers = {'Content-Type': 'application/'}
response = requests.post(url, params=params, data=.dumps(data), headers=headers)
else:
raise ValueError('Unsupported HTTP method')
response.raise_for_status() # 检查 HTTP 状态码,如果不是 200,则抛出异常
return response.() # 将响应内容解析为 JSON 格式并返回
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
return None
send_signed_request
函数负责构建并发送实际的 HTTP 请求。 它会添加必要的身份验证参数,生成签名,并处理不同类型的 HTTP 方法(GET 和 POST)。 对于 POST 请求,它还会设置
Content-Type
头部为
application/
,并使用
.dumps
将数据序列化为 JSON 字符串。
替换成你的 API Key 和 Secret Key
为了安全地访问和操作你的加密货币账户,你需要替换以下占位符为你个人的API Key和Secret Key。请务必妥善保管这些密钥,避免泄露给他人,因为它们提供了访问你账户的权限。
ACCESS_KEY = "YOUR_ACCESS_KEY"
是你的访问密钥,用于标识你的身份。每个平台提供的访问密钥格式可能有所不同,通常是一串由字母和数字组成的字符串。
SECRET_KEY = "YOUR_SECRET_KEY"
是你的私密密钥,用于对请求进行签名,确保请求的完整性和安全性。私密密钥是高度敏感的信息,绝对不能公开分享或存储在不安全的地方。
ACCOUNT_ID = "YOUR_ACCOUNT_ID"
是你的账户ID,用于指定你希望操作的账户。在进行交易或查询余额等操作时,需要提供账户ID。请注意,你需要先从交易平台获取你的账户ID,通常可以在账户设置或API文档中找到。不同的交易所或平台获取账户ID的方式不同,请参考对应平台的文档说明。在配置完这些密钥后,你就可以使用API来自动化你的交易策略或进行其他与加密货币相关的操作了。务必谨慎操作,仔细阅读API文档,避免因误操作导致资金损失。
获取账户余额
为了查询特定账户的余额,你需要构造一个API请求。以下代码展示了如何使用火币交易所的API来获取指定账户ID的余额信息。
定义API端点URL。URL中需要包含
ACCOUNT_ID
,这是一个占位符,需要替换成你想要查询的实际账户ID。格式化字符串用于构建完整的URL。
url = "https://api.huobi.pro/v1/account/accounts/{}/balance".format(ACCOUNT_ID)
接下来,创建一个字典
params
来存储请求参数。在这个例子中,我们只需要
account-id
,它也需要设置为你想要查询的账户ID。确保
ACCOUNT_ID
变量已经被正确赋值。
params = {}
params['account-id'] = ACCOUNT_ID
现在,可以使用
send_signed_request
函数来发送经过签名的API请求。这个函数接受URL、HTTP方法(这里是'GET')、你的访问密钥(
ACCESS_KEY
)、你的秘密密钥(
SECRET_KEY
)以及包含参数的字典作为参数。签名过程是安全地验证你的身份并确保请求没有被篡改的关键步骤。
try:
response_data = send_signed_request(url, 'GET', ACCESS_KEY, SECRET_KEY, params=params)
print(response_data)
send_signed_request
函数返回的数据(
response_data
)通常是JSON格式的字符串,你需要解析它以获取账户余额信息。这通常涉及使用JSON解析器将字符串转换为Python字典或对象,然后访问相应的键来提取余额信息。
为了处理潜在的错误,我们使用
try...except
块。如果请求失败(例如,网络连接问题或API错误),将捕获
requests.exceptions.RequestException
异常,并打印错误消息。如果发生任何其他异常(例如,无效的账户ID或签名错误),将捕获通用的
Exception
异常,并打印相应的错误消息。
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except Exception as e:
print(f"发生错误: {e}")
请务必替换
ACCOUNT_ID
、
ACCESS_KEY
和
SECRET_KEY
为你自己的实际值。 同时,确保你的API密钥具有足够的权限来查询账户余额。 权限不足可能导致请求失败。
下单示例
endpoint = "/v1/order/orders/place"
url = "https://api.huobi.pro" + endpoint
params = {}
data = {
"account-id": ACCOUNT_ID,
"amount": "0.01",
"price": "10000",
"symbol": "btcusdt",
"type": "buy-limit" ,
"source": "api"
}
try:
responsedata = sendsignedrequest(url, 'POST', ACCESSKEY, SECRET_KEY, params=params, data=data)
print(response_data)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except Exception as e:
print(f"发生错误: {e}")
代码解释:
-
generate_signature()
函数: 用于生成符合火币API安全要求的请求签名。 火币 API 采用 HMAC-SHA256 算法,这是一种基于哈希的消息认证码,能够有效验证请求的完整性和身份。 该函数接受多种关键参数:HTTP 请求方法(如 GET 或 POST)、请求的完整 URL、包含查询参数的字典、用户的 Secret Key(API 密钥的重要组成部分)以及当前时间戳。 函数内部,首先对请求参数进行字典排序,确保一致性,因为参数顺序会影响签名结果。 然后,将这些排序后的参数连接成字符串,并使用 Secret Key 对此字符串进行 HMAC-SHA256 哈希运算。 最终生成的签名字符串是经过 Base64 编码的哈希值,该值附加到请求中,作为验证请求来源的凭证。 正确实施签名逻辑是成功调用火币 API 的关键。 -
send_signed_request()
函数: 负责构建并发送经过签名的 API 请求。 它接收的参数包括请求 URL、HTTP 方法、API Key (用于标识用户身份)、Secret Key (用于生成签名)、请求参数 (如查询参数) 和请求数据 (用于 POST 请求,例如下单数据)。 函数首先生成一个 Unix 时间戳,表示请求的发送时间。 随后,它将 API Key、签名方法("HmacSHA256")和签名版本("2")添加到请求参数字典中。 接下来,调用generate_signature()
函数,使用接收到的所有参数生成最终的签名。 生成的签名也会添加到请求参数中。 使用 Python 的requests
库发送 HTTP 请求。如果请求方法是 POST,则将数据作为 JSON 格式发送;如果是 GET,则将请求参数附加到 URL。 函数会检查 HTTP 状态码,如果状态码不是 200,则表示请求失败,并抛出异常。 如果请求成功,则解析 API 响应的 JSON 数据并返回。 -
主程序:
提供了一个使用
send_signed_request()
函数的实际示例,演示了如何获取账户余额和进行下单操作。 在运行此部分代码之前,务必将YOUR_ACCESS_KEY
、YOUR_SECRET_KEY
和YOUR_ACCOUNT_ID
替换为你在火币交易所注册账户后获得的真实 API 密钥和账户 ID。 ACCESS_KEY 用于标识你的账户,SECRET_KEY 用于生成请求签名,ACCOUNT_ID 是你的账户唯一标识。 获取账户余额部分展示了如何调用send_signed_request()
函数并解析返回的 JSON 数据。 下单部分的代码默认被注释,因为下单操作涉及真金白银,需要谨慎操作。在取消注释并运行下单代码之前,请务必详细了解火币的交易规则和 API 文档,并使用测试账户进行充分的测试。 需要注意的是,交易参数(例如交易对、交易类型、交易数量和价格)必须符合火币 API 的规范。
重要的注意事项:
- 签名算法: 火币 API 的签名算法较为复杂,涉及消息的构建、参数的排序和加密等多个步骤。请务必仔细阅读官方文档,理解签名的生成过程,并使用官方提供的示例代码进行验证。确保你的签名实现与火币 API 服务器的预期一致,否则会导致请求失败。同时,注意不同的API接口可能采用不同的签名方式,请区分对待。
- 时间戳: 时间戳必须是 UTC 时间,精确到毫秒级别,并且与服务器时间相差不超过 5 分钟。建议使用网络时间协议(NTP)服务器同步本地时间,以确保时间戳的准确性。时间戳格式应为 Unix 时间戳,即自 1970 年 1 月 1 日 00:00:00 UTC 起至现在的总秒数。
- 参数排序: 签名时需要严格按照火币 API 官方文档规定的顺序对所有参与签名的参数进行排序。错误的参数顺序会导致签名验证失败。参数排序通常基于参数名称的字母顺序,请务必核对。
- 错误处理: 请务必全面地处理 API 请求可能出现的各种错误。除了常见的网络错误和签名错误外,还需要处理诸如 HTTP 状态码错误(例如 400 错误请求、403 禁止访问、429 请求过多等)、权限错误(API Key 权限不足)以及火币 API 返回的特定错误代码。针对不同的错误类型,采取相应的重试机制或报警措施。
- 速率限制: 火币 API 针对不同的接口和用户级别设置了速率限制,以防止滥用。请仔细阅读火币 API 的速率限制文档,了解各个接口的请求频率上限。如果超过速率限制,API 将返回错误,需要等待一段时间后才能再次发送请求。建议使用队列或令牌桶算法来控制请求发送的频率,避免触发速率限制。
- 安全性: 请务必妥善保管你的 API Key 和 Secret Key,绝对不要泄露给任何第三方。API Key 用于标识你的身份,Secret Key 用于生成签名,泄露 Secret Key 将导致你的账户面临安全风险。建议使用环境变量来安全地存储 API 密钥,而不是硬编码在代码中。还可以考虑使用 IP 地址白名单,限制 API Key 的访问来源。定期更换 API Key 和 Secret Key 也是一种增强安全性的手段。
- 域名: api.huobi.pro 为常用域名,是访问火币 API 的主要入口。如果你的网络环境访问此域名不稳定或速度较慢,可以尝试替换为火币官方提供的其他备用域名,例如 api-aws.huobi.pro 或 api-hk.huobi.pro。选择延迟最低的域名可以提高 API 请求的响应速度。注意区分现货 API 域名和合约 API 域名,不要混用。
4. 错误处理
火币 API 通过返回特定的错误码来告知开发者请求的处理结果。这些错误码是判断 API 请求成功与否的关键依据。开发者应当仔细检查响应中的错误码,以便及时发现并解决问题,确保交易和数据获取的可靠性。针对不同的错误码,应采取相应的处理措施,例如重新组织请求、调整参数或稍后重试。
-
400
: 请求参数错误 。此错误通常表示客户端发送的请求中包含无效的参数,例如参数类型错误、缺少必选参数或参数值超出允许范围。开发者应仔细检查请求参数,并根据 API 文档的规范进行修正。 -
401
: 认证失败 。此错误表明客户端提供的身份验证信息(例如 API 密钥)无效或已过期,无法通过火币服务器的验证。开发者需要检查 API 密钥是否正确配置,并确保证书有效且未被吊销。可能需要重新生成或更新 API 密钥。 -
429
: 超过速率限制 。火币 API 为了保护服务器资源和防止滥用,对每个 API 密钥设置了请求频率限制。当客户端在短时间内发送过多请求时,会触发此错误。开发者应实施速率限制策略,例如使用队列或延迟函数来控制请求频率。可考虑使用指数退避算法进行重试。 -
500
: 服务器内部错误 。此错误表示火币服务器在处理请求时遇到了意外问题,例如程序崩溃或数据库连接失败。这通常不是客户端可以解决的问题。开发者应该稍后重试请求,并关注火币官方公告,了解是否有服务器维护或故障通知。
为了获得更全面的错误码信息以及针对每种错误码的详细处理建议,请务必查阅最新的火币官方 API 文档。官方文档会提供详细的错误码列表、错误描述以及推荐的解决方案,帮助开发者更好地理解和解决 API 使用过程中遇到的问题。特别需要关注错误码的详细描述,以便更准确地定位问题原因。
5. 总结
使用火币 API 可以让你程序化地访问交易所的功能,实现自动化交易、数据分析等应用。 本指南介绍了 API 密钥获取、API 端点、API 请求构造和错误处理等基本概念。 希望本指南能够帮助你快速上手火币 API。 请务必仔细阅读火币官方 API 文档,了解更多详细信息。