交易新手如何玩转Upbit API?独家秘籍大公开!
Upbit 交易所 API 教程
1. 简介
Upbit 交易所是韩国领先的加密货币交易所之一,在韩国市场拥有举足轻重的地位,为全球用户提供广泛的数字资产交易服务。Upbit 以其安全性、用户友好的界面和创新的交易功能而闻名。它不仅提供包括比特币 (BTC)、以太坊 (ETH) 等主流加密货币的交易,还支持众多新兴的数字资产,拥有丰富的交易对,满足不同投资者的需求。其挂单薄深度和流动性在亚洲交易所中也具备优势,是专业交易者和机构投资者的重要选择。
本详细 Upbit API 教程专为开发者量身定制,旨在提供全面的指导和技术支持,帮助他们充分利用 Upbit 的 API 接口。API (应用程序编程接口) 允许开发者通过编程方式访问 Upbit 的交易平台,从而实现自动化交易策略、数据分析和集成到其他应用程序。本教程将深入探讨 Upbit API 的各个方面,包括身份验证、市场数据获取、订单管理和账户信息查询等。通过学习本教程,开发者可以快速掌握 Upbit API 的使用方法,并构建高效、稳定的交易应用程序,最大限度地利用 Upbit 平台提供的各种功能。
2. 准备工作
在使用Upbit API进行交易或数据分析之前,必须完成一系列准备工作,以确保安全且高效地访问Upbit平台的功能。
- Upbit账户: 要充分利用Upbit API,您需要注册并验证一个Upbit账户。 账户验证可能需要提供身份证明文件,以符合交易所的安全和合规要求。请确保您的账户已完成必要的身份验证流程。
- API Key和Secret Key: 在Upbit网站的API管理页面生成API Key和Secret Key。API Key用于标识您的应用程序,Secret Key则用于对您的请求进行签名,确保请求的安全性。 请务必极其谨慎地保管您的Secret Key,切勿将其泄露给任何第三方。 泄露Secret Key可能导致您的账户被恶意访问和资金损失。建议您定期更换API Key和Secret Key,以提高安全性。考虑使用环境变量或安全的密钥管理系统来存储您的密钥,而不是直接在代码中硬编码。
-
编程环境:
选择一个适合您的编程语言和需求的编程环境。常用的选择包括Python、Node.js、Java、Go等。根据您的选择,安装相应的开发工具包(SDK)和依赖项。例如,对于Python,您可能需要安装
pip
包管理器;对于Node.js,您需要npm
或yarn
包管理器。确保您的编程环境已正确配置,以便能够顺利地编写和运行API调用代码。 -
必要的HTTP请求库:
使用Upbit API需要通过HTTP请求与Upbit服务器进行通信。根据您选择的编程语言,安装相应的HTTP请求库。例如,在Python中,常用的库是
requests
和aiohttp
(用于异步请求);在Node.js中,常用的库是axios
和node-fetch
。安装这些库后,您可以使用它们发送GET、POST、PUT、DELETE等HTTP请求,并处理来自Upbit服务器的响应。确保您熟悉所选库的用法,例如设置请求头、处理JSON数据、处理错误等。考虑使用具有重试机制和速率限制功能的库,以提高API调用的稳定性和可靠性。
3. API 认证
Upbit API采用基于JWT(JSON Web Token)的认证机制,确保接口调用的安全性与合法性。要访问Upbit的API,您需要生成并使用一个有效的JWT,该JWT由您的API Key和Secret Key生成。API Key和Secret Key是您在Upbit平台注册并创建API密钥后获得的唯一凭证。
JWT的生成过程通常包括以下步骤:
- 获取API Key和Secret Key: 在Upbit开发者平台注册并创建API密钥,获得API Key(用于标识您的应用程序)和Secret Key(用于签名JWT)。请妥善保管您的Secret Key,避免泄露。
- 构建JWT Payload: Payload是JWT中包含声明的部分,通常包含一些与用户或应用程序相关的信息,例如用户ID、权限等。对于Upbit API,可能需要包含一些特定的声明,例如API请求的权限范围。
- 使用Secret Key签名JWT: 使用Secret Key对JWT的Header和Payload进行签名,生成JWT签名。签名算法通常是HMAC SHA256 (HS256)。
- 构建完整的JWT: 将Header、Payload和签名组合成一个完整的JWT字符串。
生成JWT后,您需要在每个API请求的HTTP Header中携带该JWT。通常,您会将JWT放在
Authorization
Header中,并使用
Bearer
scheme。例如:
Authorization: Bearer YOUR_GENERATED_JWT
请注意,JWT具有有效期,过期后将无法使用。您需要定期刷新JWT以确保API请求的有效性。Upbit API文档中会详细说明JWT的有效期以及刷新机制。
通过使用JWT认证,Upbit API能够安全地验证请求的来源,并确保只有经过授权的应用程序才能访问API资源。请务必仔细阅读Upbit API文档,了解有关JWT认证的详细信息和最佳实践。
生成JWT (Python示例):
使用Python生成JSON Web Token (JWT) 的示例代码,展示了如何利用
jwt
库创建包含声明和签名的安全令牌。
import jwt
import uuid
import hashlib
导入必要的Python库。
jwt
用于JWT的编码和解码,
uuid
用于生成唯一标识符,
hashlib
(虽然示例中未直接使用,但在实际应用中常用于增强安全性) 用于哈希处理。
access_key = "YOUR_ACCESS_KEY" # 替换为您的Access Key
secret_key = "YOUR_SECRET_KEY" # 替换为您的Secret Key
定义用于签名JWT的Access Key和Secret Key。
请务必将
YOUR_ACCESS_KEY
和
YOUR_SECRET_KEY
替换为您自己的安全凭证。
Access Key通常用于标识您的应用程序,而Secret Key则是用于验证令牌完整性的密钥,必须妥善保管,避免泄露。
def generate_jwt():
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()),
}
定义一个名为
generate_jwt()
的函数,该函数负责生成JWT。 在
payload
字典中,定义了JWT的声明(claims)。
access_key
是一个声明,通常用于标识客户端或应用程序。
nonce
(Number used once) 是一个随机的、唯一的字符串,用于防止重放攻击。每次生成JWT时都应生成一个新的
nonce
值。 使用
uuid.uuid4()
生成UUID (Universally Unique Identifier),并将其转换为字符串。
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
return jwt_token
使用
jwt.encode()
函数对
payload
进行编码,生成JWT。 该函数接受三个参数:
payload
(要编码的数据),
secret_key
(用于签名的密钥), 和
algorithm
(签名算法)。 在本例中,使用 HMAC-SHA256 (
HS256
) 算法。 HS256是一种对称加密算法,意味着用于签名和验证令牌的密钥是相同的。 函数返回编码后的JWT字符串,并将其赋值给
jwt_token
变量。然后,该函数返回
jwt_token
。
jwt_token = generate_jwt()
调用
generate_jwt()
函数生成JWT,并将结果存储在
jwt_token
变量中。
print(jwt_token)
将生成的JWT打印到控制台。 该JWT可以用于身份验证和授权,例如,在HTTP请求的
Authorization
头部中发送JWT,服务器可以验证JWT的签名,并根据JWT中的声明来确定用户的身份和权限。
请求头格式:
Authorization
请求头用于在 HTTP 请求中传递认证信息,遵循 "Bearer" 方案,后跟 JSON Web Token (JWT)。JWT 令牌是经过编码的字符串,包含了经过签名验证的用户身份和授权信息。服务器会验证 JWT 的签名,并从中提取信息以确认用户的身份以及该用户被授予的访问权限。此头部对于需要用户认证才能访问的 API 接口至关重要,确保只有经过授权的用户才能执行操作。
完整的请求头格式如下:
Authorization: Bearer {jwt_token}
其中,
{jwt_token}
需要替换为实际的 JWT 字符串。JWT 令牌通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),它们通过句点(.)分隔。每个部分都经过 Base64 编码。
4. 常用API接口
以下是一些常用的Upbit API接口,这些接口允许开发者访问Upbit平台的数据和功能,进行自动化交易、数据分析等操作。正确使用API密钥和遵守Upbit的使用条款至关重要。
4.1 获取市场行情
- GET /v1/market/all: 获取交易所提供的所有交易对的市场行情快照。该接口提供实时更新的市场数据,包括但不限于最高价、最低价、开盘价、收盘价、成交量、成交额等关键指标。 通过调用此接口,用户可以全面了解当前市场的整体交易动态,为投资决策提供基础数据支持。
示例: 获取Upbit市场代码
使用Python的requests库,可以轻松获取Upbit交易所支持的所有交易市场代码。
import requests
定义API的URL和请求头。Upbit API的基准URL是
https://api.upbit.com/v1
。 我们将使用
/market/all
端点来获取所有市场信息。 设置请求头以指定我们期望的响应格式为JSON。
url = "https://api.upbit.com/v1/market/all"
headers = {"Accept": "application/"}
使用
requests.get()
方法发送GET请求到Upbit API。将定义的URL和headers作为参数传递给该方法。 这将发送一个HTTP请求到Upbit服务器,请求所有市场信息。
response = requests.get(url, headers=headers)
打印响应内容。
response.()
方法将服务器返回的JSON格式的响应数据解析为Python字典或列表,方便进一步处理。 输出结果将包含Upbit支持的所有交易市场的详细信息,例如市场代码、市场名称等。 注意处理可能出现的异常,例如网络错误或API调用错误,以确保程序的健壮性。
print(response.())
响应示例:
JSON 数组,包含市场信息:
[ { "market": "KRW-BTC", "korean name": "비트코인", "english name": "Bitcoin", "market_warning": "NONE/CAUTION/WATCHING", "trade_id": 123456789, "trade_timestamp": 1678886400000, "trade_price": 45000000.0, "trade_volume": 0.001, "prev_closing_price": 44000000.0, "change": "RISE/FALL/EVEN", "change_price": 1000000.0, "signed_change_price": 1000000.0, "change_rate": 0.0227, "signed_change_rate": 0.0227, "high_price": 45500000.0, "low_price": 43500000.0, "trade_date": "20230315", "trade_time": "000000", "trade_date_kst": "20230315", "trade_time_kst": "090000", "trade_ticks": [ { "sequential_id": 1, "timestamp": 1678886400000, "price": 45000000.0, "volume": 0.001, "side": "ASK/BID" } ] }, { "market": "KRW-ETH", "korean name": "이더리움", "english name": "Ethereum", "market_warning": "NONE/CAUTION/WATCHING", "trade_id": 987654321, "trade_timestamp": 1678886400000, "trade_price": 3000000.0, "trade_volume": 0.01, "prev_closing_price": 2900000.0, "change": "RISE/FALL/EVEN", "change_price": 100000.0, "signed_change_price": 100000.0, "change_rate": 0.0345, "signed_change_rate": 0.0345, "high_price": 3100000.0, "low_price": 2800000.0, "trade_date": "20230315", "trade_time": "000000", "trade_date_kst": "20230315", "trade_time_kst": "090000", "trade_ticks":[ { "sequential_id": 2, "timestamp": 1678886400000, "price": 3000000.0, "volume": 0.01, "side": "ASK/BID" } ] }, ... ]
candle_type
参数用于指定K线类型,具体说明如下:
-
minutes/{unit}
: 分钟K线。unit
表示分钟数,例如minutes/1
表示 1 分钟 K 线,minutes/5
表示 5 分钟 K 线。支持的unit
包括 1, 3, 5, 15, 30, 60, 240。 -
days
: 日K线。表示一天的开盘价、收盘价、最高价和最低价。 -
weeks
: 周K线。表示一周的开盘价、收盘价、最高价和最低价。 -
months
: 月K线。表示一个月的开盘价、收盘价、最高价和最低价。
请求参数包括:
market
(市场代码,例如 KRW-BTC)、
to
(结束时间,UTC 时间,格式为 yyyy-MM-ddTHH:mm:ssZ 或 yyyy-MM-dd HH:mm:ss)、
count
(K 线数量,最多 200 根)。 如果未指定
to
,则返回最新的 K 线数据。 例如: ?market=KRW-BTC&to=2023-10-26T00:00:00Z&count=50
响应数据包含:
market
,
candle_date_time_utc
(UTC 时间),
candle_date_time_kst
(KST 时间),
opening_price
(开盘价),
high_price
(最高价),
low_price
(最低价),
trade_price
(收盘价),
timestamp
(时间戳),
candle_acc_trade_price
(累计交易金额),
candle_acc_trade_volume
(累计交易量),
unit
(分钟봉 단위).
示例 (获取5分钟K线):
import requests
market = "KRW-BTC"
:定义交易市场,这里是韩元计价的比特币市场。您可以根据需要修改为其他交易对,例如
"ETH-BTC"
(以太坊/比特币)。
unit = 5
:指定K线的时间周期,单位为分钟。例如,
unit = 1
表示1分钟K线,
unit = 15
表示15分钟K线。
url = f"https://api.upbit.com/v1/candles/minutes/{unit}?market={market}&count=200"
:构造API请求URL。 Upbit API允许请求不同时间粒度的K线数据。
/minutes/{unit}
指定了请求分钟K线,
market
参数指定交易市场,
count
参数限制了返回K线数据的数量。Upbit API 对单次请求返回的数据条数有限制,通常
count
最大值为200。如果需要更多数据,需要分页请求。
headers = {"Accept": "application/"}
:设置HTTP请求头,声明接受JSON格式的响应数据。 建议明确指定
Accept
头部,确保服务器返回期望的数据格式。
response = requests.get(url, headers=headers)
:使用
requests
库发送GET请求到Upbit API,并传递请求头信息。 确保安装了
requests
库 (
pip install requests
)。
print(response.())
:解析并打印API响应的JSON数据。
response.()
方法将响应内容转换为Python字典或列表,方便后续处理。 请注意处理API请求可能出现的异常,例如网络错误或API返回错误码,以便程序能够正确处理这些情况。
响应示例:
以下示例展示了加密货币交易所API可能返回的蜡烛图(K线图)数据结构,数据以JSON格式呈现,方便解析和处理:
[
{
"market": "KRW-BTC"
,
解释:
交易市场代码。这里表示韩元(KRW)与比特币(BTC)的交易对。 交易所使用此代码来唯一标识交易对。
"candle_date_time_utc": "2023-10-27T07:55:00"
,
解释:
蜡烛图的起始时间(UTC时间)。 这是格林尼治标准时间,是全球标准时间。 此时间戳标志着该蜡烛图代表的时间段的开始。
"candle_date_time_kst": "2023-10-27T16:55:00"
,
解释:
蜡烛图的起始时间(韩国标准时间)。 KST 比 UTC 快 9 小时。 显示本地时区对于韩国交易者来说更为方便。
"opening_price": 48760000.0
,
解释:
该时间段内第一个交易的价格。 开盘价是确定特定时间段内价格走势方向的重要指标。
"high_price": 48784000.0
,
解释:
该时间段内达到的最高价格。 最高价可以帮助识别阻力位和潜在的突破点。
"low_price": 48727000.0
,
解释:
该时间段内达到的最低价格。 最低价可以帮助识别支撑位和潜在的回调。
"trade_price": 48762000.0
,
解释:
该时间段内最后一笔交易的价格,也称为收盘价。 收盘价是分析价格走势最重要的价格之一。
"timestamp": 1698396926271
,
解释:
数据生成的时间戳(Unix 时间戳,毫秒)。 这表示服务器生成此数据的时间。
"candle_acc_trade_price": 170974634.6653
,
解释:
该时间段内所有交易的总成交额(韩元)。 总成交额反映了该时间段内的市场活动强度。
"candle_acc_trade_volume": 3.50617819
,
解释:
该时间段内交易的总交易量(比特币)。 总交易量表示交易了多少比特币。
"unit": 5
解释:
蜡烛图的时间单位。 这里表示 5 分钟的蜡烛图,意味着每个蜡烛图代表 5 分钟的交易数据。常见的单位包括 1 分钟、3 分钟、5 分钟、15 分钟、30 分钟、1 小时、4 小时、1 天、1 周、1 月等。
},
...(更多蜡烛图数据)
]
4.2 交易相关
- GET /v1/accounts: 获取账户信息。此接口用于检索与特定用户或 API 密钥关联的账户的详细信息。返回的信息通常包括账户余额、可用资金、已用保证金以及其他与账户相关的属性。在使用此接口时,通常需要提供身份验证信息,例如 API 密钥或访问令牌,以确保只有授权用户才能访问账户数据。响应数据通常以 JSON 格式返回,包含账户 ID、账户类型、币种以及各种余额信息。
示例:
以下Python代码演示了如何使用JWT(JSON Web Token)对Upbit API进行身份验证。 它依赖于
requests
和
jwt
库。 在开始之前,请确保已安装这些依赖项:
pip install requests pyjwt
和
pip install pyjwt[crypto]
。
import requests
import jwt
import uuid
access_key = "YOUR_ACCESS_KEY" # 替换为您的Access Key。Access Key在Upbit开放API管理页面中创建和获取。
secret_key = "YOUR_SECRET_KEY" # 替换为您的Secret Key。Secret Key与Access Key成对出现,务必妥善保管。
def generate_jwt():
"""
生成用于身份验证的JWT令牌。
"""
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()), # nonce用于防止重放攻击,每次请求都应生成唯一的UUID。
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
return jwt_token
上述代码使用HS256算法对payload进行签名,生成JWT令牌。 HS256是一种对称加密算法,因此需要使用Secret Key进行签名和验证。
jwt_token = generate_jwt()
url = "https://api.upbit.com/v1/accounts" # Upbit API的账户信息端点。
headers = {"Authorization": f"Bearer {jwt_token}"} # 将JWT令牌添加到Authorization头部,指定Bearer认证方案。
response = requests.get(url, headers=headers)
使用
requests
库发送GET请求,并包含包含JWT令牌的授权头部。
print(response.())
打印服务器响应的JSON内容。 通常,它包含您的Upbit账户信息。 确保检查
response.status_code
以处理潜在的错误,例如401未授权或429请求过多。
响应示例:
[ { "currency": "KRW", "balance": "1000000.0", "locked": "0.0", "avg buy price": 0, "avg buy price modified": false, "unit currency": "KRW" }, { "currency": "BTC", "balance": "0.001", "locked": "0.0", "avg buy price": 50000000, "avg buy price modified": false, "unit currency": "KRW" } ]
上述响应示例展示了一个账户的余额信息,包含韩元 (KRW) 和比特币 (BTC) 两种加密货币的账户状态。
-
currency
: 表示币种代码,例如 KRW 代表韩元,BTC 代表比特币。 -
balance
: 表示可用余额,即用户可以自由支配的币种数量。例如,KRW 的可用余额为 1,000,000.0,BTC 的可用余额为 0.001。 -
locked
: 表示锁定余额,通常是由于挂单或其他交易活动而冻结的币种数量。 在此示例中,两种货币的锁定余额均为 0.0,表示没有被冻结的资金。 -
avg buy price
: 表示平均购买价格,用于计算盈亏。 此值可能为 0,表示没有历史购买记录,或者该币种是通过其他方式获得的。 -
avg buy price modified
: 布尔值,指示平均购买价格是否被手动修改过。false
表示未修改,true
表示已修改。 -
unit currency
: 表示计价货币,即用于计算平均购买价格的货币。 在此示例中,计价货币均为 KRW。
这些信息对于追踪账户资产、计算盈亏以及管理加密货币投资组合至关重要。 请注意,实际的 API 响应可能包含更多字段,具体取决于交易所或平台的实现方式。
请求参数:
-
market
: 市场代码 。 这是用于指定交易对的唯一标识符。例如,KRW-BTC
表示韩元 (KRW) 交易比特币 (BTC) 的市场。 请确保市场代码的准确性,因为它直接决定了交易的执行标的。 -
side
: 订单类型 。指示您希望执行的交易方向。bid
代表买入订单,即您希望以指定价格购买加密货币。ask
代表卖出订单,即您希望以指定价格出售加密货币。 选择正确的订单类型对于成功执行您的交易至关重要。 -
volume
: 数量 。 指定您希望买入或卖出的加密货币数量。当side
设置为ask
(卖出) 时,volume
是必填参数,表示您希望出售的加密货币数量。请注意,数量必须是正数,并符合交易所规定的最小交易数量限制。 -
price
: 价格 。 指示您希望买入或卖出加密货币的价格。 当side
设置为bid
(买入) 时,price
是必填参数,表示您愿意支付的最高价格。 对于限价单,这是您希望成交的价格;对于市价单,此参数可能被忽略,因为交易将以当前市场最优价格执行。 -
ord_type
: 订单类型 。 定义了订单的执行方式。limit
表示限价单,以指定的价格或更好的价格执行。price
表示市价买入订单,以当前市场最优价格立即买入指定数量的加密货币。market
表示市价卖出订单,以当前市场最优价格立即卖出指定数量的加密货币。 选择合适的订单类型取决于您的交易策略和对价格滑点的容忍度。 -
identifier
: 订单ID (可选) 。 允许您为订单指定一个自定义的唯一标识符。这对于跟踪和管理您的订单非常有用,尤其是在您同时提交多个订单时。 如果未提供,交易所通常会自动生成一个唯一的订单ID。
示例:使用Python进行Upbit API交易身份验证
本示例展示如何使用Python生成JSON Web Token (JWT) 以对Upbit API进行身份验证并执行交易操作。其中包括必要的库导入,密钥配置,JWT生成函数的实现以及发送订单请求的完整代码示例。
导入必要的Python库:
import requests # 用于发送HTTP请求
import jwt # 用于生成JWT
import uuid # 用于生成唯一ID
import hashlib # 用于哈希运算 (虽然在此示例中未使用,但在实际应用中可能需要)
接下来,配置您的Access Key和Secret Key。请务必妥善保管您的Secret Key,避免泄露。
access_key = "YOUR_ACCESS_KEY" # 替换为您的Upbit Access Key
secret_key = "YOUR_SECRET_KEY" # 替换为您的Upbit Secret Key
定义一个函数来生成JWT。该函数创建一个包含Access Key和随机nonce的payload,然后使用Secret Key对其进行签名。
def generate_jwt():
"""生成用于Upbit API身份验证的JWT."""
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()), # 使用UUID生成唯一的nonce
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256') # 使用HS256算法进行签名
return jwt_token
调用该函数以生成JWT Token:
jwt_token = generate_jwt()
现在,您可以构建API请求。以下是一个示例,展示如何使用生成的JWT Token下达限价买单。
url = "https://api.upbit.com/v1/orders" # Upbit订单API endpoint
headers = {"Authorization": f"Bearer {jwt_token}"} # 在请求头中包含JWT Token
data = {
"market": "KRW-BTC", # 市场代码 (例如: 韩元-比特币)
"side": "bid", # 订单类型 (bid: 买入, ask: 卖出)
"price": "50000000", # 订单价格 (韩元)
"ord_type": "limit", # 订单类型 (limit: 限价单, price: 市价单)
"volume": "0.0001", # 订单数量 (比特币)
"identifier": str(uuid.uuid4()) # 客户端生成的唯一ID,用于区分订单
}
使用
requests
库发送POST请求:
response = requests.post(url, headers=headers, data=data)
打印响应结果。这将显示API调用是否成功以及返回的任何信息。
print(response.()) # 打印JSON格式的响应内容
响应示例:
一个成功的订单创建或查询请求会返回一个 JSON 对象,该对象包含了订单的详细信息。以下是一个响应示例,展示了订单的各项关键属性:
{
"uuid": "cdd9d897-4f38-4e48-9911-db6c4e3d7a32",
"side": "bid",
"ord
type": "limit",
"price": "50000000.0",
"avg
price": "0.0",
"state": "wait",
"market": "KRW-BTC",
"created
at": "2023-10-27T08:25:38+00:00",
"volume": "0.0001",
"remaining
volume": "0.0001",
"reserved
fee": "0.005",
"remaining
fee": "0.005",
"paid
fee": "0.0",
"locked": "5005.0",
"executed
volume": "0.0",
"trades_count": 0
}
字段解释:
-
uuid
: 订单的唯一标识符,是一个UUID格式的字符串。 -
side
: 订单方向,"bid" 表示买入(买单),"ask" 表示卖出(卖单)。 -
ord type
: 订单类型,"limit" 表示限价单。其他常见的订单类型包括 "market" (市价单)。 -
price
: 订单的指定价格,仅在限价单中有效。 市价单此项通常为null. -
avg price
: 订单的平均成交价格。 在订单完全成交前通常为 0.0。 -
state
: 订单状态,"wait" 表示等待成交。 其他状态可能包括 "done" (已完成), "cancel" (已取消)。 -
market
: 交易市场,例如 "KRW-BTC" 表示韩元交易比特币市场。 -
created at
: 订单创建时间,采用 ISO 8601 格式。 -
volume
: 订单的原始数量。 -
remaining volume
: 订单的剩余未成交数量。 -
reserved fee
: 预留的手续费。 -
remaining fee
: 剩余未支付的手续费。 -
paid fee
: 已支付的手续费。 -
locked
: 锁定金额,通常是订单价格乘以数量加上手续费。 -
executed volume
: 已成交数量。 -
trades_count
: 成交笔数。
请求参数:
-
uuid
: 订单的唯一通用识别码 (UUID)。UUID 是一个 128 位的标识符,用于在系统中唯一标识一个订单,例如:`a1b2c3d4-e5f6-7890-1234-567890abcdef`。 使用 UUID 查询可以保证订单的唯一性和准确性。 (或) -
identifier
: 订单的系统内部ID。 这个ID是系统自动生成的唯一数字标识符,用于在数据库中定位订单记录。例如: `123456789`。 虽然使用 ID 可以快速查找订单,但在分布式系统中,建议优先使用 UUID,以避免ID冲突和数据一致性问题。
示例: 使用Python生成JWT并取消Upbit订单
本示例展示如何使用Python生成JSON Web Token (JWT) 并通过Upbit API取消指定订单。请确保您已安装必要的Python库:
requests
和
PyJWT
。
pip install requests pyjwt
代码示例:
import requests
import jwt
import uuid
import hashlib
access_key = "YOUR_ACCESS_KEY" # 替换为您的Upbit Access Key
secret_key = "YOUR_SECRET_KEY" # 替换为您的Upbit Secret Key
以上代码段导入必要的库,并设置了
access_key
和
secret_key
。请务必替换为您在Upbit交易所申请的真实密钥。确保密钥的安全性,避免泄露。
def generate_jwt():
"""
生成用于Upbit API认证的JWT.
"""
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()), # 使用UUID生成唯一随机数
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
return jwt_token
generate_jwt()
函数创建包含
access_key
和
nonce
(用于防止重放攻击)的payload。然后,它使用
secret_key
和
HS256
算法对payload进行签名,生成JWT。
nonce
字段使用UUID确保每次请求的唯一性,增强安全性。
jwt_token = generate_jwt()
调用
generate_jwt()
函数获取生成的 JWT token.
order_uuid = "YOUR_ORDER_UUID" # 替换为要取消的订单 UUID
url = f"https://api.upbit.com/v1/order?uuid={order_uuid}"
headers = {"Authorization": f"Bearer {jwt_token}"}
这里需要替换
order_uuid
为您需要取消的订单的UUID。 构建请求URL,其中包含订单UUID。 请求头包含Authorization字段,其值为 "Bearer " 后跟生成的JWT token。
response = requests.delete(url, headers=headers)
发送DELETE请求到Upbit API以取消订单。 使用
requests.delete()
函数发送DELETE请求,并传递包含JWT的请求头。
print(response.())
打印服务器的响应。 使用
response.()
解析JSON响应,并将其打印到控制台。 响应将包含有关取消订单操作是否成功的详细信息。
注意:
- 请务必使用有效的Access Key和Secret Key。
- 确保您的Access Key具有取消订单的权限。
- 订单UUID必须是有效的,并且属于您。
- API请求频率有限制,请注意Upbit的API文档以避免触发限流。
此代码示例展示了使用JWT进行身份验证并取消Upbit订单的基本流程。您可以根据您的具体需求进行修改和扩展。
请求参数:
-
uuid
: 订单 UUID(通用唯一识别码)。这是用于唯一标识订单的字符串,通常由系统自动生成,可以确保在全球范围内订单的唯一性。使用 UUID 可以在不暴露内部订单 ID 的情况下引用特定订单。 (或) -
identifier
: 订单 ID。这是一个内部使用的订单标识符,通常是一个整数或字符串,由系统按照一定的规则生成。开发者可以使用订单 ID 更直接地访问和操作订单数据,这通常用于系统内部的订单管理和查询。
示例: 使用Python生成JWT并调用Upbit API取消订单
该示例展示了如何使用Python生成JSON Web Token (JWT) 并利用其调用Upbit API取消指定订单。
需要安装必要的Python库:
requests
和
PyJWT
。可以使用以下命令进行安装:
pip install requests pyjwt
以下代码展示了生成JWT并调用Upbit API的完整流程:
import requests
import jwt
import uuid
access_key = "YOUR_ACCESS_KEY" # 替换为您的Access Key
secret_key = "YOUR_SECRET_KEY" # 替换为您的Secret Key
def generate_jwt():
"""
生成用于身份验证的JWT。
Returns:
str: 生成的JWT字符串。
"""
payload = {
'access_key': access_key,
'nonce': str(uuid.uuid4()), # 确保nonce的唯一性,防止重放攻击
}
jwt_token = jwt.encode(payload, secret_key, algorithm='HS256')
return jwt_token
jwt_token = generate_jwt()
# 替换为要取消的订单的UUID
order_uuid = "cdd9d897-4f38-4e48-9911-db6c4e3d7a32"
url = f"https://api.upbit.com/v1/order?uuid={order_uuid}"
headers = {"Authorization": f"Bearer {jwt_token}"}
try:
response = requests.delete(url, headers=headers)
response.raise_for_status() # 检查HTTP状态码,如果不是200则抛出异常
print(response.()) # 打印API响应,通常会包含取消订单的结果
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except jwt.exceptions.JWTError as e:
print(f"JWT生成失败: {e}")
代码解释:
-
access_key
和secret_key
: 必须替换为您的Upbit API Access Key和Secret Key。 这些密钥用于生成JWT以进行身份验证。 -
generate_jwt()
函数: 该函数创建一个包含access_key
和唯一nonce
的payload, 然后使用secret_key
和HS256
算法对其进行签名, 生成JWT。nonce
是一个随机生成的UUID, 用于防止重放攻击。 -
jwt.encode()
: 使用PyJWT库对payload进行编码,生成JWT。 -
requests.delete()
: 向Upbit API发送DELETE请求,以取消指定UUID的订单。Authorization
header 包含生成的JWT,用于身份验证。 -
response.raise_for_status()
: 该方法在响应状态码不是2xx的情况下抛出HTTPError异常,方便进行错误处理。 -
异常处理: 代码包含try-except块来处理可能的
requests
和jwt
异常。
注意:请务必妥善保管您的Access Key和Secret Key,避免泄露。
5. WebSocket API
Upbit交易所还提供强大的WebSocket API,专为需要实时、低延迟市场行情数据的高级用户和交易机器人设计。与REST API的轮询模式不同,WebSocket API采用推送模式,服务器主动向客户端发送数据更新,从而显著降低了延迟并提高了效率。
WebSocket API的使用相较于REST API更为复杂,需要建立持久的连接和维护订阅关系。用户必须首先建立一个WebSocket连接,然后通过发送特定的订阅消息来选择需要接收的数据频道,例如交易、行情深度或最新成交价等。Upbit WebSocket API支持多种数据频道,允许用户根据自身需求定制数据流。
开发者需要仔细阅读Upbit的WebSocket API文档,了解连接建立、消息格式、订阅规则以及错误处理等细节。不同的编程语言和环境可能需要不同的WebSocket客户端库来实现连接和数据处理。正确配置心跳机制对于保持连接的稳定至关重要。
通过WebSocket API,用户可以构建高性能的交易策略,实时监控市场动态,并快速响应价格变化。然而,需要注意的是,WebSocket连接的数量和数据请求频率可能会受到限制,开发者需要合理规划资源使用,以避免触发限流或其他限制。
6. 错误处理
Upbit API 遵循标准的 HTTP 状态码约定,以便清晰地指示 API 请求的处理结果。理解并正确处理这些状态码对于构建健壮的应用程序至关重要。以下列举了一些常见的错误状态码及其含义:
- 400 Bad Request(错误请求): 此状态码表明客户端发送的请求存在语法错误或缺少必要的参数。常见原因包括:请求体格式不正确、参数类型不匹配、参数值超出有效范围、缺少必需的请求头等。开发者应仔细检查请求参数,确保符合API文档的规范。API的响应体通常会包含更详细的错误信息,指出具体的错误字段和原因,以便快速定位问题。
- 401 Unauthorized(未授权): 此状态码表示客户端未经过身份验证或提供的身份验证信息无效,无法访问受保护的API资源。通常是因为API密钥无效、过期或者没有足够的权限。开发者应检查API密钥是否正确配置,并确保已获得访问所需资源的授权。有些API可能会返回包含授权相关信息的响应头,例如`WWW-Authenticate`,可以帮助开发者了解具体的认证方式。
- 429 Too Many Requests(请求过多): 此状态码表明客户端在单位时间内发送的请求数量超过了 Upbit API 规定的请求频率限制(Rate Limit)。为了保证服务的稳定性和公平性,Upbit对API请求的频率进行了限制。当客户端达到限制时,会返回此状态码。开发者应根据API文档中规定的频率限制,合理控制请求的发送频率,并实现重试机制,例如使用指数退避算法,以避免频繁触发此错误。响应头通常会包含 `Retry-After` 字段,指示客户端应该在多长时间后重试请求。
针对不同的 HTTP 状态码,您需要采取相应的错误处理策略。 比如,对于 400 错误,需要修复请求参数;对于 401 错误,需要检查身份验证信息;对于 429 错误,需要降低请求频率。除了上述常见的状态码外,还可能遇到其他状态码,例如 500 Internal Server Error(服务器内部错误),表示服务器在处理请求时发生了未知的错误。API 的返回信息(通常是 JSON 格式)通常会包含更具体的错误细节,包括错误代码、错误消息以及可能的解决方案,这对于开发者进行调试和排查问题至关重要。务必仔细阅读API文档,了解各种错误状态码的含义以及相应的处理方法,以便构建健壮可靠的应用程序。
7. 频率限制与API调用规范
Upbit API 实施了严格的频率限制机制,旨在保障平台的稳定性和安全性,防止恶意滥用行为。 为了确保您的应用程序能够稳定运行,并避免因违反频率限制而被临时或永久禁用API访问权限,务必仔细阅读并严格遵守Upbit官方API文档中详细规定的频率限制策略。
Upbit API的频率限制通常会根据不同的API端点、用户的认证级别以及时间窗口等因素进行调整。 您需要根据具体的API接口类型和您的账户级别,合理规划您的API请求频率。 常见的限制可能包括每分钟、每小时或每天允许的最大请求次数。 超过这些限制可能会导致API返回错误代码,例如 429 Too Many Requests,表明请求过多,需要稍后重试。
为了有效地管理API请求频率,建议采取以下措施:
- 阅读官方文档: 仔细阅读Upbit官方API文档,了解每个API端点的具体频率限制。
- 实施请求队列: 创建一个请求队列,将需要发送的API请求放入队列中,并按照一定的速率从队列中取出请求进行发送。
- 使用延迟策略: 在每次API请求后,增加一个短暂的延迟时间,以控制请求的发送速率。
- 缓存API响应: 对于不经常变化的数据,可以考虑缓存API响应结果,避免频繁请求相同的API。
- 处理错误代码: 当API返回错误代码 429 时,应用程序应该能够正确处理,例如等待一段时间后重试,或者降低请求频率。
- 监控API使用情况: 监控您的应用程序的API使用情况,及时发现并解决潜在的频率限制问题。
除了频率限制外,Upbit API还可能对请求的内容和格式进行限制。 请务必确保您的API请求符合Upbit的规范,避免发送无效或恶意请求。 频繁发送不符合规范的请求也可能导致您的API访问权限被限制。
请务必注意,本文档仅提供一些常用的API接口示例,以及关于频率限制的一般性建议。为了获取最准确、最全面的API信息和参数说明,以及最新的频率限制策略,请务必参考Upbit官方API文档。 Upbit可能会定期更新其API文档和频率限制,因此建议您定期查阅官方文档,以确保您的应用程序始终符合最新的要求。