如何使用Upbit API接口进行交易
1. 概述
Upbit作为韩国首屈一指的数字资产交易平台,为用户提供了功能强大的应用程序编程接口(API)。该API套件赋予开发者和高级交易者通过代码自动访问实时市场数据、精确管理个人账户以及高效执行交易的能力。本文旨在提供一份详尽的Upbit API接口使用指南,涵盖从API密钥的申请与管理到常用API端点的调用以及开发过程中需要注意的关键事项。
Upbit API支持多种功能,包括但不限于:
- 实时市场数据查询: 获取最新的交易价格、成交量、订单簿深度等关键市场信息。
- 账户管理: 查询账户余额、交易历史、未完成订单等账户信息。
- 订单管理: 提交、修改、取消订单,实现自动化交易策略。
- WebSocket支持: 通过WebSocket协议接收实时市场数据更新,降低延迟。
通过掌握Upbit API,用户可以构建个性化的交易工具、量化交易策略以及自动化的交易系统,从而提升交易效率和盈利潜力。
2. 准备工作:获取API密钥
在使用Upbit API之前,一个有效的Upbit账户和与之关联的API密钥是必不可少的。API密钥由两部分组成: Access Key 和 Secret Key 。Access Key类似于用户名,用于标识你的账户,方便Upbit识别你的身份。Secret Key则相当于密码,用于对你的请求进行加密签名,验证请求的合法性。切记,Secret Key极其重要,必须妥善保管,切勿以任何形式泄露给他人,包括但不限于截图、复制粘贴至公共平台、发送给他人等。一旦泄露,他人可能利用你的API密钥盗取资金或进行其他恶意操作。
获取API密钥的详细步骤如下:
- 登录Upbit账户: 通过浏览器访问Upbit官方网站 (通常是 upbit.com) 并使用你的账户名和密码登录。确保你访问的是官方网站,谨防钓鱼网站,仔细检查网址的拼写和HTTPS证书。
- 访问API密钥管理页面: 成功登录后,在账户设置或个人中心内寻找“API开放”、“API管理”、“API密钥”或类似的选项,点击进入API密钥管理页面。不同时期Upbit的页面布局可能有所不同,如果找不到,可以尝试在搜索栏中输入“API”进行搜索。
- 创建API密钥: 在API密钥管理页面,找到并点击“新建API密钥”、“创建新密钥”或者类似的按钮。该按钮通常位于页面的右上角或底部。
- 设置权限: Upbit提供了精细化的权限控制机制,允许你为每个API密钥设置不同的权限范围,例如:查询账户余额、获取交易行情、下单交易、查询订单状态、提币等。务必根据你的实际需求, 仅勾选必要的权限。 例如,如果你的程序只需要进行交易操作,那么只需要赋予交易权限 (通常是“交易”或“Trade”相关的权限) 即可。 强烈建议不要开启提币权限 (通常是“提现”或“Withdraw”相关的权限),以最大程度地保护你的资产安全。 避免不必要的风险,即使你的代码被恶意攻击,攻击者也无法通过API密钥提取你的资金。
- 获取Access Key和Secret Key: 成功创建API密钥后,系统会生成Access Key和Secret Key。Access Key会直接显示在页面上,而Secret Key 只会显示一次 。务必立即将Secret Key复制并保存在安全的地方,例如使用密码管理器进行加密存储。 请勿将Secret Key存储在明文文件中或直接写入代码中。 如果Secret Key遗失,你将无法找回,只能重新生成新的API密钥,并更新所有使用该密钥的应用程序。重新生成API密钥后,旧的API密钥将失效。
3. API接口概览
Upbit API提供了全面的接口套件,旨在满足各类交易者和开发者的多样化需求。这些接口涵盖了市场数据查询、账户管理以及订单处理等关键功能。以下是一些常用的API接口及其详细说明:
-
行情查询:
-
GET /v1/ticker
: 用于检索指定交易对(市场)的实时价格信息。返回数据包括最新成交价、最高价、最低价、交易量等关键指标,帮助用户快速了解市场动态。 -
GET /v1/trades/ticks
: 提供对特定交易对最近成交历史记录的查询功能。返回结果包含成交时间、成交价格、成交数量以及买卖方向等详细信息,适用于高频交易和趋势分析。 -
GET /v1/candles/minutes/{unit}
: 允许用户获取指定交易对的分钟级别K线图数据。{unit}
参数用于指定K线的时间周期,例如1
表示1分钟K线,5
表示5分钟K线。该接口返回开盘价、最高价、最低价、收盘价和成交量等数据,方便技术分析。 -
GET /v1/candles/days
: 提供指定交易对的日K线数据查询。返回每日的开盘价、最高价、最低价、收盘价和成交量,适用于中长期趋势分析。 -
GET /v1/orderbook
: 查询指定交易对的实时订单簿信息。订单簿包含买单和卖单的挂单价格和数量,反映了市场的买卖力量对比,是进行交易决策的重要参考依据。
-
-
账户管理:
-
GET /v1/accounts
: 用于查询用户的账户余额信息。返回结果包括各个币种的可用余额、冻结余额等,方便用户了解账户资产状况。
-
-
订单管理:
-
POST /v1/orders
: 用于提交新的交易订单。用户可以通过该接口指定交易对、订单类型(市价单、限价单等)、买卖方向和订单数量等参数,实现交易操作。 -
GET /v1/order
: 允许用户查询指定订单的详细信息。通过订单ID,可以获取订单的状态、成交价格、成交数量、下单时间等信息,方便用户跟踪订单执行情况。 -
DELETE /v1/order
: 用于取消尚未完全成交的订单。用户需要提供订单ID来指定要取消的订单。 -
GET /v1/orders/chance
: 查询指定交易对的下单限制。该接口返回的信息包括最小下单数量、最大下单数量、价格精度等,有助于用户避免下单错误。 -
GET /v1/orders
: 该接口具有双重功能:既可以查询未成交订单列表,也可以查询历史订单列表。用户可以通过不同的参数设置来选择查询未完成的订单或已完成的订单记录。
-
4. API调用示例(Python)
以下是一个使用Python调用Upbit API进行限价买单交易的示例代码。此示例展示了如何构建请求头、生成访问令牌以及发送实际的交易请求。务必仔细阅读Upbit官方API文档,了解所有参数的含义和用法,并根据自己的实际需求进行调整。
import jwt
import uuid
import hashlib
import requests
# 替换成你自己的Access Key和Secret Key,务必妥善保管,避免泄露
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
# 市场代码,例如"KRW-BTC"代表韩元交易比特币市场
market = "KRW-BTC"
# 订单类型,"limit"代表限价单
ord_type = "limit"
# 买/卖方向,"bid"代表买入
side = "bid"
# 下单数量
volume = 0.001
# 订单价格
price = 50000000
# 生成UUID作为请求的唯一标识符,避免重放攻击
identifier = str(uuid.uuid4())
# 构建Payload
payload = {
"access_key": access_key,
"nonce": identifier, # 使用UUID作为nonce
"query": {
"market": market,
"side": side,
"volume": str(volume), # 数量需要转换为字符串
"price": str(price), # 价格需要转换为字符串
"ord_type": ord_type
}
}
# 对query参数进行SHA512哈希
query_hash = hashlib.sha512(str(payload["query"]).encode('utf-8')).hexdigest()
payload["query_hash"] = query_hash
payload["query_hash_alg"] = "SHA512"
# 生成JWT (JSON Web Token)
jwt_token = jwt.encode(payload, secret_key, algorithm="HS256")
authorize_token = f"Bearer {jwt_token}"
# API endpoint for placing an order
url = "https://api.upbit.com/v1/orders"
# 构建请求头
headers = {"Authorization": authorize_token}
# 发送POST请求
try:
response = requests.post(url, headers=headers, =payload["query"])
response.raise_for_status() # 如果响应状态码不是200,则抛出HTTPError异常
print(response.()) # 打印响应内容
except requests.exceptions.HTTPError as e:
print(f"HTTP error: {e}") # 打印HTTP错误信息
print(response.())
except Exception as e:
print(f"An error occurred: {e}") # 打印其他异常信息
注意:
- 在实际应用中,务必使用更安全的密钥管理方式,避免将Access Key和Secret Key直接硬编码在代码中。可以使用环境变量或者专门的密钥管理服务。
- 错误处理至关重要。应该对API返回的各种错误代码进行处理,以便更好地了解订单状态和潜在问题。
- nonce值必须是唯一的,建议使用UUID来生成。
-
确保安装了必要的Python库,如
jwt
,uuid
,hashlib
和requests
。 - 代码示例仅供参考,请根据实际情况修改。
- 交易涉及风险,请谨慎操作。
替换成你的 Access Key 和 Secret Key
使用你的 Upbit API 密钥替换以下占位符。 确保密钥的安全存储,避免泄露。
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
get_token()
函数生成一个 JWT (JSON Web Token) 用于 API 身份验证。
import jwt
import uuid
import hashlib
import requests
def get_token():
"""
生成用于身份验证的 JWT 令牌。
"""
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()), # 使用 UUID 生成唯一 nonce 值
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
authorization_token = 'Bearer {}'.format(jwt_token)
return authorization_token
place_order()
函数用于在 Upbit 交易所下单。 该函数封装了订单创建所需的 API 调用。
def place_order(market, side, volume, price, order_type):
"""
在 Upbit 交易所下单。
Args:
market (str): 市场代码,例如 "KRW-BTC"。
side (str): 订单类型,"bid"(买入)或 "ask"(卖出)。
volume (float): 订单数量。
price (float): 订单价格。
order_type (str): 订单类型,"limit"(限价单)或 "market"(市价单)。
Returns:
requests.Response: 包含订单信息的响应对象。
Raises:
requests.exceptions.RequestException: 如果 API 请求失败。
"""
url = "https://api.upbit.com/v1/orders"
query = {
'market': market,
'side': side,
'volume': volume,
'price': price,
'ord_type': order_type,
}
query_string = "&".join([f"{k}={v}" for k, v in query.items()]).encode()
# 使用 SHA512 对查询字符串进行哈希处理,以提高安全性
m = hashlib.sha512()
m.update(query_string)
query_hash = m.hexdigest()
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()),
'query_hash': query_hash,
'query_hash_alg': 'SHA512',
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
authorization_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorization_token}
try:
response = requests.post(url, params=query, headers=headers)
response.raise_for_status() # 检查响应状态码,如果不是200则抛出异常
return response.() # 返回 JSON 格式的响应数据
except requests.exceptions.RequestException as e:
print(f"API 请求失败:{e}")
return None
示例:以限价单买入BTC
market = "KRW-BTC"
# 市场代码,指定交易对为韩元(KRW)交易的比特币(BTC)。这意味着你将在韩国交易所使用韩元购买比特币。
side = "bid"
# 交易方向,指定为“bid”,表示买入操作。 在交易术语中,“bid” 通常指买入请求,而 “ask” 指卖出请求。
volume = "0.0001"
# 购买数量,单位为BTC,指定购买0.0001个比特币。 务必注意交易所的最小交易单位限制,确保购买数量符合要求。
price = "70000000"
# 价格,单位为韩元(KRW),指定价格为7000万韩元。 这是一个限价单,只有当市场价格达到或低于7000万韩元时,交易才会执行。
order_type = "limit"
# 订单类型,指定为“limit”,表示限价单。 限价单允许你指定期望的买入价格,只有当市场价格达到该价格时才会成交。如果市场价格高于你指定的价格,订单将保持挂单状态,直到价格下跌或被取消。
order_result = place_order(market, side, volume, price, order_type)
# 调用 `place_order` 函数,传递市场代码、交易方向、购买数量、指定价格和订单类型作为参数,发起限价买入比特币的请求。 `place_order` 函数是与交易所API交互的关键步骤,负责将订单信息发送到交易所并等待执行结果。你需要根据你使用的交易所API来实现这个函数。
print(order_result)
# 打印订单结果。`order_result` 变量通常包含交易所返回的订单执行情况信息,例如订单ID、成交价格、成交数量、订单状态等。 通过打印订单结果,你可以验证订单是否成功提交,以及获取订单的详细信息,方便后续跟踪和管理。
示例:查询账户余额
为了获取账户余额,我们需要向交易所的API发送请求。以下示例展示了如何使用Python和Upbit交易所的API来查询账户余额。定义一个函数
get_account_balance()
,该函数负责构建请求并获取响应。
def get_account_balance():
url = "https://api.upbit.com/v1/accounts"
headers = {"Authorization": get_token()}
res = requests.get(url, headers=headers)
return res.()
上述代码中,
url
变量定义了Upbit API的账户信息端点。
headers
包含了身份验证信息,这里使用
get_token()
函数获取授权令牌。
requests.get()
函数向API发送GET请求,并将响应存储在
res
变量中。使用
res.()
方法将JSON格式的响应数据解析为Python字典,以便后续使用。
请务必替换
get_token()
函数为你实际的令牌获取逻辑。通常,这涉及使用API密钥和密钥来生成符合交易所要求的签名令牌,例如JWT (JSON Web Token)。Upbit API可能要求使用特定的签名算法(例如HMAC-SHA512)对请求进行签名。
获得账户余额后,可以将其打印出来进行查看:
account_balance = get_account_balance()
print(account_balance)
account_balance
变量现在包含了账户余额信息,通常是一个包含各种货币余额的列表。可以遍历这个列表,并提取出特定货币的余额信息。例如,如果想查看KRW(韩元)的余额,可以检查返回的JSON结构,并找到对应的字段。
请注意,API调用可能会受到速率限制。如果频繁调用API,可能会被交易所限制访问。为了避免这种情况,请合理控制API调用频率,并实现适当的错误处理和重试机制。
代码说明:
-
导入必要的库:
jwt
(用于JSON Web Token的生成和验证)、uuid
(用于生成唯一ID)、hashlib
(用于哈希算法,特别是SHA512)、requests
(用于发送HTTP请求)。这些库是Python进行Upbit API交互的基础。 -
替换API密钥:
将
YOUR_ACCESS_KEY
和YOUR_SECRET_KEY
替换成你自己的Upbit账户API密钥。YOUR_ACCESS_KEY
是公开的,而YOUR_SECRET_KEY
必须安全保存,切勿泄露。这两个密钥用于生成JWT,验证你的身份并授权访问Upbit API。 -
get_token()
函数: 用于生成JSON Web Token(JWT)。JWT是一种行业标准,用于安全地将信息作为JSON对象在各方之间传输。在Upbit API中,JWT用于身份验证和授权。该函数使用你的Access Key、Secret Key以及请求参数的哈希值来生成JWT。 -
place_order()
函数: 用于下单。它接受以下参数:market
(市场代码,例如 "KRW-BTC" 表示韩元交易比特币)、side
(订单类型,"bid" 表示买入,"ask" 表示卖出)、volume
(数量,要交易的数字货币数量)、price
(价格,订单的价格)、和ord_type
(订单类型,例如 "limit" 限价单, "market" 市价单)。该函数会将这些参数构建成一个POST请求,发送到Upbit API服务器的订单接口。 - 构建请求: 根据Upbit API的安全要求,所有请求参数都需要进行SHA512哈希处理,并且将哈希值嵌入到JWT token中。这一步是为了防止请求被篡改,保证交易的安全性。哈希算法会根据请求参数生成唯一的指纹,任何微小的改动都会导致哈希值发生变化。同时,请求参数中还包含一个UUID,作为请求的唯一标识符,防止重放攻击。
-
发送请求:
使用
requests.post()
方法发送POST请求到Upbit API服务器的指定endpoint。请求头必须包含 "Authorization" 字段,其值为 "Bearer " 加上生成的JWT token。这样Upbit API服务器才能验证请求的身份,并根据权限进行处理。 - 处理响应: API服务器会返回一个JSON格式的响应,其中包含订单的详细信息,例如订单ID、订单状态、交易数量等。你需要解析这个JSON响应,并根据返回的状态码和内容来判断订单是否成功执行。常见的HTTP状态码包括201 (Created) 表示成功创建订单,400 (Bad Request) 表示请求参数错误,401 (Unauthorized) 表示未授权,500 (Internal Server Error) 表示服务器内部错误。
-
get_account_balance()
函数: 用于查询你的Upbit账户余额。它会向Upbit API服务器发送一个GET请求,获取账户中所有币种的余额信息,包括可用余额、锁定余额等。API返回的JSON数据中包含了币种的代码(例如 "KRW", "BTC", "ETH")和对应的余额。你可以根据需要提取特定的币种余额信息。
注意:
- 重要提示: 此示例代码仅用于演示Upbit API的基本用法,旨在帮助开发者理解API调用流程。在实际的交易环境中,务必实现完善的错误处理和异常捕获机制,以应对网络波动、API服务不稳定或其他突发情况。
- API文档查阅: 请务必详细阅读Upbit官方提供的API文档,深入了解每个接口的参数要求、返回值结构、频率限制以及其他相关规定。掌握这些信息是成功对接Upbit API并进行有效交易的基础。
- 模拟环境测试: 在使用真实资金进行交易之前,强烈建议您先在Upbit提供的模拟交易环境中进行充分的测试。通过模拟交易,您可以熟悉API的使用方法,验证您的交易策略,并评估潜在的风险。
- 风险提示: 加密货币交易存在高风险,价格波动剧烈。请在充分了解市场风险的基础上,根据自身的风险承受能力进行谨慎操作。切勿投入超出您承受范围的资金。
5. 常见问题
- API调用频率限制: Upbit API 为了保障系统稳定性和公平性,对每个用户的 API 调用频率都设置了严格的限制。超出此限制,您的访问将会被暂时禁止。请务必仔细查阅 Upbit 官方 API 文档,其中详细列出了不同接口的频率限制标准。建议您在程序中实现相应的错误处理机制,当遇到频率限制错误时,进行适当的延迟或重试,避免被永久封禁。您可以考虑使用队列来管理API调用请求,以确保不超过限制。
- 权限问题: 调用 Upbit API 需要相应的权限。如果您尝试访问一个未经授权的 API 接口,系统将会返回错误响应,告知您权限不足。在创建 API 密钥时,请务必仔细核对您所需要的权限,并确保您的 API 密钥拥有调用该接口的必要权限。如果需要更高级别的权限,请联系 Upbit 官方进行申请。请注意,随意尝试调用未授权的接口可能会导致您的 API 密钥被禁用。
- 签名错误: 签名错误通常是由于 Access Key 和 Secret Key 配置不正确,或者请求参数有误导致的。Upbit API 使用 HMAC-SHA512 算法进行签名验证,以确保请求的安全性。请仔细检查您的 Access Key 和 Secret Key 是否正确,以及请求参数是否按照 Upbit API 文档的要求进行编码和排序。特别注意时间戳的准确性,以及编码格式是否为 UTF-8。如果仍然出现签名错误,请尝试重新生成 API 密钥,并仔细阅读 Upbit API 文档中的签名算法说明。
- 订单未成交: 当您提交的限价订单的价格与市场价格差距过大时,订单可能不会立即成交。为了提高订单成交的概率,您可以尝试调整您的订单价格,使其更接近当前的市场价格。另一种选择是使用市价单,市价单会以当前市场最优价格立即成交。请注意,市价单可能会以略高于您预期价格成交,尤其是在市场波动较大的情况下。同时,也需要考虑交易深度,如果交易深度不足,市价单可能会导致滑点。请谨慎选择适合您交易策略的订单类型。
6. 总结
通过Upbit API,你可以实现自动化交易、量化分析等高级交易策略。掌握Upbit API的使用方法,可以帮助你更高效地进行数字资产交易。但是,使用API交易需要一定的编程基础和风险意识。请在充分了解API文档和交易规则的基础上,谨慎操作。
7. 示例:获取K线数据
import requests
def get_candles(market, interval, count=200): """ 获取指定交易对和时间周期的K线数据。
该函数通过Upbit API获取历史K线数据,K线数据通常包含开盘价、收盘价、最高价、最低价和成交量等信息, 这些信息对于技术分析至关重要,可以帮助交易者识别趋势和潜在的交易机会。
Args:
market: 市场代码,指定要获取K线数据的交易对,例如 "KRW-BTC" 表示韩元-比特币交易对。
interval: K线类型,定义K线的时间周期。例如,"minutes/1" 表示1分钟K线,"minutes/5"表示5分钟K线,"days" 表示日K线。
Upbit API支持多种时间周期,包括分钟、小时、天、周和月。
count: 获取K线数量,指定要获取的历史K线数量,默认为200。 Upbit API允许的最大值为200。
Returns:
K线数据列表,返回一个包含K线数据的列表。 每个元素代表一个K线,通常包含时间戳、开盘价、收盘价、最高价、最低价和成交量等信息。
返回的数据格式取决于API的具体实现。
Raises:
requests.exceptions.RequestException: 当网络请求发生错误时抛出异常。
ValueError: 当从API返回的数据无法解析为JSON格式时抛出异常。
"""
url = f"https://api.upbit.com/v1/candles/{interval}"
querystring = {"market": market, "count": count}
response = requests.request("GET", url, params=querystring)
response.raise_for_status() # 检查请求是否成功,如果状态码不是200,则抛出HTTPError
return response.()
示例:获取KRW-BTC的1分钟K线数据
本示例展示如何使用API获取韩国交易所(KRW)中比特币(BTC)的1分钟K线数据。K线图,也称为蜡烛图,是技术分析中常用的工具,用于显示特定时间段内的开盘价、收盘价、最高价和最低价。通过分析K线图,交易者可以更好地理解市场情绪和价格趋势。
要获取KRW-BTC的1分钟K线数据,需要定义以下变量:
market = "KRW-BTC"
market
变量指定了要查询的市场,这里是KRW-BTC,表示在韩国交易所用韩元交易的比特币。
interval = "minutes/1"
interval
变量指定了K线的时间间隔,这里是"minutes/1",表示每分钟生成一根K线。其他常见的时间间隔包括"minutes/5"(5分钟K线)、"hours/1"(1小时K线)和"days/1"(日K线)。
接下来,使用
get_candles(market, interval)
函数获取K线数据。
candles = get_candles(market, interval)
get_candles()
函数接受
market
和
interval
作为参数,并返回包含K线数据的列表或数组。数据的具体格式取决于所使用的API接口,通常包含时间戳、开盘价、收盘价、最高价、最低价和成交量等信息。
使用
print(candles)
函数将获取到的K线数据打印到控制台。
print(candles)
通过分析打印出的
candles
数据,可以观察KRW-BTC市场在过去一段时间内的价格波动情况。例如,可以计算特定时间段内的平均价格、价格波动范围和交易量等指标,以便进行更深入的技术分析和交易决策。请注意,不同的API接口可能需要进行身份验证和授权才能访问数据,并且数据返回格式可能有所不同。仔细阅读API文档是成功获取K线数据的关键。
示例:获取KRW-BTC的日K线数据
interval = "days"
daily_candles = get_candles(market, interval)
print(daily_candles)
这段代码示例演示了如何利用API接口获取特定加密货币交易对的K线图数据,并将其打印到控制台。
interval = "days"
定义了获取K线数据的周期为"日",表示获取的是日K线数据。
get_candles(market, interval)
函数负责从指定的市场(例如韩国交易所,这里假定
market
变量已定义并赋值为
"KRW-BTC"
,表示韩元对比特币的交易对)获取对应周期的K线数据。 获取到的数据存储在
daily_candles
变量中。
print(daily_candles)
语句将获取到的K线数据打印输出,方便用户查看和分析。 请务必根据实际API文档和编程语言的SDK调整代码, market 参数需要替换为实际交易所和交易对的代码。 例如,如果使用的交易所需要特定的代码格式来表示KRW-BTC,则需要进行相应的调整。 根据所使用的API,返回的 K 线数据格式也可能有所不同,可能包含开盘价、收盘价、最高价、最低价、交易量等信息,以列表或字典等数据结构呈现。 你也可以根据自身需求修改
market
变量的值来获取不同的交易对数据,例如
"ETH-BTC"
表示以太坊对比特币的交易对,
"LTC-USDT"
表示莱特币对泰达币的交易对。 K线类型
interval
也可以修改为其他值,例如
"minutes"
表示分钟K线,
"hours"
表示小时K线,但需要确认API是否支持对应的时间周期。