BigONE 交易所 API 接口使用指南
概述
本文档详细指导开发者如何有效利用 BigONE 交易所提供的应用程序编程接口(API)进行程序化交易、市场数据获取以及账户管理等操作。BigONE API 接口提供了一整套全面的功能,允许开发者通过编程方式安全、可靠地访问和集成其平台上的各种核心服务,包括现货交易、合约交易、历史数据查询、以及账户信息管理。此文档将涵盖API密钥的生成与安全管理、认证机制的详细解释、基本HTTP请求方式(包括GET, POST, PUT, DELETE)的规范、以及一些常见的实际应用场景,同时提供基于多种编程语言(如Python, JavaScript)的代码示例,旨在帮助开发者快速理解并上手BigONE API的集成。
BigONE API 接口的设计遵循RESTful原则,采用JSON格式进行数据交换,使得开发者可以方便地构建自动化交易策略、分析市场动态、监控账户状态,并将其集成到自己的应用程序或交易系统中。通过API,开发者可以实现诸如自动下单、取消订单、查询订单状态、获取实时行情数据、计算盈亏等功能,从而提高交易效率,降低人工操作风险。
本指南将重点关注以下几个方面:
- API 密钥管理: 如何生成、存储和保护 API 密钥,以及如何设置权限以确保账户安全。
- 认证机制: 详细介绍 BigONE API 的认证方式,包括时间戳签名、HMAC-SHA256 加密算法等。
- 请求方式: 详细说明如何构造 HTTP 请求,包括请求头、请求参数的设置,以及如何处理 API 返回的数据。
- 数据格式: 介绍 API 返回数据的 JSON 格式,以及如何解析和使用这些数据。
- 错误处理: 如何处理 API 返回的错误信息,以及如何根据错误码进行调试和优化。
- 交易接口: 详细说明如何使用 API 进行下单、取消订单、查询订单状态等操作,以及如何控制交易风险。
- 行情接口: 介绍如何使用 API 获取实时行情数据、历史数据、深度图等信息,以及如何进行数据分析。
- 账户接口: 详细说明如何使用 API 查询账户余额、交易记录、充提币记录等信息,以及如何进行账户管理。
通过本指南,开发者将能够全面了解 BigONE API 的使用方法,并能够快速构建自己的应用程序或交易系统,实现自动化交易和数据分析。
准备工作
在使用 BigONE API 之前,为了确保顺利对接并进行安全操作,你需要完成以下准备工作:
- 注册 BigONE 账户: 访问 BigONE 交易所官方网站,按照注册流程创建一个账户。你需要提供有效的邮箱地址或手机号码进行验证,并设置安全的密码。完成注册后,进行KYC(了解你的客户)身份验证,这有助于提高账户的安全性和交易权限。
-
申请 API Key:
登录你的 BigONE 账户,导航至 API 管理页面(通常位于个人中心或账户设置中)。在此页面,创建一个新的 API Key。创建过程中,你可以设置 API Key 的权限,例如交易、提现、只读等。务必只授予 API Key 执行所需操作的最小权限,以降低潜在的安全风险。创建完成后,系统会生成
access_key
和secret_key
。access_key
用于标识你的身份,secret_key
用于签名请求。请务必妥善保管你的access_key
和secret_key
,将它们存储在安全的地方,切勿泄露给他人。API Key 泄露可能导致你的账户被盗用。 -
选择编程语言和 HTTP 客户端:
根据你的技术背景和项目需求,选择一种你熟悉的编程语言,例如 Python、Java、Node.js、Go 等。选择后,你需要安装一个 HTTP 客户端库,用于发送 HTTP 请求到 BigONE API。例如,对于 Python,常用的库是
requests
;对于 Java,可以使用OkHttp
或HttpClient
;对于 Node.js,可以选择axios
或node-fetch
。这些库提供了方便的 API,可以帮助你轻松地构建和发送 HTTP 请求,并处理 API 返回的响应数据。确保你选择的 HTTP 客户端库支持 HTTPS 协议,以保证数据传输的安全性。
API 认证
BigONE API 采用 API 密钥(API Key)机制进行身份验证,确保请求的合法性和安全性。为了成功通过身份验证,您需要在每个发送至 BigONE API 的 HTTP 请求的头部(Header)中包含以下关键信息,这些信息将用于验证您的身份和请求的完整性:
-
Authorization
: 该头部字段用于携带访问令牌(Access Token)。其标准格式为Bearer
。请务必将 -
BIGONE-SIGN
: 此头部字段包含请求签名(Signature),它是保障数据安全的关键组成部分。请求签名通过特定的算法,基于请求参数、时间戳和您的 Secret Key 生成。BigONE 服务器将使用相同的算法,基于接收到的请求信息和您的 Secret Key 重新计算签名,并与您提供的签名进行比对。如果签名不匹配,则表明请求可能已被篡改或伪造,服务器将拒绝处理该请求。请求签名的生成过程将在后续章节中进行详细阐述,包括算法选择、参数排序、字符串拼接以及哈希运算等步骤。 -
BIGONE-TIMESTAMP
: 此头部字段用于记录请求的时间戳(Timestamp)。时间戳必须为 UTC 时间,精确到秒级。时间戳的作用在于防止重放攻击(Replay Attack)。BigONE 服务器通常会设置一个时间窗口,只有在该时间窗口内收到的请求才会被认为是有效的。如果请求的时间戳与服务器当前时间相差过大,则服务器会拒绝处理该请求,以防止攻击者截获之前的请求并重新发送。建议您在发送 API 请求时,始终使用当前 UTC 时间作为时间戳,以确保请求的有效性。您可以通过编程语言内置的时间函数或在线时间服务获取当前 UTC 时间。
签名生成
BigONE API 采用行业标准的 HMAC-SHA256 算法来确保请求的完整性和安全性,从而生成唯一的签名。 详细的签名生成过程如下:
- 您需要准备好所有用于构建请求的参数。 这些参数包括 API 密钥(API Key)、请求方法(例如 GET、POST、PUT、DELETE)、请求的URL路径以及任何需要传递的查询参数或请求体数据。请确保对这些参数进行正确的编码,特别是 URL 参数,需要进行 URL 编码以避免特殊字符导致签名错误。
\n
换行符连接:
- HTTP 方法(如
GET
或POST
) - 请求的 URI 路径(例如
/v3/markets
) - 请求的时间戳 (
BIGONE-TIMESTAMP
) - 请求的查询字符串(对于
GET
请求)或请求体(对于POST
请求,JSON 格式)
secret_key
作为密钥,对签名字符串进行 HMAC-SHA256 计算。示例 (Python)
以下代码展示了如何使用Python与BigONE交易所的API进行交互。 这段代码片段涵盖了身份验证、请求签名生成以及处理API响应的关键步骤。 为了确保安全性,所有与API的通信都必须经过签名验证。
import hmac
import hashlib
import base64
import time
import requests
import
需要导入必要的Python库:
hmac
用于生成哈希消息认证码,
hashlib
用于SHA256哈希算法,
base64
用于Base64编码,
time
用于获取时间戳,
requests
用于发送HTTP请求,
用于处理JSON数据。
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
base_url = "https://api.big.one"
请务必将
YOUR_ACCESS_KEY
和
YOUR_SECRET_KEY
替换为你在BigONE交易所获得的实际API密钥。
base_url
定义了BigONE API的基本URL。访问密钥 (access_key) 标识你的账户,密钥 (secret_key) 用于对请求进行签名,确保请求的安全性与真实性。
def generate_signature(method, path, timestamp, query_string="", body=""):
message = f"{method}\n{path}\n{timestamp}\n{query_string}\n{body}"
message = message.encode("utf-8")
secret_key_encoded = secret_key.encode("utf-8")
signature = hmac.new(secret_key_encoded, message, hashlib.sha256).digest()
signature_b64 = base64.b64encode(signature).decode("utf-8")
return signature_b64
generate_signature
函数负责生成请求签名。 它接受HTTP方法(例如GET、POST)、API路径、时间戳、查询字符串和请求体作为输入。 然后,它将这些参数连接成一个字符串,使用UTF-8编码,并使用你的
secret_key
通过HMAC-SHA256算法对其进行哈希处理。 将生成的哈希值进行Base64编码,得到最终的签名。
def make_request(method, path, params=None, data=None):
timestamp = str(int(time.time()))
query_string = ""
body = ""
make_request
函数用于构造并发送API请求。 它接受HTTP方法、API路径、查询参数和请求数据作为输入。 它获取当前时间戳,并将其转换为字符串格式。 如果提供了查询参数,它会将它们格式化为查询字符串,并附加到API路径中。 如果提供了请求数据,它会将数据序列化为JSON格式。
if params:
query_string = "&".join([f"{k}={v}" for k, v in params.items()])
path += "?" + query_string
if data:
body = .dumps(data)
signature = generate_signature(method, path, timestamp, query_string, body)
headers = {
"Authorization": f"Bearer {access_key}",
"BIGONE-SIGN": signature,
"BIGONE-TIMESTAMP": timestamp,
"Content-Type": "application/" # Add Content-Type for POST requests
}
url = base_url + path
try:
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
response = requests.post(url, headers=headers, data=body)
elif method == "PUT":
response = requests.put(url, headers=headers, data=body)
elif method == "DELETE":
response = requests.delete(url, headers=headers)
else:
print("Unsupported HTTP method")
return None
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
return response.()
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
return None
except .JSONDecodeError as e:
print(f"Failed to decode JSON response: {e}")
print(f"Response text: {response.text}") # Print raw response for debugging
return None
接下来,使用生成的签名、时间戳和访问密钥创建HTTP头部。
Authorization
头部使用Bearer Token认证方案,其中包含你的
access_key
。
BIGONE-SIGN
头部包含请求签名,
BIGONE-TIMESTAMP
头部包含时间戳。 对于POST、PUT请求,需要设置
Content-Type
为
application/
,表明请求体是JSON格式的数据。
使用
requests
库发送HTTP请求。 根据HTTP方法,选择相应的函数(
get
、
post
、
put
、
delete
)。 发送请求时,将头部信息、查询参数和请求数据传递给
requests
库。 为了处理潜在的错误,代码使用
try...except
块捕获
requests.exceptions.RequestException
和
.JSONDecodeError
异常。 如果API返回错误状态码(4xx或5xx),
response.raise_for_status()
会抛出一个HTTPError异常。 如果响应是JSON格式,则使用
response.()
解析JSON数据,并将其作为Python字典返回。 如果解析JSON失败,则打印原始响应文本以进行调试。
常用 API 接口示例
1. 获取所有交易对
获取所有交易对
本段代码展示了如何通过API接口获取交易所支持的所有交易对信息。交易对,也称为市场,是指两种可以相互交易的数字资产,例如BTC/USDT(比特币兑换泰达币)。获取交易对信息对于分析市场趋势、确定交易策略至关重要。
markets = make_request("GET", "/v3/markets")
这行代码使用
make_request
函数向交易所的API发起一个GET请求。
"GET"
指定了HTTP请求方法,
"/v3/markets"
是API的端点,通常用于获取交易对列表。API的版本号 (
v3
) 也包含在端点中,表明调用的是交易所API的第三个版本。
make_request
函数负责处理与API的通信细节,例如构建HTTP请求、发送请求以及接收和解析API的响应。
if markets:
这部分代码检查API请求是否成功。如果
markets
变量包含有效数据(即API成功返回了交易对信息),则执行后续的代码块。如果请求失败(例如,由于网络错误、API密钥无效或服务器错误),
markets
变量可能为空或包含错误信息,因此需要进行检查。
print(.dumps(markets, indent=4)) # Pretty print for readability
如果API请求成功,这行代码会将
markets
变量中的数据以格式化的JSON字符串形式打印到控制台。
.dumps()
函数将Python对象转换为JSON字符串。
indent=4
参数指定了JSON字符串的缩进级别为4个空格,这使得输出更易于阅读和理解。清晰的格式化输出对于调试和数据分析非常重要。
else:
如果API请求失败,则执行
else
代码块。
print("Failed to retrieve markets.")
这行代码向控制台输出一条错误消息,表明获取交易对信息失败。这有助于用户了解API请求存在问题,并采取相应的措施,例如检查网络连接、API密钥或联系交易所的技术支持。
2. 获取指定交易对的行情数据
获取 BTC/USDT 交易对的行情数据
在加密货币交易中,获取特定交易对(例如BTC/USDT)的实时行情数据至关重要。以下代码演示了如何通过API请求获取此类数据。
ticker = make_request("GET", "/v3/markets/BTC-USDT/ticker")
这行代码的核心在于使用
make_request
函数向指定的API端点发送一个"GET"请求。API端点
/v3/markets/BTC-USDT/ticker
专门用于提供BTC/USDT交易对的ticker信息。
make_request
函数的作用是封装了网络请求的细节,简化了API交互的过程。返回值
ticker
将包含从API服务器返回的原始数据。
if ticker:
成功发送请求后,需要验证是否成功接收到了数据。这个简单的条件语句检查
ticker
变量是否包含有效的数据。如果请求失败或API服务器返回错误,
ticker
可能为空或为None。
print(.dumps(ticker, indent=4))
假设成功获取了ticker数据,下一步是将数据以易于阅读的格式打印出来。
.dumps(ticker, indent=4)
的作用是将Python字典(
ticker
)转换为JSON字符串,并使用缩进(
indent=4
)使其具有良好的可读性。这样可以方便地查看和分析返回的数据结构和内容。通常,ticker数据包含诸如最新成交价、最高价、最低价、成交量等信息。
else:
如果
ticker
为空(意味着请求失败),则执行
else
分支。
print("Failed to retrieve ticker data.")
这条语句简单地打印一条错误消息,表明未能成功获取ticker数据。在实际应用中,你可能需要添加更详细的错误处理机制,例如记录错误日志或重试请求。
3. 创建订单
创建一个限价买单
在加密货币交易中,限价买单是一种允许交易者以特定价格或更低价格购买资产的订单类型。这与市价单不同,市价单会立即以最佳可用价格执行。以下是如何创建一个限价买单的示例,数据采用JSON格式进行组织,便于程序解析和处理:
order_data = {
"market_id": "BTC-USDT",
"side": "BUY",
"type": "LIMIT",
"price": "27000",
"amount": "0.01"
}
参数解释:
-
market_id
: 指定交易的市场,例如 "BTC-USDT" 表示比特币兑 USDT 的交易对。 -
side
: 表示交易方向,"BUY" 代表买入,"SELL" 代表卖出。 -
type
: 定义订单类型,"LIMIT" 指限价单。 -
price
: 设定期望的买入价格,只有当市场价格达到或低于此价格时,订单才会执行。在本例中,价格设置为 27000 USDT。 -
amount
: 指示要购买的资产数量,这里表示购买 0.01 个比特币。
创建订单的流程通常涉及向交易平台的API发送POST请求。以下是示例代码,展示如何使用
make_request
函数发送请求,并处理响应:
new_order = make_request("POST", "/v3/orders", data=order_data)
if new_order:
print(.dumps(new_order, indent=4))
else:
print("Failed to create order.")
代码解释:
-
make_request("POST", "/v3/orders", data=order_data)
: 这是一个假设的函数,负责向交易平台的 "/v3/orders" 端点发送 POST 请求,其中包含了订单数据order_data
。 实际的API端点和请求方法可能因交易所而异。需要根据具体交易所的API文档进行调整。 确保你的 API 密钥具有创建订单的权限。 -
if new_order:
: 检查请求是否成功。 如果new_order
返回值不为空,则表示订单创建成功。 -
print(.dumps(new_order, indent=4))
: 如果订单创建成功,则将返回的订单信息以易于阅读的格式打印出来。.dumps
函数将 Python 对象转换为 JSON 字符串,indent=4
参数用于格式化输出,使其具有 4 个空格的缩进。 -
else: print("Failed to create order.")
: 如果订单创建失败,则打印一条错误消息。需要根据交易所返回的具体错误信息进行调试。 常见的错误包括:余额不足、API 密钥无效、参数错误等。
注意事项:
- API 密钥管理: 安全地存储和管理你的 API 密钥至关重要。避免将密钥硬编码到代码中,推荐使用环境变量或配置文件。
- 错误处理: 在实际应用中,需要更完善的错误处理机制,例如重试机制、日志记录等。
- 交易费用: 创建订单时,需要考虑交易费用。不同的交易所可能有不同的费用结构。
- 市场波动: 加密货币市场波动剧烈,限价单可能无法立即成交。
- 身份验证: 确保你的请求包含正确的身份验证信息(例如 API 密钥),以便交易平台验证你的身份。
- 速率限制: 许多交易平台对 API 请求的频率有限制。需要根据平台的速率限制规则进行调整,避免触发限流。
4. 查询订单
查询指定订单
查询特定订单的信息是交易管理的重要组成部分。通过订单ID,我们可以获取订单的详细状态,例如订单类型、价格、数量、成交情况等。
要查询指定订单,你需要使用订单的唯一标识符,即订单ID。将
"YOUR_ORDER_ID"
替换为你需要查询的实际订单ID。
order_id = "YOUR_ORDER_ID" # 替换成实际订单 ID
order = make_request("GET", f"/v3/orders/{order_id}")
if order:
print(.dumps(order, indent=4))
else:
print("未能检索到订单信息。")
上述代码片段展示了如何通过
make_request
函数向API发起GET请求,请求的URL包含了订单ID。
/v3/orders/{order_id}
是API的端点,用于获取特定ID的订单信息。
如果请求成功,API将返回包含订单详细信息的JSON对象。
.dumps(order, indent=4)
会将JSON对象格式化输出,提高可读性。
indent=4
参数表示使用4个空格进行缩进。
如果请求失败(例如,订单ID不存在或API出现问题),程序将输出"未能检索到订单信息。"。
请确保
make_request
函数已经正确实现,并且能够处理API的认证和错误。
5. 撤销订单
撤销指定订单
在加密货币交易过程中,撤销订单是一个常见的操作。以下代码演示了如何通过API接口撤销一个指定的订单。要执行此操作,你需要替换代码中的
YOUR_ORDER_ID
为实际的订单ID。订单ID是唯一标识符,用于在交易所系统中精确定位需要取消的订单。
order_id = "YOUR_ORDER_ID" # 替换成实际订单 ID
这段代码定义了一个变量
order_id
,用于存储要撤销的订单的ID。请务必将
YOUR_ORDER_ID
替换为你希望取消的订单的实际ID。确保订单ID的准确性至关重要,错误的ID会导致取消错误的订单,从而造成不必要的损失。
cancel_order = make_request("DELETE", f"/v3/orders/{order_id}")
这行代码调用
make_request
函数,该函数负责向交易所的API发送请求。这里使用了
DELETE
方法,这是RESTful API中用于删除资源的标准方法。
f"/v3/orders/{order_id}"
是API的端点,其中
/v3/orders/
指示订单管理API的路径,而
{order_id}
会被替换为实际的订单ID。
make_request
函数需要正确配置API密钥和签名,以确保请求的安全性。通常,交易所会要求使用API密钥进行身份验证,并使用签名算法(如HMAC)来防止请求被篡改。请参考交易所的API文档,了解如何正确配置
make_request
函数。
if cancel_order:
print(.dumps(cancel_order, indent=4))
else:
print("Failed to cancel order.")
这段代码检查
cancel_order
变量的值。如果
cancel_order
返回了一个有效的结果(通常是一个JSON对象,包含了订单取消的信息),那么代码会使用
.dumps
函数将结果格式化为易于阅读的JSON字符串,并打印到控制台。
indent=4
参数用于设置JSON字符串的缩进,使其更易于阅读。如果
cancel_order
返回
None
或者其他表示失败的值,那么代码会打印一条错误消息
"Failed to cancel order."
,提示订单取消失败。订单取消失败的原因可能包括:订单已经成交、订单不存在、API密钥无效、权限不足等等。请检查API请求的参数和配置,并参考交易所的API文档,排查错误原因。
错误处理
BigONE API 在发生错误时,会遵循标准的 HTTP 协议,返回相应的 HTTP 状态码和 JSON 格式的错误信息。开发者需要仔细解析返回的状态码和错误信息,并根据具体的错误类型采取适当的应对措施。正确处理错误信息对于构建健壮和可靠的应用程序至关重要。
-
400 Bad Request
: 此错误表示客户端发送的请求存在问题,例如请求参数缺失、格式错误或参数值无效。开发者应仔细检查请求参数,确保符合 API 文档的要求。常见原因包括数据类型不匹配、缺少必填字段、或者参数值超出允许范围。 -
401 Unauthorized
: 身份验证失败。这意味着客户端提供的 API 密钥或访问令牌无效或已过期,或者客户端没有提供必要的身份验证信息。开发者需要检查 API 密钥是否正确配置,并确保使用了正确的身份验证方法。重新生成或获取新的API密钥可以解决此问题。 -
403 Forbidden
: 权限不足。客户端已通过身份验证,但无权访问请求的资源。这可能是由于用户的 API 密钥权限不足,或者请求的资源需要更高的权限级别。开发者需要检查 API 密钥的权限设置,并确保拥有访问所需资源的权限。联系BigONE支持可以获得权限升级。 -
404 Not Found
: 请求的资源不存在。这意味着客户端请求的 API 端点或资源不存在。开发者应仔细检查请求的 URL 是否正确,并确保请求的资源已在 BigONE 平台上存在。检查URL拼写错误和确保资源ID正确是排查此问题的关键。 -
429 Too Many Requests
: 请求过于频繁,触发了速率限制。为了保护 API 的稳定性和可用性,BigONE API 对请求频率进行了限制。当客户端在短时间内发送大量请求时,会触发此错误。开发者应该实现速率限制机制,例如使用退避算法或缓存机制,以减少请求频率。参考API文档中的速率限制规范非常重要。 -
500 Internal Server Error
: 服务器内部错误。这表示 BigONE 服务器在处理请求时遇到了未知的错误。这通常是服务器端的问题,客户端无法直接解决。开发者应记录错误信息,并联系 BigONE 技术支持寻求帮助。服务器内部错误可能由多种因素引起,需要 BigONE 团队进行调查和修复。
在你的代码中,务必包含完善的错误处理机制。使用
try-except
或
try-catch
块来捕获可能发生的异常,并记录详细的错误日志,包括错误代码、错误信息、请求 URL 和请求参数等。这些日志对于调试和问题排查至关重要。可以考虑实现重试机制,在遇到暂时性错误时自动重试请求。在生产环境中,监控API请求的错误率,以便及时发现和解决问题。
速率限制
BigONE API 为了保障系统稳定性和公平性,对请求频率设置了严格的限制。如果客户端的请求频率超过了预设的阈值,API 将会采取限流措施,暂时拒绝该客户端的请求。因此,开发者在使用 BigONE API 时,必须仔细阅读官方文档中关于速率限制的详细说明,并根据自身应用的特点,在代码中实现有效的限流机制,以避免因请求过于频繁而被限制访问。
BigONE API 的速率限制规则可能包括针对不同 API 接口的限制、针对不同用户的限制、以及针对不同时间段的限制。具体规则请参考 BigONE 官方文档。
常用的限流算法主要有以下几种:
- 令牌桶算法: 令牌桶算法模拟一个固定容量的桶,系统以恒定的速率向桶中放入令牌。每个请求都需要从桶中获取一个令牌才能被处理。如果桶中没有足够的令牌,请求将被拒绝。这种算法允许一定程度的突发流量,因为桶中可以积累一定数量的令牌。开发者可以通过调整令牌桶的容量和令牌生成速率来控制请求的平均速率和最大突发速率。
- 漏桶算法: 漏桶算法模拟一个固定容量的桶,请求流入桶中,然后以恒定的速率从桶中流出。如果请求的速率超过了桶的流出速率,请求将被放入队列中等待处理。这种算法可以平滑请求的流量,避免突发流量对系统造成冲击。开发者可以通过调整漏桶的容量和流出速率来控制请求的平均速率。
- 滑动窗口算法: 滑动窗口算法记录一段时间内的请求次数。当新的请求到来时,算法会检查当前窗口内的请求次数是否超过了限制。如果超过了限制,请求将被拒绝。滑动窗口会随着时间的推移而滑动,以便允许新的请求进入。开发者可以通过调整窗口的大小和最大请求次数来控制请求的速率。
开发者可以根据自身应用的特点和需求,选择合适的限流算法。一些编程语言和框架也提供了现成的限流库,可以方便地实现限流功能。
请务必遵守 BigONE 的速率限制规则,合理控制 API 请求的频率,以避免因违反规则而被禁止访问 API,影响应用的正常运行。如果遇到 API 访问受限的情况,建议检查代码中是否存在请求过于频繁的问题,并根据 BigONE 官方文档的建议进行调整。