如何用Binance做API交易
在加密货币交易的世界里,API交易提供了传统手动交易无法比拟的速度、效率和自动化优势。对于希望利用复杂算法、自定义交易策略或简单地自动化日常交易流程的交易者来说,Binance API 是一个强大的工具。本文将引导您了解如何使用 Binance API 进行交易,涵盖从设置环境到执行交易的关键步骤。
1. 理解API与交易类型
Binance API 是一套强大的接口,它允许开发者通过编程方式与 Binance 数字资产交易所进行无缝交互。通过 API,您可以自动化执行各种操作,例如实时获取市场行情数据、创建和管理订单、查询账户余额和交易历史等。要有效地利用 Binance API,理解其提供的不同类型的 API 密钥以及支持的交易类型至关重要。
在使用 Binance API 之前,您需要创建 API 密钥。Binance 提供了三种主要的 API 密钥类型,每种密钥都具有不同的权限级别,旨在满足不同的安全需求:
- 只读 (Read-Only): 此类密钥权限最低,仅允许您获取市场数据(如价格、交易量等)和账户信息(如余额、历史交易记录等)。您无法使用此密钥进行任何交易操作,如下单、撤单等。适用于数据分析、监控等场景。
- 交易 (Trade): 交易密钥允许您执行交易操作,包括下单(买入和卖出)、撤单等。但您无法使用此密钥进行提现操作,从而保证您的资金安全。这是开发交易机器人最常用的密钥类型。
- 提现 (Withdrawal): 提现密钥权限最高,允许您执行提现操作,将数字资产从 Binance 账户转移到其他地址。为了安全起见,强烈建议不要将此密钥用于交易机器人或不信任的应用,并采取额外的安全措施,如启用两步验证(2FA)。
出于安全考虑,强烈建议您遵循最小权限原则,仅为 API 密钥分配执行特定任务所需的最低权限。例如,如果您正在开发一个交易机器人,则只需分配 "交易" 权限即可,无需分配 "提现" 权限,从而降低潜在的安全风险。
Binance API 支持多种交易类型,其中最常见的两种是:
- 现货交易 (Spot Trading): 这是最基础的交易类型,允许您使用账户中现有的数字资产直接进行交易。例如,您可以使用账户中的 USDT 购买 BTC,或者使用 BTC 卖出换取 USDT。
- 杠杆交易 (Margin Trading): 杠杆交易允许您从 Binance 借入资金,从而放大您的交易头寸。例如,如果您使用 2 倍杠杆,则您可以用 100 USDT 的本金交易价值 200 USDT 的数字资产。杠杆交易可以放大盈利,但同时也会放大亏损,因此具有较高的风险。
本文的重点将放在现货交易上,深入探讨如何使用 Binance API 进行现货交易。然而,许多概念和技术原则也同样适用于杠杆交易,您可以通过学习现货交易的基础知识,为进一步探索杠杆交易打下坚实的基础。务必在进行任何交易前充分了解相关风险。
2. 创建API密钥
为了实现自动化的交易策略或访问币安平台的各种服务,您需要在币安账户中创建并配置API密钥。API密钥允许您的应用程序(如交易机器人)安全地与币安交易所进行交互,而无需共享您的账户密码。
- 登录您的币安账户。 使用您的用户名和密码,通过官方网站或币安App登录您的个人账户。确保您访问的是官方且安全的币安平台,以避免钓鱼攻击。
- 访问API管理页面。 登录后,将鼠标悬停在用户图标上(通常位于页面右上角),在下拉菜单中找到并点击“API管理”选项。这将带您进入API密钥的管理页面。
- 创建新的API密钥。 在API管理页面,您会看到一个创建API密钥的选项。为您的API密钥指定一个易于识别的标签,例如“MyTradingBot”、“StrategyAlpha”或“PortfolioManager”。清晰的标签有助于您区分不同的API密钥,方便日后管理。
- 完成安全验证。 为了验证您的身份并确保API密钥的安全,币安会要求您完成额外的安全验证。这通常包括使用Google验证器生成的验证码、短信验证码或电子邮件验证码。请按照页面提示完成验证流程。
- 保存API Key和Secret Key。 密钥创建成功后,系统会生成一个 API Key 和一个 Secret Key 。API Key相当于您的用户名,用于识别您的应用程序。 Secret Key 相当于您的密码,用于验证您的请求。 请务必妥善保管Secret Key,因为它只会在创建时显示一次。 强烈建议将其存储在安全的地方,例如密码管理器或加密的文档中。如果您丢失了Secret Key,将无法恢复,需要重新生成新的API密钥。
- 配置API权限。 为了最大限度地降低风险,您需要仔细配置API密钥的权限。找到"编辑API限制"或类似的选项,并根据您的需求进行设置。对于交易机器人,通常需要启用"启用现货&杠杆交易"权限。请勿授予超出您实际需求的权限。
- 限制IP访问(强烈推荐)。 限制IP访问是提高API密钥安全性的重要措施。建议您仅允许特定的IP地址访问API。这样,即使API Key和Secret Key泄露,未经授权的IP地址也无法使用您的API密钥。您可以指定单个IP地址,或IP地址范围。如果您不确定您的IP地址,可以使用在线工具查询。配置完成后,请务必保存您的设置。
3. 设置开发环境
为了高效开发和测试 API 交易脚本,建立一个完善的开发环境至关重要。Python 因其简洁的语法和强大的生态系统,在加密货币交易领域被广泛采用。它拥有大量的库,可以简化与交易所 API 的交互,并提供数据分析和回测工具。
-
安装 Python:
如果您的计算机上尚未安装 Python,请访问官方网站
python.org
下载并安装最新稳定版本。请务必选择与您的操作系统相匹配的版本,并在安装过程中勾选“Add Python to PATH”选项,以便在命令行中直接使用 Python。安装完成后,您可以在终端或命令提示符中输入
python --version
或python3 --version
来验证 Python 是否成功安装。建议安装 pip,即 Python 的包管理器,它将简化后续库的安装过程。 -
安装必要的库:
python-binance
库为与币安 API 进行交互提供了一个便捷的接口。它封装了复杂的 HTTP 请求和响应处理,允许开发者专注于交易逻辑的实现。通过 pip 包管理器,可以轻松安装python-binance
库。打开终端或命令提示符,并执行以下命令:pip install python-binance
如果您的系统同时安装了 Python 2 和 Python 3,您可能需要使用
pip3
命令来安装 Python 3 版本的库:pip3 install python-binance
为了验证
python-binance
库是否成功安装,可以在 Python 解释器中导入该库:python import binance print(binance.__version__)
如果成功导入且输出了版本号,则表明
python-binance
库已正确安装。除了
python-binance
,您可能还需要安装其他库来辅助开发,例如:-
pandas
: 用于数据分析和处理。 -
numpy
: 用于科学计算。 -
requests
: 用于发送 HTTP 请求 (如果需要自定义 API 调用)。 -
ta-lib
: 用于技术指标计算 (如果需要进行技术分析)。
您可以使用类似的 pip 命令来安装这些库:
pip install pandas numpy requests ta-lib
-
4. 编写交易脚本
在搭建好环境并配置好API密钥后,您就可以开始编写您的交易脚本了。交易脚本是自动化交易策略的核心,它负责执行下单、撤单、监控市场等关键操作。脚本的编写语言可以是Python、JavaScript等,选择哪种语言取决于您的熟悉程度和可用库的支持情况。
以下是一个使用Python编写的示例脚本,它利用
python-binance
库从Binance API获取BTC/USDT的当前价格,并根据获取的价格创建一个限价买单。 请注意,这仅仅是一个演示,实际交易策略可能需要更复杂的逻辑和风险管理机制。
你需要安装
python-binance
库。 在命令行中执行:
pip install python-binance
以下是示例代码:
from binance.client import Client
# 替换为你的API密钥和秘钥
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
# 创建Binance客户端实例
client = Client(api_key, api_secret)
# 定义交易对和交易参数
symbol = 'BTCUSDT'
quantity = 0.001 # 交易数量
price_offset = 0.01 # 价格偏移量
try:
# 获取当前BTC/USDT的价格
ticker = client.get_ticker(symbol=symbol)
current_price = float(ticker['lastPrice'])
# 计算买入价格 (低于当前价格)
buy_price = current_price - price_offset
# 创建限价买单
order = client.order_limit_buy(
symbol=symbol,
quantity=quantity,
price=buy_price
)
print(f"已创建限价买单: {order}")
except Exception as e:
print(f"发生错误: {e}")
from binance.client import Client
替换为您的 API Key 和 Secret Key
在代码中,您需要将占位符替换为您真实的 API Key 和 Secret Key。 API Key 用于标识您的身份,而 Secret Key 则用于对您的请求进行签名,确保安全性。
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
api_key
变量存储您的公共 API 密钥,相当于您的用户名。请妥善保管,不要泄露给他人。
api_secret
变量存储您的私有密钥,相当于您的密码。这是访问您的账户和执行交易的关键,绝对不能泄露。如果怀疑密钥已泄露,请立即更换。
client = Client(api_key, api_secret)
这行代码使用您的 API Key 和 Secret Key 初始化客户端对象。客户端对象将用于与交易所的 API 进行交互,例如获取市场数据、下单等。请确保您使用的
Client
类来自官方或可信赖的第三方库,以避免安全风险。不同的交易所或SDK可能有不同的客户端初始化方法,请参考对应的文档。
获取 BTC/USDT 的当前价格
在加密货币交易中,实时获取资产对(例如 BTC/USDT)的价格信息至关重要。交易所通常提供应用程序编程接口 (API),允许开发者以编程方式访问这些数据。以下是如何使用 API 获取 BTC/USDT 当前价格的示例,其中假设您已经配置好了与交易所的连接,并初始化了一个名为 `client` 的客户端对象。
ticker = client.get_ticker(symbol='BTCUSDT')
上述代码段调用了客户端对象的
get_ticker
方法。该方法接受一个参数
symbol
,指定了要查询的交易对。在这个例子中,我们传入 'BTCUSDT',表示我们想要获取比特币(BTC)兑美元稳定币 USDT 的相关信息。
get_ticker
方法会向交易所的服务器发送请求,并返回一个包含交易对相关数据的字典。这些数据通常包括但不限于最新成交价、最高价、最低价、交易量等。
price = float(ticker['lastPrice'])
接下来,我们需要从返回的
ticker
字典中提取最新成交价。我们使用
ticker['lastPrice']
来访问
ticker
字典中键为 'lastPrice' 的值。由于交易所 API 返回的数据通常是字符串类型,我们需要将其转换为浮点数类型,以便进行后续的数值计算。
float()
函数用于将字符串转换为浮点数。转换后的价格存储在名为
price
的变量中。
print(f"BTC/USDT 当前价格: {price}")
我们使用
print()
函数将 BTC/USDT 的当前价格输出到控制台。这里使用了 f-字符串(格式化字符串字面量)来方便地将变量
price
的值嵌入到字符串中。输出结果类似于 "BTC/USDT 当前价格: 27000.50",其中 27000.50 是 BTC/USDT 的最新成交价。请注意,实际的价格会根据市场波动而变化。这段代码提供了获取并展示特定交易对当前价格的简单方法,可以方便地集成到自动交易程序、价格监控工具或其他加密货币相关的应用中。务必查阅你所使用交易所API的官方文档,以了解如何正确配置你的客户端,如何处理潜在的错误以及交易所关于API使用的具体限制。
定义交易参数
在加密货币交易中,精确定义交易参数至关重要。这些参数直接影响交易的执行,风险管理以及潜在收益。以下是对常用交易参数的详细解释:
symbol = 'BTCUSDT'
symbol
代表交易对,例如本例中的 'BTCUSDT'。它指定了要交易的两种加密货币。 'BTC' 代表比特币,'USDT' 代表 Tether,一种与美元挂钩的稳定币。 因此,'BTCUSDT' 表示以 USDT 购买或出售比特币的交易对。 选择正确的交易对是交易的第一步,确保交易者在期望的市场中进行操作。不同交易所的symbol命名规则可能存在差异,需要根据具体交易所的API文档进行调整。
quantity = 0.001
quantity
定义了交易的数量。在本例中,
quantity = 0.001
表示购买或出售 0.001 个比特币。 交易数量的选择应基于交易者的风险承受能力、账户余额和市场波动性。 小批量交易有助于降低风险,尤其是在高波动性市场中。 请注意,不同的加密货币交易所对最小交易数量有限制,小于该限制的交易可能无法执行。 实际应用中,交易数量的计算通常会考虑交易费用的影响。
buy_price = price - 10
buy_price
指定了购买的理想价格。 在本例中,
buy_price = price - 10
表示以低于当前市场价格 10 美元的价格购买比特币。 这种策略被称为限价单,交易只有在市场价格达到或低于指定价格时才会执行。
price
变量代表当前市场价格,需要从交易所的实时数据流中获取。 使用限价单允许交易者控制购买价格,但不能保证交易一定会执行。如果市场价格没有达到设定的
buy_price
,订单将一直挂起,直到被取消。 还需要考虑滑点的影响,在高波动市场中,实际成交价格可能与预期价格存在差异。
创建一个限价买单
在加密货币交易中,限价买单允许您以指定的价格购买一定数量的加密货币。以下代码展示了如何使用Python Binance API创建一个限价买单。该买单只有在市场价格达到或低于您设定的价格时才会执行。
该示例中,我们使用
client.order_limit_buy()
函数来创建一个限价买单。你需要提供以下参数:
-
symbol
: 交易对,例如 "BTCUSDT"。 这是您要购买的加密货币及其交易结算货币的组合。 -
quantity
: 要购买的加密货币数量。 请注意,此数量应符合交易所的最小交易单位要求。 -
price
: 您愿意购买加密货币的最高价格。 只有当市场价格等于或低于此价格时,订单才会成交。
代码示例如下:
try:
order = client.order_limit_buy(
symbol=symbol,
quantity=quantity,
price=buy_price
)
print(f"限价买单已创建: {order}")
except Exception as e:
print(f"创建订单时发生错误: {e}")
代码解释:
-
try...except
块用于捕获可能发生的异常,例如网络问题、API 密钥错误或无效的参数。 -
client.order_limit_buy()
函数返回一个包含订单信息的字典。 此信息包括订单ID、交易对、订单类型、订单状态等。 -
symbol
变量代表交易对,如 "BTCUSDT"。 -
quantity
变量定义了要购买的加密货币数量。 -
buy_price
变量指定了您愿意购买加密货币的最高价格。 - 如果订单成功创建,将打印订单信息。
- 如果创建订单时发生错误,将打印错误信息。
注意事项:
- 在创建限价买单之前,请确保您已经设置了正确的 API 密钥和权限。
- 请仔细检查您输入的参数,例如交易对、数量和价格。错误的参数可能导致订单无法执行或意外的损失。
- 限价买单不保证一定成交。如果市场价格一直高于您设定的价格,订单将不会成交。
- 请注意,交易所可能会收取交易手续费。
- 建议使用适当的风险管理策略,例如设置止损单,以限制潜在的损失。
代码解释:
-
from binance.client import Client
: 从python-binance
库中导入Client
类。该类是与币安API交互的核心,提供了访问各种币安服务所需的方法。您需要先安装此库才能使用。 -
api_key = 'YOUR_API_KEY'
和api_secret = 'YOUR_API_SECRET'
: 将YOUR_API_KEY
和YOUR_API_SECRET
替换为你在币安账户生成的实际 API Key 和 Secret Key。 务必妥善保管Secret Key,不要泄露给他人,否则可能导致资产损失。API Key 允许你的代码访问你的币安账户,并执行交易等操作。 -
client = Client(api_key, api_secret)
: 创建一个 Binance 客户端实例。该实例使用你的API Key和Secret Key进行身份验证,以便与币安服务器建立连接。通过这个客户端实例,你可以调用各种API方法,例如获取市场数据、下单、查询账户信息等。 -
ticker = client.get_ticker(symbol='BTCUSDT')
: 获取 BTC/USDT 交易对的当前价格。get_ticker
方法返回一个包含各种市场数据的字典,包括最高价、最低价、成交量以及最近成交价。 -
price = float(ticker['lastPrice'])
: 从ticker
字典中提取lastPrice
(最近成交价) 并将其转换为浮点数类型。 这是因为从API获取的数据通常是字符串类型,进行后续计算需要转换为数值类型。 -
order = client.order_limit_buy(...)
: 创建一个限价买单。 限价单是指以指定的价格或更低的价格购买一定数量的资产。只有当市场价格达到或低于你指定的价格时,该订单才会被执行。-
symbol
: 指定交易对,例如BTCUSDT
表示比特币兑USDT。 币安支持多种交易对,你可以根据需要选择合适的交易对。 -
quantity
: 指定要购买的数量,单位是交易对中的基础货币(例如BTCUSDT,基础货币是BTC)。 确保账户有足够的USDT余额来支付购买的比特币。 -
price
: 指定购买价格。 这是你愿意支付的最高价格,只有当市场价格达到或低于这个价格时,订单才会被执行。 如果价格设置过高,订单可能会立即成交,变成市价单。如果价格设置过低,订单可能永远无法成交。 -
可选参数: 你还可以设置订单的有效期,例如
timeInForce='GTC'
(Good Till Cancelled) 表示订单会一直有效,直到被取消或完全成交。
-
-
try...except
: 使用try...except
块来捕获和处理可能发生的异常。 例如,网络连接错误、API 密钥无效、账户余额不足等情况都可能导致异常。 通过捕获异常,你可以避免程序崩溃,并向用户显示有用的错误信息。 需要详细记录错误日志,便于排查问题。
5. 运行交易脚本
完成脚本的编写和配置后,下一步是执行它。确保您的 Python 脚本(例如,
trade.py
)已保存到您的工作目录中。打开您的终端或命令提示符,导航到该目录,并使用以下命令运行脚本:
bash
python trade.py
运行脚本后,它将连接到 Binance API,检索 BTC/USDT 的当前市场价格,并根据您设定的参数创建一个限价买单。如果一切顺利,您应该在终端窗口中看到类似以下内容的输出:
- 当前 BTC/USDT 价格
- 已创建订单的详细信息,包括订单类型、价格、数量等
- 交易是否成功执行
为了验证订单是否已成功提交到 Binance,请登录您的 Binance 账户,并导航至 "订单历史" 页面。您应该能够在此处找到您刚刚创建的限价买单。订单状态将显示为 "已提交" 或 "待成交",直到满足指定价格时才会执行。
6. 监控和管理您的交易
一旦您的交易脚本开始运行,持续的监控和有效的管理是至关重要的。这不仅能帮助您及时发现并解决潜在问题,还能优化您的交易策略,提升盈利能力。
-
检查订单状态:
使用
client.get_order(symbol=symbol, orderId=order['orderId'])
函数,您可以实时查询订单的当前状态。订单状态包括但不限于:NEW (新订单)、PARTIALLY_FILLED (部分成交)、FILLED (完全成交)、CANCELED (已取消)、REJECTED (已拒绝)、EXPIRED (已过期)。通过监控订单状态,您可以及时了解订单的执行情况,并根据需要采取相应措施。例如,如果订单长时间处于 NEW 状态,可能需要检查网络连接或市场深度。 -
取消订单:
使用
client.cancel_order(symbol=symbol, orderId=order['orderId'])
函数可以取消尚未完全成交的订单。取消订单的时机非常重要,如果市场行情发生逆转,或者发现订单参数设置错误,及时取消订单可以有效避免损失。请注意,取消订单可能会产生少量手续费。您应确保理解交易所的订单取消策略,并谨慎操作。 -
处理错误:
仔细阅读 API 返回的错误消息至关重要。这些错误消息通常包含有关问题的详细信息,例如无效的API密钥、错误的参数、账户余额不足或市场维护。API错误码和对应的含义通常可以在交易所的API文档中找到。根据错误消息,采取适当的措施解决问题。例如,如果遇到
InsufficientFunds
错误,表示账户余额不足,需要增加资金。处理错误时,务必保持冷静,避免盲目操作导致更大的损失。 - 日志记录: 在您的交易脚本中添加详细的日志记录功能是必不可少的。日志记录可以帮助您跟踪交易活动,记录订单的创建、修改和取消,以及交易的成交价格和数量。通过分析日志,您可以识别潜在的问题,例如交易执行延迟、订单成交异常或策略逻辑错误。良好的日志记录不仅可以方便您进行调试和优化,还可以作为风险管理的依据,帮助您评估交易策略的有效性。建议记录包括时间戳、订单ID、交易对、交易方向(买入/卖出)、委托价格、委托数量、成交价格、成交数量以及任何相关的错误信息。
7. 更高级的功能
一旦您熟练掌握了基本的 API 交易,您就可以进一步探索并利用更高级的功能,从而优化您的交易策略并更有效地管理风险。
- 实时市场数据流 (WebSockets): 利用 WebSockets 技术,您可以建立持久连接,实时接收关键的市场数据更新,例如最新成交价格、深度订单簿变化、交易量统计以及其他相关市场活动。这种高速的数据流使您能够对市场变化做出迅速反应,并执行基于最新信息的交易决策,显著提升您的交易策略的效率和响应能力。 相较于传统的REST API的轮询方式,WebSockets 减少了延迟,避免了因频繁请求而造成的资源浪费。
- 高级交易策略: 除了简单的市价单和限价单之外,API 交易允许您开发并实施各种复杂的交易策略。 这包括设置止损单来限制潜在损失,利用追踪止损单在价格朝有利方向移动时自动调整止损价格,以及采用网格交易策略在特定价格区间内自动进行买卖操作。 还可以实现时间加权平均价格(TWAP)和成交量加权平均价格(VWAP)等算法交易策略,以更优的价格执行大额订单,减少市场冲击。
- 全面的风险管理: 通过 API 接口,您可以实施更加精细化的风险管理措施。 除了设置每日交易额度和仓位规模限制之外,还可以监控您的投资组合的风险指标,如夏普比率、最大回撤等。 您还可以设置警报,当某些预定义的风险阈值被突破时,自动触发相应的操作,例如平仓或降低仓位。 一些高级 API 还提供对冲工具,帮助您降低市场波动带来的风险。
- 历史数据回测: 在将新的交易策略投入实盘交易之前,至关重要的是对其进行回测。 利用 API 接口,您可以访问丰富的历史市场数据,并在这些数据上模拟您的交易策略的表现。 通过分析回测结果,您可以评估策略的盈利能力、风险水平以及对不同市场状况的适应性。 您可以不断优化您的策略参数,使其在不同的市场环境下都能获得最佳表现。一些平台还提供专门的回测引擎和可视化工具,帮助您更有效地进行策略评估和优化。
安全注意事项
- 保护您的 API Key 和 Secret Key: 将您的 API Key 和 Secret Key 视为极其敏感的凭证,如同银行密码一样。切勿将它们明文存储在公共代码仓库(如 GitHub、GitLab)或任何非安全环境中。采用加密方式存储,并定期轮换 API Key 和 Secret Key,以降低泄露风险。考虑使用硬件安全模块(HSM)或密钥管理系统(KMS)来保护您的 API 密钥。永远不要通过不安全的渠道(例如电子邮件或聊天消息)分享您的 API 密钥。
- 限制 IP 访问: 为了提高安全性,应严格限制允许访问您的 API 密钥的 IP 地址范围。通过在交易所的 API 设置中配置 IP 白名单,只允许来自特定服务器或机器的请求。如果您的应用程序只从少数几个已知 IP 地址发出请求,这将显著减少未经授权访问的风险。定期审查和更新 IP 白名单,以确保其与您的应用程序的实际部署环境保持一致。
- 启用双重验证 (2FA): 在您的 Binance 账户上启用双重验证 (2FA) 是增强账户安全性的重要步骤。2FA 要求您在登录时提供除了密码之外的第二种验证方式,例如来自身份验证器应用程序 (如 Google Authenticator 或 Authy) 的一次性代码。即使您的密码泄露,攻击者也需要访问您的 2FA 设备才能登录您的账户,从而显著降低了账户被盗用的风险。
- 使用沙盒环境: Binance 提供了沙盒环境(也称为测试网络或模拟交易环境),允许您在不承担真实资金风险的情况下测试您的交易策略和 API 集成。在将您的应用程序部署到真实环境之前,务必在沙盒环境中进行彻底的测试,以确保其功能正常且不会产生意外的后果。利用沙盒环境可以帮助您识别和修复潜在的错误或漏洞,从而避免在真实交易中造成损失。
- 监控交易活动: 定期监控您的 Binance 账户活动,包括交易历史、订单记录和 API 使用情况,以检测任何未经授权或可疑的活动。设置警报,以便在发生异常交易或 API 调用时收到通知。关注异常大的交易量、不寻常的交易对或来自未知 IP 地址的 API 请求。如果您发现任何可疑活动,请立即更改您的密码、API 密钥,并联系 Binance 的客户支持。