
Freqtrade 交易所接入全指南支持矩阵、逐交易所专项配置与底层参数调优【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtradeFreqtrade 依托 CCXT 库实现了对上百家加密货币交易所的行情与交易接入但不同交易所在 API 签名、限速策略、订单类型、合约模式乃至历史数据供给上差异巨大。本文以官方文档 docs/exchanges.md 为核心系统梳理 Freqtrade 各受支持交易所的专项配置、常见坑位与实战建议并结合 exchange.py 中_ft_has_default及 binance.py 等交易所子类的底层实现讲清每项配置背后的工作机制。读完你即可独立完成任一受支持交易所的接入、限速调优与合约交易部署。支持交易所功能速览Freqtrade 官方文档只对受支持交易所给出功能承诺功能表之外的交易所也许可以运行但**不一定提供交易所端止损stoploss on exchange**能力。下表综合自 docs/includes/exchange-features.md列明各受支持交易所在现货spot与合约futures模式下的保证金模式及可用的止损单类型ExchangeModeMargin modeStoploss on exchangeBinancespotlimitBinancefuturesisolated, crossmarket, limitBingxspotmarket, limitBitgetspotmarket, limitBitgetfuturesisolatedmarket, limitBybitspot❌ (not available)Bybitfuturesisolatedmarket, limitGate.iospotlimitGate.iofuturesisolatedlimitHTXspotlimitHyperliquidspot❌ (not available)Hyperliquidfuturesisolated, crosslimitKrakenspotmarket, limitKraken Futuresfuturesisolatedmarket, limitOKXspotmarket, limitOKXfuturesisolatedmarket, limitBitvavospot❌ (not available)Kucoinspotmarket, limit可以看到Binance、OKX、Kraken、Kucoin 等在现货模式下就支持限价止损Bybit、Hyperliquid、Bitvavo 的现货不支持交易所端止损期货场景则普遍可用。这张表决定了你能否配置stoploss_on_exchange: true以及order_types.stoploss的取值空间。通用交易所配置骨架所有交易所接入都始于配置文件中的exchange段。以 Binance 为例的最小结构如下示例源自 docs/exchanges.mdexchange: { name: binance, api_key: your_exchange_api_key, secret: your_exchange_secret, ccxt_config: {}, ccxt_async_config: {}, // ... }关键字段含义nameCCXT 中使用的交易所标识exchange id。选错 id 会导致 API Key 无法识别后文 Binance、OKX 等章节都有具体教训。api_key/secret交易所 API 密钥。passwordKucoin、OKX、Bitget 等交易所额外要求的 API passphrase详见各自小节。ccxt_config透传给 CCXT 同步客户端ccxt.binance()等构造参数的额外配置。ccxt_async_config透传给 CCXT 异步客户端ccxt.async_support.binance()的配置。Freqtrade 实际运行时使用异步版本拉取数据与下单因此限速等运行期参数通常配置在此处。_ft_has_paramsFreqtrade 私有覆盖项用于改写交易所能力开关见文末高级配置一节。配置 schema 对这些键的约束定义在 config_schema/config_schema.py 中含ccxt_config、unknown_fee_rate、order_types等。从 exchange.py 的类定义可以看到Exchange基类通过_ft_has_default声明了一套交易所能力默认值例如stoploss_on_exchange默认False、order_time_in_force默认仅[GTC]、ohlcv_partial_candle默认True、ohlcv_has_history默认True各交易所子类再用自身的_ft_has覆盖。这套字典既决定功能可用性也解释了为何不同交易所的止损/订单类型差异如此之大。环境变量配置除 JSON 配置外所有exchange下字段都可用环境变量注入例如export FREQTRADE__EXCHANGE__SECRET...多行内容如 RSA 私钥尤适合这种方式规避 JSON 不支持跨行字符串的限制见 Binance RSA Keys 小节。限速rateLimit调优CCXT 内置的限速值rate limit通常可靠且够用。若日志频繁出现 DDOS 异常通常是限速被触发说明需要手动调整请求间隔。Kraken 示例exchange: { name: kraken, api_key: your_exchange_api_key, secret: your_exchange_secret, ccxt_config: {enableRateLimit: true}, ccxt_async_config: { enableRateLimit: true, rateLimit: 3100 }, }enableRateLimit: true开启 CCXT 的请求节流避免被交易所封禁。rateLimit: 3100表示相邻两次请求的等待间隔为 3.1 秒。设置enableRateLimit: false可完全关闭节流不推荐生产使用。需要注意两点rateLimit的单位是每请求间隔毫秒数不是每秒请求数。遇到 Kraken API Rate limit exceeded 时应增大而非减小该值docs/exchanges.md 特别警告了这一点。最优取值依赖交易所与交易对白名单规模——交易对越多请求越密集没有普适的最优值。文档建议从已提供的默认值出发若被限速则逐步调大。Freqtrade 会尽量为各交易所提供合理的默认参数遇到封禁先确认enableRateLimit已开启再按步进加大rateLimit。Binance地理限制与站点拆分Binance 依据服务器所在国限制 API 访问当前非穷尽被禁的国家/地区包括加拿大、马来西亚、荷兰与美国完整清单以 Binance 官方条款的 Eligibility 章节为准。Binance 已拆分为两个站点必须使用与账户匹配的交易所 id否则 API Key 无法识别binance.com国际用户exchange id 为binancebinance.us美国用户exchange id 为binanceus。订单属性支持Binance 支持配置 time_in_force。从 binance.py 的_ft_has定义看Binance 现货的order_time_in_force支持[GTC, FOK, IOC, PO]trades_pagination采用 id 分页参数fromId并具备完整的历史成交拉取能力trades_has_history: True。交易所端止损强烈推荐开启Binance支持stoploss_on_exchange使用stop-loss-limit订单能有效避免程序宕机导致止损失效官方文档强烈推荐开启。在合约模式下还支持stop-loss-market只需在配置里选择止损单类型order_types: { stoploss: limit // 或 market }对应源码中现货类止损单类型映射为{limit: stop_loss_limit}而合约futures下为{limit: stop, market: stop_market}且合约止损单不再占用资产stoploss_blocks_assets: False详见 binance.py。黑名单建议BNB建议把BNB/STAKE如 BNB/USDT加入exchange.pair_whitelist之外的黑名单除非你能保证账户内始终留有足额 BNB、或愿意关闭以 BNB 抵扣手续费的功能。原因Binance 账户会用 BNB 自动抵扣手续费若成交标的恰是 BNB后续每笔交易会不断消耗该持仓导致最初的 BNB 仓位因数量不足而无法卖出。需要明确BNB 余额不足抵扣手续费时费用将不再由 BNB 覆盖也不享受折扣Freqtrade 永远不会替你去买 BNB 来支付手续费BNB 的储备需人工监控与购入。RSA 密钥Binance 支持 RSA API Key。推荐以环境变量形式注入多行私钥export FREQTRADE__EXCHANGE__SECRET$(cat ./rsa_binance.private)若坚持写入 JSON 配置文件由于 JSON 不支持多行字符串必须把所有换行替换为\n// ... api_key: someapikey, secret: -----BEGIN PRIVATE KEY-----\nMIIEvQIBABACAFQA...s8KX8\n-----END PRIVATE KEY----- // ...Binance 合约FuturesBinance 有一套较为复杂且专项的 Futures Trading Quantitative Rules如对单笔下单金额下限、订单频率的限制违反将导致交易权限被限制。合约行情走盘口而非 tickerBinance 期货不提供价格 ticker 数据因此做市/入场必须读取订单簿。这正好印证了 binance.py 中get_tickers的实现——合约模式下tickers_have_price被置为False机器人会额外调用fetch_bids_asks并把 bid/ask 合并进 ticker 结果。对应地配置中应显式启用订单簿定价entry_pricing: { use_order_book: true, order_book_top: 1, check_depth_of_market: { enabled: false, bids_to_ask_delta: 1 } }, exit_pricing: { use_order_book: true, order_book_top: 1 },use_order_book: true使开仓/平仓价格取自订单簿最优档位order_book_top指定取第几档。隔离合约账户设置与启动自检Binance 逐仓isolated合约要求账户处于One-way Mode单向持仓模式与Single-Asset Mode单资产模式。Freqtrade 在启动时会校验该设置若不符会直接报错。从 binance.py 的additional_exchange_init可见非 dry-run 合约模式下机器人会调用fapiPrivateGetPositionSideDual()查询dualSidePosition若为true即双向持仓模式则抛出错误提示你到币安合约账户中把 Position Mode 改为单向。需要强调的是Freqtrade 只会检测这些设置不会也禁止替你修改它们请在交易所 Web 端手工确认后再启动。BNFCR 合约模式BNFCR 是 Binance 为绕开欧洲监管限制而提供的一种特殊合约模式。启用它的配置组合如下{ // ... trading_mode: futures, margin_mode: cross, proxy_coin: BNFCR, stake_currency: USDT // or USDC // ... }原理说明stake_currency定义了机器人实际交易的现货/合约市场而全仓cross模式下 Binance 用BFUSD / BNFCR这类代理币proxy coin作为账户权益与抵押口径。配置里的proxy_coin正是告诉机器人以哪个代理币核算余额与仓位。从 binance.py 的get_proxy_coin()可以看到仅在全仓MarginMode.CROSS时才会读取proxy_coin配置默认回退为stake_currency其内部映射表proxy_coin_mapping {BNFCR: USDC, BFUSD: USDT}又进一步把代理币归一到实际结算币种。账户侧要求为Multi-asset Mode多资产模式One-way Mode同样由 Freqtrade 启动自检不代为修改。这一机制与 wallets.py 中通过exchange.get_proxy_coin()获取抵押货币、rpc.py 中判断币种是否为代理币的逻辑一一对应。BingxBingx 的order_time_in_force支持GTC一直有效、IOC立即成交否则撤销与PO仅挂单三种设置详见 time_in_force。Bingx支持stoploss_on_exchange止损可同时使用 stop-limit 与 stop-market 订单官方文档同样强烈推荐开启交易所端止损。KrakenKraken 的order_time_in_force支持GTC、IOC与PO。kraken.py 将止损单类型映射为{limit: limit, market: market}即stoploss_on_exchange同时支持止损限价与止损市价通过order_types.stoploss的limit/market二选一。Kraken 历史数据的特殊处理Kraken 的 OHLCV API只提供最近 720 根 K 线这对 dry-run 和实盘足够但远远无法支撑回测。因此下载 Kraken 数据时--dl-trades是必选参数——否则机器人每次都会拉到同样的 720 根蜡烛你永远凑不出足够的回测样本freqtrade download-data --exchange kraken --dl-trades -p BTC/EUR BCH/EUR为加速历史成交数据获取Kraken 官方提供按季度更新的 trades zip 历史数据包通常每季度更新一次。Freqtrade 约定这些 CSV 文件需放在user_data/data/kraken/trades_csv下。合理的目录结构是全量历史放一个目录、季度增量放各自目录前提是数据下载解压后保持原始文件名不变且各时段之间不存在数据缺口重复内容会按时间戳自动忽略。例如全量历史截至 2022 年 Q4则后续应能补上 2023 年 Q1 与 Q2 两份增量否则数据不完整基于它的回测/分析结果无效└── trades_csv ├── Kraken_full_history │ ├── BCHEUR.csv │ └── XBTEUR.csv ├── Kraken_Trading_History_Q1_2023 │ ├── BCHEUR.csv │ └── XBTEUR.csv └── Kraken_Trading_History_Q2_2023 ├── BCHEUR.csv └── XBTEUR.csv把 CSV 转换为 Freqtrade 原生格式并合成多周期 K 线freqtrade convert-trade-data --exchange kraken --format-from kraken_csv --format-to feather # Convert trade data to different ohlcv timeframes freqtrade trades-to-ohlcv -p BTC/EUR BCH/EUR --exchange kraken -t 1m 5m 15m 1h转换完成后即可继续增量下载Freqtrade 会从已加载成交的最新时间点向后续抓freqtrade download-data --exchange kraken --dl-trades -p BTC/EUR BCH/EUR两个实战警告内存与耗时Kraken 数据下载需要把每一笔成交在本地重放合成蜡烛所需内存显著高于其他交易所且要拉取目标时间区间内的每一笔历史成交耗时很长请耐心等待。限速方向遇到 Rate limit exceeded 时要增大rateLimit间隔毫秒数而不是减小。Kraken FuturesKraken 合约使用 exchange idkrakenfutures支持逐仓isolated合约模式exchange: { name: krakenfutures, api_key: your_exchange_api_key, secret: your_exchange_secret }, trading_mode: futures, margin_mode: isolated, stake_currency: USD止损stoploss_on_exchange同时支持limit与market止损单并通过order_types.stoploss_price_type选择触发价来源——mark标记价、last最新成交价或index指数价。抵押口径Kraken Futures 以美元结算stake_currency应设为USD。Flex多抵押账户即便使用允许多种币抵押的 Flex 账户交易仍是美元结算Freqtrade 从 Kraken 的 margin 字段中推导USD余额因此请保持stake_currency: USD。KucoinKucoin 为每个 API Key 强制要求 passphrase配置需增加password字段exchange: { name: kucoin, api_key: your_exchange_api_key, secret: your_exchange_secret, password: your_exchange_api_key_password, // ... }Kucoin 的order_time_in_force支持GTC、FOK全成或取消与IOC。stoploss_on_exchange同时支持止损市价与止损限价通过order_types.stoploss的limit/market选择。与 Binance/BNB 同理建议把KCS/STAKE加入黑名单除非能持续保有足额 KCS 或已禁用 KCS 抵扣手续费——否则 KCS 仓位可能在后续交易中被手续费消耗导致最初 KCS 持仓无法按预期数量卖出。HTXHTX支持stoploss_on_exchange使用stop-limit止损订单官方建议开启以获得交易所端止损保障。OKXOKX 同样为每个 API Key 要求 passphraseexchange: { name: okx, api_key: your_exchange_api_key, secret: your_exchange_secret, password: your_exchange_api_key_password, // ... }两个易踩的坑站点差异如果你的账户注册在my.okx.comOKX EAA 站点exchange name 必须写myokx。用错 id 会得到OKX Error 50119: API key doesnt exist——因为两个站点的 Key 体系相互独立。K 线供给受限OKX 每次 API 调用只返回100 根蜡烛因此在回测模式下策略可用的历史数据量较少。关于止损与合约的要点stoploss_on_exchange在现货与合约市场同时支持 stop-limit 与 stop-market 止损由order_types.stoploss的limit/market决定。仓位模式OKX 合约有 Buy/Sell 与 多/空对冲hedge mode两种 position mode。Freqtrade 两种都支持官方推荐 Buy/Sell但交易中途切换仓位模式不被支持会引发下单异常。标记价数据OKX 只提供最近约 3 个月的 MARK K 线。更早的合约回测会因缺乏数据而无法准确计算资金费率导致结果有轻微偏差。Gate.iostoploss_on_exchange使用stop-loss-limit订单。order_time_in_force支持GTC与IOC。POINT 手续费Gate.io 允许用POINT支付手续费但 POINT 没有常规交易市场、不可直接交易自动费用计算会失败并回退为 0 费率。此时可用exchange.unknown_fee_rate指定 POINT 与质押币stake currency的折算汇率——注意更换 stake currency 时必须同步更新该值。该参数在 config_schema/config_schema.py 中登记于exchange段之下。Gate API Key 除交易市场所需权限外还必须授予以下权限否则机器人启动报错如 permission missingSpot Trade或Perpetual FuturesRead and Write——两者可按需选择或都勾选Wallet只读Account只读。Bybit基础能力Bybit仅合约支持stoploss_on_exchange默认stop-loss-limit合约下同时支持stop-limit与stop-market同样用order_types.stoploss的limit/market选择。order_time_in_force支持GTC、FOK、IOC、PO。统一账户与子账户Freqtrade 的假设前提是账户专属于机器人因此强烈建议每个机器人使用独立子账户subaccount统一账户unified account尤其如此。多机器人共用账户、或在机器人账户上进行人工交易等场景均不受支持可能引发不可预期的行为。Bybit 合约专项支持逐仓isolated合约模式。启动时 Freqtrade 会把整个子账户的仓位模式设置为One-way Mode——此举避免运行期反复调用该接口拖慢速度但意味着你手工改动该设置会导致下单异常。资金费率历史缺失Bybit 不提供资金费率历史因此实盘也沿用 dry-run 的费率估算方式。实盘合约 API Key 需要权限Read-write、Contract - Orders、Contract - Positions。强烈建议把 Key 绑定到即将使用的服务器 IP。Bybit 模拟盘Demo ModeBybit 提供 模拟盘通过设置exchange: {demo_trading: true}激活。模拟盘使用真实行情模拟成交无市场冲击体验接近 Freqtrade 的 dry-run。需注意必须在 Bybit 模拟盘页面单独创建 API Key与实盘 Key 不通用demo 模式与 dry-run 互不兼容二者不可同时使用。BitgetBitget 同样要求 passphraseexchange: { name: bitget, api_key: your_exchange_api_key, secret: your_exchange_secret, password: your_exchange_api_key_password, // ... }order_time_in_force支持GTC、FOK、IOC、PO。stoploss_on_exchange同时支持止损市价与止损限价用order_types.stoploss选择。合约逐仓模式与 Bybit 相同启动时把账户仓位模式设为 One-way Mode运行期手工修改会引发异常。HyperliquidHyperliquid 是一家去中心化交易所DEX接入方式与中心化交易所差异显著私钥签名配置DEX 不用 API Key 认证而是用钱包私钥对私有 API 请求签名。官方建议在 Hyperliquid 或你的钱包工具里生成一个专用的API Wallet配置示例exchange: { name: hyperliquid, walletAddress: your_eth_wallet_address, // This should NOT be your API Wallet Address! privateKey: your_api_private_key, // ... }walletAddress十六进制格式0x40 hex characters从钱包直接复制必须是主钱包地址而非 API Wallet 地址privateKey十六进制格式0x64 hex characters取 API Wallet 创建时显示的私钥。资金流转方面Hyperliquid 的充提走Arbitrum One 链基于以太坊的 Layer 2以 USDC 作为报价/抵押币种USDC 充值包含多个步骤详见其官方引导文档。能力边界与安全实践无市价单Hyperliquid 不支持市价订单CCXT 会用最大 5% 滑点的限价单来模拟市价单。历史数据有限仅提供最近5000 根历史蜡烛回测要么靠长期增量下载逐步积累历史要么受限于最近 5000 根蜡烛。账户类型方面支持统一账户但同样依赖机器人独占账户假设此处扩展到现货与合约同时独占建议优先使用子账户、运行期间避免人工交易Freqtrade 启动时会探测账户类型中途切换账户类型不受支持。官方给出的安全最佳实践非穷尽警惕供应链攻击如 pip 投毒使用私钥前确保运行环境安全不要用真实钱包私钥交易用 Hyperliquid 的 API 生成器创建独立 API Wallet不要把真实钱包私钥存放在运行 Freqtrade 的服务器上API Wallet 私钥仅能交易、不能提现风险更小私钥与助记词永不外泄不要与硬件钱包初始化时备份的助记词复用单独建一个软件钱包只转入打算交易的资金盈利后把不需要参与交易的部分转回硬件钱包。Vault 与 Subaccount 互斥Vault 和子账户只能二选一不能同时使用。子账户配置需账户交易量达标才能开通子账户exchange: { name: hyperliquid, walletAddress: your_master_wallet_address, // 主钱包地址不是 API wallet / vault / 子账户地址 privateKey: your_api_private_key, // API wallet 私钥 ccxt_config: { options: { subAccountAddress: your_subaccount_address // 使用子账户时必填 } }, // ... }启用后余额与成交都从子账户核算。Vault配置exchange: { name: hyperliquid, walletAddress: your_vault_address, // vault 地址也须填入下方 ccxt_config.options.vaultAddress privateKey: your_api_private_key, // API wallet 私钥 ccxt_config: { options: { vaultAddress: your_vault_address, // 可选使用 vault 时填写 } }, // ... }启用后余额与成交都从 Vault 核算。此外Hyperliquid API 不提供任何历史行情单次取当前数据的调用除外因此无法增量下载历史数据。HIP-3 DEXHIP-3 DEX 是构建在 Hyperliquid 基础设施之上、由社区创建和管理的独立交易所运作方式与主交易所类似。接入时通过hip3_dexes参数声明要交易的 HIP-3 DEXexchange: { name: hyperliquid, walletAddress: your_master_wallet_address, privateKey: your_api_private_key, hip3_dexes: [dex_name_1, dex_name_2] }把示例的dex_name_1、dex_name_2替换为你实际交易的名字如vntl、xyz。三个必须留意的点性能与限速冲击显著每个新增 DEX 都会引入额外 API 调用叠加到 Hyperliquid 严格的限速上DEX 越多越容易撞限速或被迫放慢请求。只添加真正在交易的 DEX并持续观察日志中的限速告警与减速迹象。报价币须与 stake 匹配不同 HIP-3 DEX 可能使用不同报价币只应添加与你的 stake currency 兼容的 DEX避免无谓延迟。共担抵押HIP-3 DEX 与主账户共用同一个钱包和自由抵押额度不同 DEX 上的交易会影响整体余额与保证金。此外 HIP-3 交易对的命名与普通交易对不同请用list-pairs子命令获取指定 DEX 的准确交易对名称。BitvavoBitvavo 若账户要求使用operatorId在ccxt_config.options中配置exchange: { name: bitvavo, api_key: , secret: , ccxt_config: { options: { operatorId: 123567 } }, }注意operatorId必须为整数。所有交易所通用排查如果你持续遇到 Nonce 类错误如InvalidNonce最有效的解法通常是重新生成 API Key——手动重置 Nonce 很麻烦重新生成往往更快更可靠。其他交易所的零散注意事项The OceanThe Oceanexchange id:theocean依赖 Web3 功能需要额外安装web3包pip3 install web3最新价 / 未完成蜡烛Incomplete candles绝大多数交易所通过 OHLCV/Klines API 会返回当前这根尚未收盘的蜡烛。Freqtrade 默认假设如此并在取数后主动剔除最后一根未完成蜡烛防止其被回放repainting造成信号失真。你的交易所是否返回未完成蜡烛可用 贡献者文档 中的辅助脚本检测。由于回放风险Freqtrade禁止策略直接使用这根未收盘蜡烛。如果策略确实需要最新价格来决策正确的做法是从策略内部通过 data provider 获取。从底层看这条规则对应 exchange.py 中_ft_has_default的ohlcv_partial_candle: True默认值——该开关控制的正是返回的 K 线里包含未完成蜡烛、需丢弃末根这一行为。同时交易所每批能取回的蜡烛数由ohlcv_candle_limit决定默认回退到 CCXT 值亦可用_ft_has_params覆盖见 exchange.py 的ohlcv_candle_limit()实现Kraken 的ohlcv_has_history: False默认值则解释了其只能取到 720 根的根源。高级配置_ft_has_params覆盖交易所能力Freqtrade 的能力默认值与各交易所子类覆盖值都定义在交易所类的_ft_has_default/_ft_has字典中基类见 exchange.py例如现货与合约模式的止损订单类型、order_time_in_force集合、每批蜡烛上限等。这些字典既可由子类覆盖也可由你在配置中通过_ft_has_params直接改写。例如想给 Kraken 测试FOK订单类型并把单次拉取的蜡烛数限制到 200exchange: { name: kraken, _ft_has_params: { order_time_in_force: [GTC, FOK], ohlcv_candle_limit: 200 } //... }可选键的完整清单以 exchange 基类的_ft_has_default为准。最后必须强调警告修改前请务必完全理解这些设置的影响。_ft_has_params覆盖可能引发不可预期的行为甚至导致机器人无法正常运行由自定义设置引发的问题官方将不提供支持。因此这条逃生通道仅适合高级用户做实验性验证生产环境请优先信任官方按交易所给出的默认能力表。小结交易所接入是 Freqtrade 上手的第一个真实门槛。把握三条主线即可少走弯路一是对照支持矩阵确认止损/合约能力选对name与order_types二是按交易所专项要求补齐密钥形态Kucoin/OKX/Bitget 的 passphrase、Hyperliquid 的钱包私钥、Binance 的 RSA与账户侧设置Binance 的仓位/资产模式、Bybit/Bitget 的 One-way Mode三是尊重每家交易所的数据与限速边界Kraken 的 720 根与 trades_csv 灌数据、OKX 的 100 根、Hyperliquid 的 5000 根及无历史下载。理解 exchange.py 中_ft_has_default与各子类_ft_has的覆盖机制后你甚至可以解释并预判任何新交易所的行为差异必要时再谨慎使用_ft_has_params兜底。【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考