OKX API量化交易指南:密钥配置与数据获取

OKX API 使用浅析: 从交易到数据,构建你的量化帝国

密钥的获取与配置

在开始探索OKX API之前,获取并配置API密钥至关重要。 API密钥是访问OKX API的凭证,它允许你的应用程序安全地代表你与OKX服务器进行交互,执行诸如查询账户余额、获取市场数据、下单交易等操作。务必理解不同权限等级的意义,避免不必要的风险。

登录你的OKX账户,导航至API管理页面。 在此页面,你可以创建新的API密钥。 创建API密钥时,你需要为其分配特定的权限。 例如,如果你仅需获取实时行情数据,则只需勾选“只读”权限,避免授予不必要的交易或提现权限。 精细化的权限控制能够有效降低API密钥泄露可能造成的潜在损失。

成功创建API密钥后,你将获得API Key(公钥)、Secret Key(私钥)和Passphrase(密码短语)。 务必将这些信息安全地存储在可靠的地方,切勿以任何形式泄露给他人。 这三者组合在一起构成了你访问账户的唯一凭证,任何拥有这些信息的人都可能控制你的账户。 强烈建议启用二次验证(2FA)等安全措施,进一步保护你的账户安全。

接下来,你需要根据你选择的编程语言配置开发环境。 以Python为例, 推荐使用 ccxt 库。 ccxt 是一个强大的加密货币交易API库,它支持众多交易所,并提供统一的接口,简化了与不同交易所API的集成过程。 使用pip安装ccxt:

bash pip install ccxt

安装完成后,在你的Python代码中导入ccxt库,并使用你的API Key、Secret Key和Passphrase初始化OKX交易所对象:

python import ccxt exchange = ccxt.okx({ 'apiKey': 'YOUR_API_KEY', 'secret': 'YOUR_SECRET_KEY', 'password': 'YOUR_PASSPHRASE', })

请务必将代码中的 YOUR_API_KEY YOUR_SECRET_KEY YOUR_PASSPHRASE 替换为你从OKX API管理页面获取的真实值。 正确配置后,你就可以使用 exchange 对象调用ccxt提供的各种方法,与OKX交易所进行交互,例如获取市场行情、查询账户余额、下单交易等。 请参考ccxt官方文档,了解更多API的使用方法和参数设置。

行情数据的获取

OKX API 提供了全面的行情数据服务,涵盖多个交易品种和不同时间粒度的数据。这些数据对于加密货币市场的分析至关重要,是构建稳健量化交易策略的基石。例如, Tickers 端点提供最新的交易价格、成交量和24小时价格变动等信息,是快速了解市场动态的关键入口。 Order Books 端点则提供实时的买单和卖单深度信息,通过分析买卖盘挂单情况,交易者可以评估市场供需关系和潜在的价格支撑/阻力位。 Trades 端点记录了每一笔实际发生的交易数据,包括成交价格、成交数量和成交时间,通过分析历史成交数据,可以识别交易趋势、评估市场活跃度并进行回测分析。

获取Ticker信息:

Ticker数据提供了关于特定交易对的关键实时信息,包括但不限于最新成交价格(Last Price)、当日最高价格(High)、当日最低价格(Low)、交易量(Volume)、买一价(Bid)、卖一价(Ask)以及时间戳(Timestamp)等。这些信息对于交易者进行技术分析、风险评估和决策至关重要。通过CCXT库提供的 fetch_ticker() 方法,开发者可以轻松获取这些数据。

使用 fetch_ticker() 方法从交易所API获取Ticker信息:

    
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker)
    

上述代码示例展示了如何获取BTC/USDT交易对的Ticker信息。 fetch_ticker() 方法接受一个参数,即交易对的符号字符串(例如'BTC/USDT'),并返回一个包含该交易对Ticker数据的字典。该字典包含多个键值对,每个键对应一个Ticker属性。

从返回的Ticker字典中提取关键信息示例:

    
last_price = ticker['last']  # 最新成交价格
high_price = ticker['high']  # 24小时最高价
low_price = ticker['low']    # 24小时最低价
volume = ticker['baseVolume'] # 24小时交易量 (以基础货币计价)
quote_volume = ticker['quoteVolume'] # 24小时交易量 (以报价货币计价)
timestamp = ticker['timestamp'] # Unix时间戳 (毫秒)
datetime = ticker['datetime']   # ISO8601格式时间字符串

print(f"最新价格: {last_price}")
print(f"24小时最高价: {high_price}")
print(f"24小时最低价: {low_price}")
print(f"成交量 (BTC): {volume}")
print(f"成交量 (USDT): {quote_volume}")
print(f"时间戳: {timestamp}")
print(f"日期时间: {datetime}")
    

在上面的例子中,我们从 ticker 字典中提取了 last (最新成交价), high (最高价), low (最低价), baseVolume (以基础货币计价的成交量), quoteVolume (以报价货币计价的成交量), timestamp (Unix时间戳)以及 datetime (ISO8601格式时间字符串)等信息。请注意,并非所有交易所都提供所有这些信息,某些字段可能为 None null 。同时,交易所返回的字段名称可能存在细微差别,请务必查阅交易所的API文档和CCXT的文档,以便正确解析Ticker数据。 fetch_ticker() 方法返回的时间戳是毫秒级的Unix时间戳,可以使用Python的 datetime 模块进行转换,以便于阅读。

获取Order Book信息:

Order Book,即订单簿,是加密货币交易平台的核心组成部分,详细记录了特定交易对当前所有未成交的买单(bid)和卖单(ask)信息。通过Order Book,交易者可以了解市场的深度、流动性以及潜在的价格支撑位和阻力位。ccxt库提供了便捷的方法来访问和解析这些数据。

使用 fetch_order_book() 方法可以获取指定交易对的Order Book信息。该方法会向交易所的API发起请求,并将返回的数据解析为标准化的格式。例如,要获取ETH/USDT交易对的Order Book,可以使用以下代码:

order_book = exchange.fetch_order_book('ETH/USDT')
print(order_book)

上述代码将返回一个字典,包含了ETH/USDT交易对的完整Order Book信息。该字典通常包含以下关键字段: bids (买单列表)、 asks (卖单列表)、 timestamp (时间戳)、 datetime (日期时间字符串)和 nonce (交易所特定的序号)。其中, bids asks 是最重要的两个字段,它们分别包含了按价格排序的买单和卖单列表。

bids asks 都是一个二维数组,每个元素代表一个订单。每个订单通常包含两个元素:价格和数量。例如, bids[0] 代表最佳买单, bids[0][0] 代表最佳买单的价格, bids[0][1] 代表最佳买单的数量。同样地, asks[0] 代表最佳卖单, asks[0][0] 代表最佳卖单的价格, asks[0][1] 代表最佳卖单的数量。

bids = order_book['bids']
asks = order_book['asks']

通过访问 bids asks 列表,可以获取当前市场上最佳的买入和卖出价格,从而辅助交易决策。例如,下面的代码展示了如何打印出最佳买单和最佳卖单的价格:

print(f"最佳买单价格: {bids[0][0]}")
print(f"最佳卖单价格: {asks[0][0]}")

需要注意的是,Order Book的数据是动态变化的,会随着交易的进行而不断更新。因此,在实际应用中,需要定期刷新Order Book数据,以获取最新的市场信息。不同的交易所返回的Order Book数据格式可能略有差异,但ccxt库已经对这些差异进行了处理,统一返回标准化的数据格式,方便开发者使用。

获取Trades信息:

Trades包含了特定交易对的历史成交记录,是进行技术分析和了解市场动态的重要数据。使用 fetch_trades() 方法可以获取Trades信息,该方法会从交易所的API接口获取指定交易对的成交记录数据。

fetch_trades() 方法的参数通常为交易对的字符串,例如'LTC/USDT',表示莱特币兑美元泰达币的交易对。交易所返回的数据格式通常为JSON,CCXT库会将JSON数据解析为Python列表,列表中的每个元素代表一笔成交记录。

trades = exchange.fetch_trades('LTC/USDT')
print(trades)

上述代码将返回一个包含LTC/USDT交易对Trades信息的列表。每个成交记录都是一个字典,包含了成交时间(timestamp)、成交价格(price)、成交数量(amount)、成交方向(side)等信息。不同的交易所返回的数据字段可能略有差异,但通常会包含以上核心信息。

下面是一个示例代码,演示如何遍历 trades 列表,并提取每笔成交记录的关键信息:成交时间、成交价格和成交数量,并将其格式化输出。成交时间通常为Unix时间戳,表示自1970年1月1日0时0分0秒以来的秒数。成交价格和成交数量为浮点数。

for trade in trades:
    timestamp = trade['timestamp']
    price = trade['price']
    amount = trade['amount']
    print(f"时间: {timestamp}, 价格: {price}, 数量: {amount}")

除了时间戳、价格和数量,Trades数据通常还包含以下信息:交易ID ( id ), 交易类型 ( type ,例如 'limit' 'market' ), 买卖方向 ( side ,例如 'buy' 'sell' ), 手续费 ( fee ) 等。通过分析Trades数据,可以了解市场的交易活跃度、价格波动情况以及买卖双方的力量对比。

交易操作

除了获取实时的行情数据之外,OKX API 还赋予开发者执行交易操作的能力。这包括但不限于提交买单或卖单,取消已提交但尚未完全成交的订单,以及查询特定订单的当前状态,如已成交数量、平均成交价格以及剩余未成交数量等详细信息。

通过API下单时,你需要指定交易对(如BTC-USDT)、交易方向(买入或卖出)、订单类型(限价单、市价单等)以及交易数量。对于限价单,还需要指定期望的成交价格。API会返回订单ID,用于后续的订单状态查询和撤单操作。

撤单操作允许你取消未完全成交的订单。通常,你需要提供要取消的订单的订单ID。API会返回撤单结果,表明撤单是否成功。

查询订单状态是API交易的重要组成部分。通过提供订单ID,你可以获取订单的详细信息,包括订单创建时间、订单类型、委托价格、已成交数量、平均成交价格、订单状态(如待成交、部分成交、完全成交、已撤销等)以及任何相关的错误信息。 准确掌握订单状态对于制定交易策略和风险管理至关重要。

在使用交易API时,务必注意资金安全,严格控制API密钥的权限,并定期审查交易记录。建议使用测试环境进行充分的测试,确保交易逻辑的正确性后再切换到生产环境。

下单:

使用 create_order() 方法可以在交易所中提交订单。 该方法允许您指定交易对、订单类型、订单方向(买入或卖出)、订单数量以及订单价格(对于限价单)。 提交的订单将进入交易所的订单簿等待撮合。 确保在使用该方法前已经正确初始化交易所对象并进行了身份验证。

以下代码示例展示了如何创建一个限价买单:

symbol = 'BTC/USDT'  # 交易对:比特币/泰达币
type = 'limit'   # 订单类型:限价单
side  = 'buy'    # 订单方向:买入
amount  = 0.001  # 数量:0.001 BTC
price = 20000   # 价格:20000 USDT

要执行下单操作,使用以下代码:

order = exchange.create_order(symbol, type, side, amount, price)
print(order)

以上代码将在 BTC/USDT 交易对上创建一个限价买单,买入 0.001 BTC,价格为 20000 USDT。 order 变量将包含交易所返回的订单详细信息,例如订单ID、订单状态、成交数量和成交均价等。 您可以使用这些信息来跟踪订单的执行情况,并根据需要取消订单。

需要注意的是, create_order() 方法的具体参数和返回值可能因交易所而异。 请查阅您所使用的CCXT交易所类的官方文档,以获取更详细的信息。

撤单:

在加密货币交易中,撤单是指取消先前提交但尚未完全成交的订单。使用CCXT库中的 cancel_order() 方法可以实现这一操作。该方法允许你取消指定交易所上特定交易对的未成交订单。 要成功撤单,你需要准确提供订单的唯一标识符(Order ID)。

order_id = 'YOUR_ORDER_ID' # 替换为你要撤销的订单ID

在上面的代码片段中, order_id 变量应替换为你要撤销的订单在交易所中的唯一ID。 这个ID通常由交易所返回当你下单时,并且可以在你的交易历史或订单簿中找到。 务必使用正确的ID,否则可能会导致错误或无法撤销目标订单。

exchange.cancel_order(order_id, 'BTC/USDT') # 必须提供交易对

这行代码调用了CCXT库中交易所对象的 cancel_order() 方法。 order_id 参数指定了要撤销的订单的ID,而 'BTC/USDT' 参数则指定了该订单所属的交易对。 务必 提供正确的交易对,因为交易所需要知道订单是在哪个市场上挂单的才能正确撤销。 如果交易对不正确,撤单操作将失败。

执行 cancel_order() 后,系统会向交易所发送一个撤单请求。 如果撤单成功,交易所会将该订单从订单簿中移除,并且不会再尝试执行该订单。 你可以通过检查你的交易历史或订单簿来确认订单是否已成功撤销。 请注意,在某些情况下,由于网络延迟或其他技术问题,撤单请求可能无法立即完成。 如果订单在撤单请求到达之前已经成交,则撤单操作将不会生效。

查询订单状态:

使用 fetch_order() 方法可以查询特定订单的状态。此方法允许你检索关于单个订单的详细信息,包括其当前状态、成交数量、价格等。

要使用 fetch_order() ,你需要提供交易所分配给该订单的唯一标识符,即订单ID。还必须指定与该订单相关的交易对,以便交易所能够准确地定位到该订单。


order_id = 'YOUR_ORDER_ID'  # 替换为你要查询的订单ID
order = exchange.fetch_order(order_id, 'BTC/USDT') # 必须提供交易对
print(order)

在上面的代码示例中, YOUR_ORDER_ID 应该被替换为你实际想要查询的订单ID。 'BTC/USDT' 代表交易对,需要根据你的订单进行调整。 exchange 是你的交易所实例。

fetch_order() 方法返回一个包含订单信息的字典。这个字典包含了订单的各种属性,例如:

  • id : 订单ID。
  • symbol : 交易对(例如,"BTC/USDT")。
  • type : 订单类型(例如,"limit", "market")。
  • side : 订单方向("buy" 或 "sell")。
  • amount : 订单的总数量。
  • price : 订单的价格(仅适用于限价单)。
  • status : 订单状态。 可能的值包括:
    • open : 订单尚未完全成交。
    • closed : 订单已完全成交。
    • canceled : 订单已被取消。
    • expired : 订单已过期。
  • datetime : 订单创建的时间戳。
  • trades : 一个包含成交记录的列表。
  • 其他交易所特定的信息。

通过检查返回字典中的 status 字段,你可以确定订单的当前状态。你可以通过访问字典中的其他字段来获取有关订单的更多详细信息,例如成交价格和数量。

获取账户余额:

使用CCXT库中的 fetch_balance() 方法可以获取交易所账户的详细余额信息。该方法会向交易所的API发起请求,并返回包含各种币种余额数据的字典。

示例代码:

    
balance = exchange.fetch_balance()
print(balance)
    
    

上述代码执行后,将返回一个包含账户余额信息的字典。该字典的结构通常是嵌套的,顶层键可能包括 'info' (交易所原始信息), 'free' (可用余额), 'used' (已用余额), 'total' (总余额) 等。而更深层的键则对应于不同的加密货币币种代码 (例如 'BTC', 'ETH', 'USDT')。

你可以根据需要,从返回的字典中提取特定币种的可用余额。 free 字段表示该币种可用于交易的余额数量。

示例:

    
btc_balance = balance['BTC']['free']
usdt_balance = balance['USDT']['free']
print(f"BTC 可用余额: {btc_balance}")
print(f"USDT 可用余额: {usdt_balance}")
    
    

需要注意的是,不同交易所返回的余额信息结构可能略有差异。因此,建议在实际使用时,先打印完整的 balance 字典,了解其结构,然后根据实际情况提取所需信息。某些交易所可能不提供'free'、'used'和'total'字段,而是使用其他名称,例如'available'和'locked'。 务必处理可能出现的异常情况,例如网络连接错误或API请求失败。

进阶技巧

使用WebSockets获取实时数据:

OKX API 提供了强大的WebSockets接口,用于实时推送市场数据,例如最新成交价、深度行情、交易量等。WebSockets协议允许服务器主动向客户端推送数据,无需客户端频繁请求,从而实现近乎零延迟的数据传输。这对于高频交易、量化交易以及其他需要快速响应市场变化的交易策略至关重要。利用实时数据,交易者可以更快地捕捉市场机会,并及时调整交易策略。

ccxt 库同样支持通过WebSockets接口订阅和获取OKX的实时市场数据。然而,使用 ccxt 的WebSockets功能通常需要安装额外的依赖包,例如 aiohttp asyncio ,具体取决于你的Python环境和异步IO框架选择。在开始之前,请务必查阅 ccxt 官方文档或示例代码,了解所需的依赖项以及正确的安装方法。 ccxt 的文档详细介绍了如何建立WebSocket连接、订阅特定频道(如交易对的ticker或orderbook)、处理接收到的数据以及处理连接错误。掌握这些细节对于成功使用 ccxt 的WebSockets接口至关重要。

错误处理:

在使用加密货币交易所API时,遇到各种错误是不可避免的,包括但不限于网络连接问题、API调用频率限制(限流)、无效的请求参数、以及交易所内部错误等。为了保证程序在各种异常情况下都能稳定可靠地运行,必须编写健壮的错误处理机制。 ccxt 库提供了一套完善的异常处理机制,当API调用发生错误时,会抛出相应的异常。 可以使用Python的 try...except 语句来捕获这些异常,并根据不同的异常类型采取适当的处理措施,例如重试、记录日志、或者向用户报告错误。

以下是一个示例,展示了如何使用 try...except 语句处理 ccxt 库可能抛出的常见异常:

try:
    # 尝试获取BTC/USDT交易对的行情数据
    ticker = exchange.fetch_ticker('BTC/USDT')
    # 如果成功获取到行情数据,则打印
    print(ticker)

except ccxt.NetworkError as e:
    # 当发生网络错误时,捕获NetworkError异常,并打印错误信息
    print(f"网络错误: {e}")

except ccxt.ExchangeError as e:
    # 当交易所返回错误时,捕获ExchangeError异常,并打印错误信息
    print(f"交易所错误: {e}")

except ccxt.RateLimitExceeded as e:
    # 当达到API调用频率限制时,捕获RateLimitExceeded异常,并打印错误信息
    print(f"API限流: {e}")

except ccxt.AuthenticationError as e:
    # 当身份验证失败时,捕获AuthenticationError异常,并打印错误信息
    print(f"身份验证错误: {e}")

except ccxt.RequestTimeout as e:
    # 当请求超时时,捕获RequestTimeout异常,并打印错误信息
    print(f"请求超时: {e}")

except Exception as e:
    # 当发生其他未知错误时,捕获Exception异常,并打印错误信息
    print(f"未知错误: {e}")

在上面的示例中,针对不同的异常类型,分别进行了处理。除了示例中列出的异常类型外, ccxt 库还可能抛出其他类型的异常,例如 ccxt.InvalidOrder (无效订单)、 ccxt.InsufficientFunds (资金不足) 等。在实际开发中,需要根据具体的业务逻辑,对可能出现的异常进行全面的考虑和处理,以确保程序的健壮性和可靠性。可以增加重试机制,例如在捕获到 ccxt.NetworkError ccxt.RateLimitExceeded 异常时,可以等待一段时间后重新尝试调用API。

API 限流:

为了保障服务器的稳定性和可用性,OKX API 实施了严格的请求频率限制机制,也被称为“限流”。这种机制旨在防止恶意攻击、程序错误或者意外的高流量对服务器资源造成过度消耗,确保所有用户的正常访问体验。当您的API请求频率超过预设的阈值时,OKX API将会返回错误代码,通常是HTTP状态码429 (Too Many Requests),并可能附带详细的错误信息,告知您超出了限流范围以及建议的重试时间。 理解并遵守OKX API的限流规则至关重要,这包括了解不同API端点的限流标准(例如每分钟、每秒的请求次数限制)、权重计算方式(某些复杂的API调用可能会消耗更多的限流配额)以及如何通过API响应头中的相关字段(例如 X-RateLimit-Limit , X-RateLimit-Remaining , X-RateLimit-Reset )来监控您的当前请求状态和剩余配额。 ccxt (CryptoCurrency eXchange Trading Library) 库作为一个通用的加密货币交易API客户端,内置了一些自动处理限流的机制,例如自动重试被限流的请求,实施指数退避策略等。 然而,依赖 ccxt 的自动处理并不能完全解决限流问题。 您仍然需要主动监控您的API请求行为,根据OKX API的限流规则,合理设计和优化您的应用程序逻辑,例如采用批量请求、缓存数据、避免不必要的轮询等方法来减少请求频率,从而避免触发限流。 如果您的应用确实需要更高的请求频率,可以考虑联系OKX申请更高的API访问权限,但需要提供充分的理由和保证遵守平台规则的承诺。 请务必阅读OKX官方API文档中关于限流的详细说明,并参考官方提供的最佳实践指南。

数据持久化:

在加密货币交易和分析中,数据持久化是至关重要的环节,尤其当需要进行历史数据分析、策略回测或构建长期预测模型时。将市场数据长期存储到数据库是常见的做法。常用的关系型数据库包括MySQL和PostgreSQL,它们以结构化的方式存储数据,并提供强大的SQL查询功能,便于高效地检索和分析数据。NoSQL数据库如MongoDB,则更适合存储非结构化或半结构化的数据,例如JSON格式的API响应。选择哪种数据库取决于数据的结构和查询需求。

针对Python环境,存在多种数据库驱动程序可用于连接并操作这些数据库。例如,`pymysql`或`mysql-connector-python`用于连接MySQL数据库,`psycopg2`用于连接PostgreSQL数据库,`pymongo`用于连接MongoDB数据库。使用这些驱动程序,你可以编写Python脚本,从交易所API获取数据,然后将数据插入到相应的数据库表中。在设计数据库表结构时,应考虑到数据的类型、频率以及未来的扩展性。例如,可以创建包含时间戳、交易对、开盘价、最高价、最低价、收盘价和交易量等字段的表。

除了数据库,还可以考虑使用文件存储,例如CSV文件或Parquet文件。CSV文件易于读取和写入,但可能效率较低,尤其是在处理大量数据时。Parquet是一种列式存储格式,可以显著提高查询效率,并减小存储空间。Python的`pandas`库提供了方便的API用于读取和写入CSV和Parquet文件。

在实际应用中,需要权衡存储成本、查询性能和数据复杂性等因素,选择最适合的数据持久化方案。同时,需要定期备份数据,以防止数据丢失。

安全提示

API Key 安全至关重要: 请务必高度重视您的 API Key 安全,API Key 泄露可能导致严重的资金损失和账户风险。如同保护您的银行密码一样,切勿将 API Key 泄露给任何人,包括声称是 OKX 官方人员。任何索要您 API Key 的行为都应视为诈骗。

定期更换 API Key: 为了进一步提升安全性,建议您定期更换 API Key,例如每月或每季度更换一次。更换 API Key 可以有效降低因 Key 泄露而造成的潜在风险。 您可以在 OKX 账户的安全设置中轻松完成 API Key 的更换。

权限最小化原则: 在创建 API Key 时,请遵循权限最小化原则,即只授予 API Key 完成特定任务所需的最低权限。 例如,如果您的 API Key 仅用于读取市场数据,请不要授予其交易或提币权限。 这可以最大限度地降低 API Key 泄露后可能造成的损失。

IP 白名单限制访问: 使用 IP 白名单功能可以显著提高 API Key 的安全性。 通过设置 IP 白名单,您可以限制 API Key 只能从特定的 IP 地址或 IP 地址段进行访问。 即使 API Key 泄露,未经授权的 IP 地址也无法使用该 Key,从而有效阻止恶意访问。

账户活动监控: 定期监控您的 OKX 账户活动,包括 API Key 的使用情况。 密切关注是否有异常交易、未经授权的提币或其他可疑活动。 OKX 提供了账户活动日志,您可以定期审查这些日志,及时发现并处理潜在的安全威胁。

启用双重验证 (2FA): 强烈建议您为您的 OKX 账户启用双重验证 (2FA),例如 Google Authenticator 或短信验证。 即使您的用户名和密码泄露,攻击者也需要通过第二重验证才能访问您的账户,从而大大提高了账户的安全性。

防钓鱼意识: 警惕钓鱼网站和邮件,不要轻易点击不明链接或下载可疑附件。 仔细检查网站域名和邮件地址,确保其真实性。 不要在非官方网站上输入您的 API Key 或其他敏感信息。 OKX 官方网站地址为 okx.com 。

API 使用注意事项: 在使用 OKX API 进行量化交易时,请务必仔细阅读 API 文档,了解 API 的使用方法和限制。 注意控制 API 调用频率,避免超出限制导致 API Key 被禁用。 妥善处理 API 返回的数据,避免出现数据泄露或错误。

本文章为原创、翻译或编译,转载请注明来自 币新知