Upbit API 交易指南
Upbit 作为韩国领先的加密货币交易所,提供了强大的 API (Application Programming Interface) 接口,允许开发者和交易者通过程序化方式进行交易、获取市场数据、管理账户等操作。 本文将深入探讨如何利用 Upbit API 进行交易,涵盖API密钥的获取、常用API接口的调用、以及交易策略的实现等方面。
1. 获取 Upbit API 密钥
要与 Upbit 交易所的 API 交互,必须首先获得有效的 API 密钥。 这些密钥是访问 Upbit 交易平台编程接口的凭证,允许您通过代码自动化执行交易、获取市场数据和其他操作。 API 密钥由两部分组成:一个
Access Key
(访问密钥) 和一个
Secret Key
(私钥)。
Access Key
用于标识您的账户,而
Secret Key
则用于对您的请求进行签名,确保请求的安全性。
至关重要的是,您必须极其谨慎地保管您的
Secret Key
,绝对不要将其泄露给任何第三方。 泄露
Secret Key
可能会导致您的账户被盗用或遭受其他安全风险。
获取 API 密钥的详细步骤如下:
- 登录 Upbit 账户: 访问 Upbit 官方网站 ( https://upbit.com/ ) 并使用您的用户名和密码登录您的账户。 如果您尚未拥有 Upbit 账户,您需要先注册一个账户并完成必要的身份验证流程。 这通常涉及到提供您的个人信息、上传身份证明文件,并可能需要进行人脸识别等验证步骤。
- 进入 API 管理页面: 成功登录后,导航到 API 密钥管理页面。 这个页面通常位于您的个人资料设置、账户设置或者类似的菜单选项中。 您可以查找诸如“API 密钥管理”、“API 访问”或类似的链接或按钮。 具体的位置可能会根据 Upbit 网站的界面更新而有所变化。
- 创建 API 密钥: 在 API 管理页面,找到并点击“创建 API 密钥”、“生成新密钥”或类似的按钮。 这将启动 API 密钥的生成过程。
- 设置 API 权限: 在创建 API 密钥的过程中,Upbit 会要求您配置 API 密钥的权限。 这些权限决定了该 API 密钥可以执行哪些操作。 对于交易目的,您必须启用 "交易" 权限,这将允许您使用 API 密钥进行买卖操作。 您可能还需要根据您的需求启用其他权限,例如 "查询" 权限(用于获取账户余额和交易历史)或 "行情" 权限(用于获取市场数据)。 务必谨慎选择 API 密钥的权限,避免授予不必要的权限。 授予过多的权限会增加安全风险,一旦 API 密钥泄露,攻击者可能会利用这些权限执行未经授权的操作。 例如,如果您只需要使用 API 密钥进行交易,则不要启用提现权限,以防止攻击者利用泄露的 API 密钥将您的资金转移到其他账户。
-
记录 API 密钥:
成功创建 API 密钥后,Upbit 将会生成您的
Access Key
和Secret Key
。 请立即将这两个密钥保存在安全的地方。Secret Key
只会显示一次,之后将无法再次查看。 如果您丢失了Secret Key
,您将需要重新生成新的 API 密钥。 建议您将 API 密钥保存在加密的密码管理器中,或者将其存储在安全的文件中并使用强密码进行保护。 避免将 API 密钥保存在容易被访问的地方,例如明文的文本文件、电子邮件或云存储服务中。 定期轮换 API 密钥也是一种良好的安全实践,可以降低密钥泄露带来的风险。
2. 理解 Upbit API 的基本概念
在使用 Upbit API 之前,透彻理解以下基本概念至关重要,它们构成了与 Upbit 交易所进行编程交互的基础:
- RESTful API: Upbit API 遵循 RESTful 架构原则,这是一种广泛使用的网络服务设计风格,利用 HTTP 协议进行客户端与服务器之间的通信。RESTful API 的优势在于其简单性、可扩展性和跨平台兼容性,允许开发者使用各种编程语言(如 Python、Java、JavaScript 等)以及工具(如 cURL、Postman 等)来调用 API,进行数据交换和操作执行。每个资源都通过唯一的 URL 进行标识,并使用 HTTP 方法(如 GET、POST、PUT、DELETE)来操作这些资源。
- 认证与授权: 所有 Upbit API 请求都必须经过严格的身份验证和授权,以确保用户账户安全和数据完整性。Upbit 采用 JWT (JSON Web Token) 作为身份验证机制。用户需要在 Upbit 平台上生成 Access Key 和 Secret Key,然后使用这两个密钥生成 JWT。生成的 JWT 必须包含在每个 API 请求的 Authorization Header 中,通常以 "Bearer " 开头。服务器会验证 JWT 的有效性,并根据 JWT 中包含的信息来判断用户的身份和权限,从而决定是否允许执行相应的操作。Access Key 类似于用户名,Secret Key 类似于密码,务必妥善保管,避免泄露。
-
请求方法 (HTTP Methods):
Upbit API 利用不同的 HTTP 请求方法,针对不同的操作类型。
GET
方法用于从服务器检索资源,例如获取市场行情、账户余额等。POST
方法用于向服务器提交数据,通常用于创建新的资源,例如创建订单、充值等。PUT
方法用于更新服务器上的现有资源。DELETE
方法用于删除服务器上的资源,例如取消订单。正确选择和使用 HTTP 方法是构建符合 RESTful 规范的 API 交互的关键。 -
请求参数:
API 请求通常需要携带参数,以便服务器能够正确理解客户端的需求并执行相应的操作。参数可以通过两种主要方式传递:URL 查询字符串和请求体 (RequestBody)。URL 查询字符串是将参数附加到 URL 后面,以
?
开头,多个参数之间使用&
分隔。例如,/ticker?markets=KRW-BTC,USDT-BTC
。请求体通常用于 POST、PUT 等需要提交数据的请求,参数以 JSON 格式或其他格式编码,并包含在 HTTP 请求的消息体中。选择哪种方式取决于参数的数量、复杂性和 API 的设计。 - 响应格式: Upbit API 的响应数据通常采用 JSON (JavaScript Object Notation) 格式。JSON 是一种轻量级的数据交换格式,易于阅读和解析,被广泛应用于 Web API 中。开发者需要使用相应的编程语言提供的 JSON 解析库,将 JSON 响应数据转换成程序可以处理的数据结构(如字典、列表等),然后从中提取所需的信息。
-
市场代码 (Market Codes):
Upbit 使用市场代码来唯一标识不同的交易对。市场代码通常由两个部分组成,分别是计价货币和标的货币,中间用
-
分隔。例如,KRW-BTC
表示以韩元 (KRW) 计价的比特币 (BTC) 市场,USDT-ETH
表示以泰达币 (USDT) 计价的以太坊 (ETH) 市场。在使用 API 进行交易或查询市场行情时,需要正确指定市场代码。 - 错误处理与状态码: 当 API 请求遇到问题时,Upbit 会返回包含错误代码和错误信息的 JSON 响应。HTTP 状态码也用于指示请求的结果。例如,200 表示请求成功,400 表示客户端请求错误,401 表示未授权,500 表示服务器内部错误。开发者应根据错误代码和状态码,进行相应的错误处理。常见的处理方式包括记录日志、重试请求、提示用户等。例如,如果收到 401 错误,应检查 Access Key 和 Secret Key 是否正确,JWT 是否有效。
3. 常用 Upbit API 接口
以下是一些常用的 Upbit API 接口,这些接口是与 Upbit 交易所进行程序化交互的关键。 了解并熟练使用这些接口,可以方便地进行账户管理、市场数据获取、交易执行和订单管理。
-
获取账户信息:
-
GET /v1/accounts
- 该接口用于获取用户在 Upbit 交易所的账户信息,包括每个币种的账户余额、可用余额、锁定余额等详细信息。 返回的数据将包括账户中所有资产的快照,可用于跟踪投资组合的表现。 通过分析返回的数据,用户可以清晰地了解其资金的分配情况,并据此调整交易策略。
-
-
获取市场信息:
-
GET /v1/market/all
- 该接口用于获取 Upbit 交易所支持的所有可交易市场的列表。 返回的信息包括每个市场的唯一市场代码(例如 "KRW-BTC" 表示韩元计价的比特币市场)、市场名称以及当前交易状态(例如 "active" 表示可交易, "paused" 表示暂停交易)。 此接口对于构建交易策略至关重要,因为它允许用户动态地了解哪些市场可以进行交易。
-
-
获取当前价格:
-
GET /v1/ticker
-
参数:
markets
(必选,市场代码列表,多个市场代码用逗号分隔,例如 "KRW-BTC,KRW-ETH") -
该接口用于获取指定市场的实时价格信息,包括最新成交价 (
trade_price
)、最高价 (high_price
)、最低价 (low_price
)、累积成交量 (acc_trade_volume
) 等。 可以一次性获取多个市场的价格信息,用逗号分隔。 通过分析这些实时数据,用户可以更好地把握市场动态,从而做出明智的交易决策。
-
-
获取最近成交历史:
-
GET /v1/trades/ticks
-
参数:
market
(必选,市场代码,例如 "KRW-BTC"),count
(可选,返回的成交数量,默认为 100,最大值为 200) - 该接口用于获取指定市场的最近成交历史记录,可以获取交易时间、成交价格和成交量等详细信息。 通过分析历史成交数据,用户可以了解市场的交易活跃程度和价格波动情况,从而为技术分析提供依据。 可以指定返回的成交数量,以便更好地控制数据量。
-
-
下单:
-
POST /v1/orders
-
参数:
market
(必选,市场代码,例如 "KRW-BTC"),side
(必选,买/卖方向,bid
表示买入,ask
表示卖出),volume
(可选,订单数量,仅限价单需要),price
(可选,指定价格,仅限价单需要),ord_type
(必选,订单类型,limit
表示限价单,price
表示市价买入,market
表示市价卖出) -
该接口用于提交订单,允许用户在 Upbit 交易所创建限价单或市价单。 使用
limit
订单类型时,需要指定订单数量和价格。 使用price
订单类型(市价买入)时,需要指定购买的总金额。 使用market
订单类型(市价卖出)时,需要指定卖出的数量。 正确设置订单参数是确保交易顺利执行的关键。
-
-
取消订单:
-
DELETE /v1/order
-
参数:
uuid
(必选,订单 UUID,可在下单后获得) 或identifier
(可选,用户自定义的订单标识,在下单时设置) - 该接口用于取消指定订单。 可以使用订单的 UUID 或者用户自定义的订单标识来指定需要取消的订单。 成功取消订单后,系统会将冻结的资金或加密货币返还到用户的账户中。 为了提高效率,建议在下单时设置用户自定义的订单标识。
-
-
查询订单信息:
-
GET /v1/order
-
参数:
uuid
(必选,订单 UUID) 或identifier
(可选,用户自定义的订单标识) - 该接口用于查询指定订单的详细信息,包括订单状态、订单类型、成交数量、成交均价等。 可以使用订单的 UUID 或者用户自定义的订单标识来指定需要查询的订单。 通过定期查询订单信息,用户可以及时了解订单的执行情况,并据此调整交易策略。
-
4. 使用 Python 调用 Upbit API 的示例
以下是一个使用 Python 语言调用 Upbit API 获取账户信息的示例。该示例演示了如何使用 Upbit API 提供的身份验证机制,并使用 Python 的
requests
库发送 HTTP 请求。
需要安装必要的 Python 库:
pip install pyjwt requests
代码如下:
import jwt
import uuid
import hashlib
from urllib.parse import urlencode
import requests
import
access_key = "YOUR_ACCESS_KEY" # 替换成您的 Access Key
secret_key = "YOUR_SECRET_KEY" # 替换成您的 Secret Key
def get_accounts():
"""获取账户信息"""
query = {
'access_key': access_key,
'nonce': str(uuid.uuid4()),
}
query_string = urlencode(query).encode()
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')
authorize_token = f'Bearer {jwt_token}'
headers = {"Authorization": authorize_token}
res = requests.get("https://api.upbit.com/v1/accounts", headers=headers)
if res.status_code == 200:
return res.()
else:
print(f"Error: {res.status_code} - {res.text}")
return None
if __name__ == "__main__":
accounts = get_accounts()
if accounts:
print(.dumps(accounts, indent=4))
代码详解:
-
导入必要的库:
jwt
用于创建 JWT (JSON Web Token) 令牌,uuid
用于生成唯一的 nonce 值,hashlib
用于计算查询参数的 SHA512 哈希值,urllib.parse
用于 URL 编码查询参数,requests
用于发送 HTTP 请求, -
设置 API 密钥:
将
access_key
和secret_key
替换为您在 Upbit 开放平台获得的 Access Key 和 Secret Key。 请妥善保管您的密钥,避免泄露。 -
get_accounts()
函数: 该函数负责调用 Upbit API 获取账户信息。-
构建查询参数:
创建一个包含
access_key
和nonce
的字典作为查询参数。nonce
是一个随机字符串,用于防止重放攻击。 - 计算查询参数的哈希值: 使用 SHA512 算法计算查询参数的哈希值,并将其包含在 JWT 令牌中。
-
构建 JWT 令牌:
创建一个包含
access_key
,nonce
,query_hash
和query_hash_alg
的字典作为 JWT 令牌的 payload。 使用您的 Secret Key 和 HS256 算法对 payload 进行签名。 -
构建请求头:
将 JWT 令牌添加到请求头的
Authorization
字段中,格式为Bearer {jwt_token}
。 -
发送 HTTP 请求:
使用
requests.get()
方法发送 GET 请求到 Upbit API 的/v1/accounts
端点。 -
处理响应:
如果响应状态码为 200,则表示请求成功。 将响应内容解析为 JSON 格式并返回。 否则,打印错误信息并返回
None
。
-
构建查询参数:
创建一个包含
-
if __name__ == "__main__":
代码块: 该代码块在脚本作为主程序运行时执行。 它调用get_accounts()
函数获取账户信息,并将结果打印到控制台。
注意:
-
请务必替换示例代码中的
YOUR_ACCESS_KEY
和YOUR_SECRET_KEY
为您自己的 Access Key 和 Secret Key。 - Upbit API 的使用频率受到限制。 请参考 Upbit 开放平台的 API 文档,了解详细的限制规则。
-
本示例使用了
.dumps
方法,将返回的JSON格式化,增加了indent=4
参数,使得输出更易于阅读。
代码解释:
-
导入必要的库:
代码首先导入了几个关键的Python库,用于后续的操作。
jwt
库用于生成和验证 JSON Web Tokens (JWT),这是Upbit API身份验证机制的核心。uuid
库用于生成唯一ID,作为nonce值,防止重放攻击。hashlib
库提供了多种哈希算法,这里用于计算查询参数的SHA512哈希值。urllib.parse
库用于处理URL编码,确保查询参数的正确传递。requests
库用于发送HTTP请求到Upbit API服务器。 -
设置 API 密钥:
为了安全地访问Upbit API,需要设置API密钥。
YOUR_ACCESS_KEY
和YOUR_SECRET_KEY
是两个重要的凭证,必须替换为您从Upbit平台获得的真实API密钥。 请务必妥善保管这些密钥,避免泄露,因为泄露可能导致您的账户被恶意使用。访问密钥用于标识您的应用程序,而密钥用于验证您的请求。 -
创建
get_accounts()
函数:get_accounts()
函数是代码的核心部分,封装了调用Upbit API获取账户信息的逻辑。 将API请求的各个步骤整合在一起,提高了代码的可读性和可维护性。该函数主要负责构建API请求,发送请求到Upbit服务器,并处理服务器返回的响应。 -
构建查询参数:
API请求需要包含一些查询参数,以指定请求的类型和传递必要的参数。
query
字典用于存储这些查询参数,包括access_key
和nonce
。access_key
用于标识您的身份,nonce
是一个随机数,用于防止重放攻击。 每次API请求都应该使用不同的nonce值,确保请求的唯一性。 - 计算 Query Hash: 为了保证API请求的安全性,需要对查询参数进行哈希运算,生成一个唯一的哈希值。 代码使用 SHA512 算法对查询参数进行哈希。 SHA512 是一种安全的哈希算法,能够生成高强度的哈希值。 将哈希值包含在JWT中,可以防止请求被篡改。
-
构建 JWT Payload:
JWT (JSON Web Token) 是一种用于安全传输信息的开放标准。
payload
字典用于存储JWT的载荷信息,包括access_key
,nonce
,query_hash
和query_hash_alg
。access_key
用于标识您的身份,nonce
是一个随机数,query_hash
是查询参数的哈希值,query_hash_alg
指定了哈希算法。 这些信息会被编码到JWT中,用于验证API请求的合法性。 -
生成 JWT Token:
使用
jwt.encode()
函数可以生成JWT Token。 JWT Token 是一个包含头部、载荷和签名的字符串。 头部包含了token的类型和签名算法,载荷包含了需要传输的信息,签名用于验证token的完整性。 生成JWT Token时,需要使用您的SECRET_KEY
对其进行签名。 -
构建 Authorization Header:
为了向Upbit API服务器验证您的身份,需要将JWT Token添加到 Authorization Header 中。 Authorization Header 的格式为
Bearer
。 将Authorization Header添加到HTTP请求中,服务器会验证JWT Token的合法性,如果验证通过,则允许您访问API。 -
发送 API 请求:
使用
requests.get()
函数发送 GET 请求到 Upbit API 的/v1/accounts
接口。/v1/accounts
接口用于获取您的账户信息。 HTTP请求包含了Authorization Header,用于验证您的身份。requests.get()
函数会将请求发送到Upbit服务器,并返回服务器的响应。 -
处理 API 响应:
接收到API响应后,需要检查响应的状态码,以确定请求是否成功。 如果状态码为 200 (成功),则表示请求已成功处理。 接下来,需要解析 JSON 响应,提取账户信息。 如果状态码不是200,则表示请求失败,需要打印错误信息并返回
None
。常见的错误码包括400(请求错误)、401(未授权)、429(请求过多)等。 -
调用
get_accounts()
函数: 在if __name__ == "__main__":
代码块中,调用get_accounts()
函数并打印返回的账户信息。if __name__ == "__main__":
代码块是Python程序的入口点。 只有当程序直接运行时,才会执行该代码块中的代码。 在这里,调用get_accounts()
函数获取账户信息,并将账户信息打印到控制台。
5. 实现交易策略
Upbit API 提供了强大的功能,允许开发者和交易者实现各种复杂的自动化交易策略。这些策略可以根据预设的规则自动执行买卖操作,从而提高交易效率,并减少人为情绪的影响。以下是一些常见的交易策略示例:
- 趋势跟踪: 趋势跟踪策略的核心在于识别并跟随市场的主要趋势。通过分析历史价格数据和技术指标(如移动平均线、相对强弱指数 RSI、MACD 等),可以判断当前市场是处于上升趋势还是下降趋势。一旦确认趋势方向,系统会自动买入(上升趋势)或卖出(下降趋势)相应的加密货币。例如,当短期移动平均线上穿长期移动平均线时,可以触发买入信号;反之,当短期移动平均线下穿长期移动平均线时,可以触发卖出信号。更复杂的趋势跟踪策略还会考虑交易量、波动率等因素。
- 套利交易: 套利交易是指利用不同交易所或交易平台之间同一加密货币的价格差异来获利。由于信息不对称、交易成本或市场情绪等原因,同一加密货币在不同交易所的价格可能存在细微的差异。套利交易者会同时在价格较低的交易所买入,并在价格较高的交易所卖出,从而赚取差价。Upbit API 允许快速获取不同市场的数据,使得执行套利策略成为可能。套利交易对执行速度要求很高,因此需要优化 API 调用和交易流程。
- 量化交易: 量化交易使用数学模型和统计分析来预测市场走势,并自动执行交易。这种策略通常需要大量的数据分析和复杂的算法模型。例如,可以使用时间序列分析、回归分析、机器学习等方法来预测价格波动。量化交易策略的开发需要专业的编程和数学知识。Upbit API 提供了历史数据接口,方便量化交易者进行数据挖掘和模型训练。
- 网格交易: 网格交易是一种在特定价格范围内设置一系列买入和卖出订单的策略。交易者预先设定一个价格区间,并在该区间内按照一定的间隔设置多个买单和卖单。当价格下跌并触及买单时,系统会自动买入;当价格上涨并触及卖单时,系统会自动卖出。通过不断地在价格波动中进行买卖,网格交易可以赚取微小的利润。网格交易的参数设置(如价格区间、网格密度、单笔交易量等)对最终收益有很大影响,需要根据市场情况进行调整。
在利用 Upbit API 实现交易策略时,必须充分考虑各种风险因素,并采取相应的风险管理措施。以下是一些重要的注意事项:
- 风险管理: 风险管理是交易策略中至关重要的一环。设置止损单和止盈单是常用的风险管理手段。止损单可以在价格下跌到一定程度时自动平仓,以限制损失;止盈单可以在价格上涨到一定程度时自动平仓,以锁定利润。止损和止盈的设置需要根据自身的风险承受能力和市场波动情况进行调整。还可以使用仓位控制、对冲等方法来降低风险。
- 资金管理: 合理分配资金,避免过度交易。不要将所有资金投入到单一交易中。建议将资金分成多个部分,并分散投资于不同的交易策略或加密货币。还需要根据市场情况和自身的盈利能力,动态调整资金分配比例。过度交易会导致手续费增加,并增加亏损的风险。
- API 调用频率限制: Upbit 对 API 调用频率有限制,以防止服务器过载。需要仔细阅读 Upbit API 文档,了解不同接口的调用频率限制。在编写交易程序时,要合理控制 API 调用频率,避免超过限制而被限制访问。可以使用缓存技术来减少 API 调用次数。如果需要高频率的 API 调用,可以考虑申请更高的 API 权限。
- 市场流动性: 市场流动性是指市场中买卖订单的充足程度。流动性好的市场,交易更容易成交,滑点也更小。流动性差的市场,交易可能难以成交,或者成交价格与预期价格存在较大偏差。在选择交易的加密货币时,要考虑其市场流动性。避免在流动性差的市场中进行大额交易。
- 交易手续费: 交易手续费是交易成本的重要组成部分。不同的交易所或交易平台的手续费标准可能不同。在制定交易策略时,需要将交易手续费纳入考量中。高频交易对交易手续费的敏感度较高。可以选择手续费较低的交易所或交易平台,以降低交易成本。同时,也可以考虑使用返佣机制来降低手续费支出。
6. 注意事项
- 安全性: API 密钥是访问 Upbit 交易平台的凭证,务必像对待银行密码一样妥善保管,避免泄露。密钥泄露可能导致资产损失。严格禁止将 API 密钥硬编码到应用程序代码中,这是一个极其危险的做法。应采用环境变量、配置文件或专门的密钥管理系统(如 HashiCorp Vault)来安全地存储和管理 API 密钥。定期更换 API 密钥也是一种提升安全性的有效措施。
- 错误处理: 一个健壮的错误处理机制对于构建稳定可靠的交易系统至关重要。Upbit API 会返回各种错误代码,每个代码都代表一种特定的问题。仔细研读 Upbit 官方 API 文档,全面了解各种错误代码的具体含义及其潜在原因。根据不同的错误类型,实施相应的处理策略,例如重试机制(针对网络瞬时故障)、日志记录(用于问题排查)或告警通知(针对严重错误)。有效的错误处理可以避免程序崩溃,并提高系统的容错能力。
- API 文档: Upbit 官方 API 文档是使用该 API 的最权威、最全面的参考资料。务必仔细阅读 API 文档,深入了解每个接口的功能、请求参数、响应格式、速率限制和使用示例。文档中通常还包含有关身份验证、错误代码和最佳实践等重要信息。熟练掌握 API 文档,可以帮助开发者更有效地利用 Upbit API,并避免不必要的错误。
- 模拟交易: 在将交易策略应用于真实市场之前,强烈建议先使用 Upbit 提供的模拟交易环境进行充分测试。模拟交易环境允许开发者在不承担真实资金风险的情况下,验证交易策略的有效性、评估风险指标,并调试程序代码。通过模拟交易,可以发现潜在的问题并进行优化,从而降低实际交易中的风险。务必在模拟环境中进行足够长时间的测试,以确保策略在不同市场条件下的稳健性。
- 法律法规: 加密货币交易可能受到不同国家或地区的法律法规的约束。在使用 Upbit API 进行交易之前,请务必遵守您所在地区的有关加密货币交易的法律法规,并了解相关的税务义务。请咨询专业的法律顾问,以确保您的交易行为符合当地的法律法规。监管政策可能会发生变化,请及时关注最新的法律法规动态。