跳至内容

交易所特定说明

本页面汇总了一些常见陷阱和特定于某个交易所的信息,这些信息很可能不适用于其他交易所。

支持的交易所功能快速概览

交易所 模式 保证金模式 止损类型
币安 现货 限价
币安 期货 逐仓、全仓 市价、限价
Bingx 现货 市价、限价
Bitmart 现货 ❌(不支持)
Bybit 现货 ❌(不支持)
Bybit 期货 逐仓 市价、限价
Gate.io 现货 限价
Gate.io 期货 逐仓 限价
HTX 现货 限价
Hyperliquid 现货 ❌(不支持)
Hyperliquid 期货 逐仓 限价
Kraken 现货 市价、限价
OKX 现货 限价
OKX 期货 逐仓 限价
Bitvavo 现货 ❌(不支持)
Kucoin 现货 市价、限价

交易所配置

Freqtrade 基于 CCXT 库,该库支持超过 100 个加密货币交易所市场和交易 API。最新的完整列表可在 CCXT 仓库主页 上找到。然而,开发团队仅对少数几个交易所进行了测试。当前支持的交易所列表可在本文档的“首页”部分找到。

欢迎测试其他交易所,并提交反馈或 Pull Request 以帮助改进机器人,或确认其他正常工作的交易所。

某些交易所需要特殊配置,详情见下文。

交易所配置示例

“binance”交易所的配置如下所示:

"exchange": {
    "name": "binance",
    "key": "your_exchange_key",
    "secret": "your_exchange_secret",
    "ccxt_config": {},
    "ccxt_async_config": {},
    // ... 

设置速率限制

通常,CCXT 设置的速率限制是可靠的,效果良好。如果遇到与速率限制相关的问题(通常在日志中表现为 DDOS 异常),可以轻松地将 rateLimit 设置更改为其他值。

"exchange": {
    "name": "kraken",
    "key": "your_exchange_key",
    "secret": "your_exchange_secret",
    "ccxt_config": {"enableRateLimit": true},
    "ccxt_async_config": {
        "enableRateLimit": true,
        "rateLimit": 3100
    },

此配置启用了 kraken,以及速率限制功能,以避免被交易所封禁。"rateLimit": 3100 表示每次调用之间等待 3.1 秒。也可以通过将 "enableRateLimit" 设置为 false 来完全禁用该功能。

注意

最优的速率限制设置取决于交易所和白名单的大小,因此理想参数会因其他多种设置而异。我们尽可能为每个交易所提供合理的默认值。如果您遇到封禁问题,请确保已启用 "enableRateLimit",并逐步增加 "rateLimit" 参数。

币安

服务器位置与地理 IP 限制

请注意,币安会根据服务器所在国家/地区限制 API 访问。目前被封锁的国家(非完整列表)包括加拿大、马来西亚、荷兰和美国。请访问 币安条款 > b. 资格要求 查看最新列表。

币安支持 time_in_force

交易所止损

币安支持 stoploss_on_exchange,并使用 stop-loss-limit 订单。这具有显著优势,因此我们建议启用交易所止损功能。在期货交易中,币安同时支持 stop-limitstop-market 订单。您可以在 order_types.stoploss 配置项中使用 "limit""market" 来决定使用哪种类型。

币安黑名单建议

对于币安,建议将 "BNB/<STAKE>" 添加到您的黑名单中以避免问题,除非您愿意在账户中保留足够的额外 BNB,或愿意禁用使用 BNB 支付费用。币安账户可能会使用 BNB 支付手续费,如果某笔交易恰好涉及 BNB,后续交易可能会消耗这部分持仓,导致最初的 BNB 交易无法卖出,因为预期的金额已不复存在。

如果没有足够的 BNB 来支付交易手续费,则手续费将不会由 BNB 支付,也无法享受手续费折扣。Freqtrade 永远不会自动购买 BNB 来支付手续费。为此,您需要手动购买并监控 BNB。

币安网站

币安已分为两个平台,用户必须使用正确的 CCXT 交易所 ID,否则 API 密钥将无法被识别。

  • binance.com - 国际用户。使用交易所 ID:binance
  • binance.us - 美国用户。使用交易所 ID:binanceus

币安 RSA 密钥

Freqtrade 支持币安 RSA API 密钥。

我们建议将其设置为环境变量。

export FREQTRADE__EXCHANGE__SECRET="$(cat ./rsa_binance.private)"

但也可以通过配置文件进行配置。由于 JSON 不支持多行字符串,您必须将所有换行符替换为 \n,以保证 JSON 文件的有效性。

// ...
 "key": "<someapikey>",
 "secret": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBABACAFQA<...>s8KX8=\n-----END PRIVATE KEY-----"
// ...

币安期货

Binance 有特定的(不幸的是比较复杂)合约交易量化规则需要遵守,这些规则禁止在过多订单中使用过低的投注金额等行为。违反这些规则将导致交易受限。

在 Binance 期货市场交易时,必须使用订单簿,因为期货没有价格行情数据。

  "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
  },

Binance 隔离合约设置

用户还必须将合约设置中的“持仓模式”设为“单向模式”,并将“资产模式”设为“单币种模式”。这些设置会在启动时被检查,如果设置错误,freqtrade 将显示错误信息。

Binance futures settings

Freqtrade 不会尝试更改这些设置。

Binance BNFCR 合约

BNFCR 模式是 Binance 上一种特殊的合约模式,用于规避欧洲地区的监管问题。
要使用 BNFCR 合约,您必须具备以下设置组合:

{
    // ...
    "trading_mode": "futures",
    "margin_mode": "cross",
    "proxy_coin": "BNFCR",
    "stake_currency": "USDT" // or "USDC"
    // ...
}

stake_currency 设置定义了机器人将要操作的市场。这个选择实际上是任意的。

在交易所中,您必须使用“多资产模式”,并将“持仓模式”设为“单向模式”。
Freqtrade 将在启动时检查这些设置,但不会尝试更改它们。

Bingx

BingX 支持 time_in_force 参数,可选设置包括 "GTC"(直到取消)、"IOC"(立即成交或取消)和 "PO"(仅挂单)。

交易所止损

Bingx 支持 stoploss_on_exchange,并可以使用止损限价单和止损市价单。这提供了很大优势,因此我们建议启用交易所止损功能以充分利用其优势。

Kraken

Kraken 支持 time_in_force 参数,可选设置包括 "GTC"(直到取消)、"IOC"(立即成交或取消)和 "PO"(仅挂单)。

交易所止损

Kraken 支持 stoploss_on_exchange,并可以使用止损市价单和止损限价单。这提供了显著优势,因此我们建议加以利用。您可以在 order_types.stoploss 配置项中使用 "limit""market" 来决定使用哪种类型。

历史 Kraken 数据

Kraken API 仅提供 720 根历史 K 线数据,这对 Freqtrade 的模拟运行和实盘交易模式足够,但在回测时会成为问题。要下载 Kraken 交易所的数据,必须使用 --dl-trades 参数,否则机器人会不断重复下载相同的 720 根 K 线,导致您无法获得足够的回测数据。

为了加快下载速度,您可以下载 Kraken 提供的交易记录 zip 文件。这些文件通常每季度更新一次。Freqtrade 要求将这些文件放置在 user_data/data/kraken/trades_csv 目录下。

如果使用增量文件,采用如下结构可能是合理的:将完整历史数据放在一个目录中,增量更新文件放在不同目录中。此模式的前提是数据已下载并解压,且保持原始文件名不变。重复内容将被忽略(基于时间戳),但前提是数据之间没有间隔。

这意味着,如果您的“完整”历史数据截止到 2022 年第四季度,那么 2023 年第一季度和第二季度的增量更新都应可用。缺少这些文件将导致数据不完整,从而在使用该数据时产生无效结果。

└── 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

您可以将这些文件转换为 freqtrade 可用的格式:

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 download-data --exchange kraken --dl-trades -p BTC/EUR BCH/EUR 

正在从 Kraken 下载数据

从 Kraken 下载数据所需的内存(RAM)远高于其他任何交易所,因为交易数据需要在您的机器上转换为 K 线。此外,下载过程也将耗时较长,因为 Freqtrade 需要下载该交易对和时间范围内在交易所发生的每一笔交易,请耐心等待。

rateLimit 调整

请注意,rateLimit 配置项中设置的是请求之间的延迟时间(单位为毫秒),而不是每秒请求数(requests/sec)。因此,为了缓解 Kraken API 报出的“超出速率限制”(Rate limit exceeded)异常,应增大此配置值,而非减小。

Kucoin

Kucoin 为每个 API 密钥要求一个密码短语,因此您需要将该密钥添加到配置中,使您的交易所配置部分如下所示:

"exchange": {
    "name": "kucoin",
    "key": "your_exchange_key",
    "secret": "your_exchange_secret",
    "password": "your_exchange_api_key_password",
    // ...
}

Kucoin 支持 time_in_force,可选设置包括 "GTC"(一直有效直至取消)、"FOK"(全部成交或立即取消)和 "IOC"(立即成交或取消剩余)。

交易所止损

Kucoin 支持 stoploss_on_exchange,并可使用 stop-loss-market 和 stop-loss-limit 订单,这具有显著优势,因此我们建议充分利用该功能。您可以在 order_types.stoploss 配置项中使用 "limit""market" 来决定使用哪种类型的止损单。

Kucoin 黑名单

对于 Kucoin,建议将 "KCS/<STAKE>" 添加到您的黑名单中以避免问题,除非您愿意在账户中保留足够的额外 KCS,或选择禁用使用 KCS 支付手续费。Kucoin 账户可以使用 KCS 支付手续费,如果某笔交易恰好涉及 KCS,后续交易可能会消耗这部分持仓,导致最初的 KCS 交易无法卖出,因为预期的数量已不复存在。

HTX

交易所止损

HTX 支持 stoploss_on_exchange,并使用 stop-limit 订单。这提供了很大优势,因此我们建议通过启用交易所止损来加以利用。

OKX

OKX 为每个 API 密钥要求一个密码短语,因此您需要将该密钥添加到配置中,使您的交易所配置部分如下所示:

"exchange": {
    "name": "okx",
    "key": "your_exchange_key",
    "secret": "your_exchange_secret",
    "password": "your_exchange_api_key_password",
    // ...
}

如果您是在 my.okx.com 域名(OKX EAA)注册的 OKX 账户,则必须使用 "myokx" 作为交易所名称。使用错误的交易所名称会导致错误提示 "OKX Error 50119: API key doesn't exist",因为这两个是独立的实体。

警告

OKX 每次 API 调用仅提供 100 根 K 线。因此,在回测模式下策略可用的数据量会相对较少。

期货

OKX 期货存在“持仓模式”的概念,可以是“买入/卖出”模式或“多空双向”(对冲模式)。Freqtrade 支持两种模式(我们推荐使用“买入/卖出”模式),但不支持在交易过程中更改模式,否则将导致异常并无法下单。此外,OKX 仅提供过去约 3 个月的 MARK K 线数据。因此,在此日期之前的期货回测会产生轻微偏差,因为缺少这些数据将无法准确计算资金费用。

Gate.io

交易所止损

Gate.io 支持 stoploss_on_exchange,并使用 stop-loss-limit 订单。这提供了很大优势,因此我们建议通过启用交易所止损来加以利用。

Gate.io 支持 time_in_force 设置,包括 "GTC"(未取消前有效)和 "IOC"(立即成交否则取消)选项。

Gate.io 允许使用 POINT 支付手续费。由于 POINT 不是可交易货币(没有常规交易市场),自动手续费计算将失败(并默认手续费为 0)。可以使用配置参数 exchange.unknown_fee_rate 来指定 POINT 与质押货币之间的汇率。显然,更改质押货币时也需要相应调整此值。

Gate 的 API 密钥除了您要交易的市场类型外,还需具备以下权限:

  • "现货交易" "永续合约"(读取和写入)(可同时选择两者,或仅选择与您要交易的市场匹配的一项)
  • "钱包"(只读)
  • "账户"(只读)

若缺少这些权限,机器人将无法正常启动,并显示类似 "缺少权限" 的错误。

Bybit

交易所止损

Bybit(仅限期货)支持 stoploss_on_exchange,并使用 止损限价单 订单。该功能具有显著优势,因此我们建议启用交易所止损。在期货交易中,Bybit 同时支持 止损限价单止损市价单。您可以在 order_types.stoploss 配置项中使用 "limit""market" 来决定使用哪种类型。

Bybit 支持 time_in_force 设置,包括 "GTC"(未取消前有效)、"FOK"(全部成交否则取消)、"IOC"(立即成交否则取消)和 "PO"(仅挂单)选项。

目前 Bybit 的期货交易仅支持逐仓模式。

启动时,freqtrade 将为整个(子)账户设置持仓模式为“单向模式”。这可以避免反复调用该接口(从而减慢机器人操作),但意味着手动更改此设置可能导致异常和错误。

由于 Bybit 不提供资金费率历史数据,实盘交易也采用回测中的资金费率计算方式。

用于实盘期货交易的 API 密钥必须具有以下权限:

  • 读写权限
  • 合约 - 委单
  • 合约 - 持仓

我们强烈建议将所有 API 密钥限制在您将要使用的 IP 地址上。

统一账户

Freqtrade 假设账户专供机器人使用。因此我们建议每个机器人使用一个独立的子账户。这一点在使用统一账户时尤为重要。
其他配置(同一账户运行多个机器人、在机器人账户上进行手动非机器人交易)不受支持,可能导致意外行为。

Bitmart

Bitmart 要求 API 密钥附带 Memo(即您为 API 密钥设置的名称),因此在使用时必须同时提供 UID。

"exchange": {
    "name": "bitmart",
    "uid": "your_bitmart_api_key_memo",
    "secret": "your_exchange_secret",
    "password": "your_exchange_api_key_password",
    // ...
}

必要验证

Bitmart 要求完成二级验证才能通过 API 在现货市场成功交易——尽管仅有一级验证时仍可通过用户界面正常交易。

Bitget

Bitget 要求每个 API 密钥都设置密码短语,因此您需要在配置文件中添加该字段,使您的交易所配置部分如下所示:

"exchange": {
    "name": "bitget",
    "key": "your_exchange_key",
    "secret": "your_exchange_secret",
    "password": "your_exchange_api_key_password",
    // ...
}

Bitget 支持 time_in_force 设置,包括 "GTC"(未取消前有效)、"FOK"(全部成交否则取消)、"IOC"(立即成交否则取消)和 "PO"(仅挂单)选项。

交易所止损

Bitget 支持 stoploss_on_exchange,并可使用止损市价单(stop-loss-market)和止损限价单(stop-loss-limit)。这提供了显著优势,因此我们建议您充分利用该功能。您可以在 order_types.stoploss 配置项中使用 "limit""market" 来决定使用哪种类型的止损单。

Hyperliquid

交易所止损

Hyperliquid 支持 stoploss_on_exchange,并使用 stop-loss-limit 订单。这提供了显著优势,因此我们建议您充分利用该功能。

Hyperliquid 是一个去中心化交易所(DEX)。与传统交易所相比,去中心化交易所的运作方式略有不同。私有 API 调用不是通过 API 密钥进行身份验证,而是需要用您的钱包私钥进行签名(我们建议为此使用 API 钱包,可在 Hyperliquid 上或您选择的钱包中生成)。配置方式如下:

"exchange": {
    "name": "hyperliquid",
    "walletAddress": "your_eth_wallet_address",  // This should NOT be your API Wallet Address!
    "privateKey": "your_api_private_key",
    // ...
}
  • 钱包地址(十六进制格式):0x<40 个十六进制字符> — 可直接从您的钱包复制,应使用主钱包地址,而非 API 钱包地址。
  • 私钥(十六进制格式):0x<64 个十六进制字符> — 使用 API 钱包创建时显示的密钥。

Hyperliquid 在 Arbitrum One 链上处理存款和取款,Arbitrum One 是构建在以太坊之上的 Layer 2 扩展解决方案。Hyperliquid 使用 USDC 作为报价/抵押货币。在 Hyperliquid 存入 USDC 需要经过多个步骤,具体操作请参见 如何开始交易

Hyperliquid 通用使用说明

Hyperliquid 不支持市价单,但 ccxt 会通过设置最大滑点为 5% 的限价单来模拟市价单。
遗憾的是,Hyperliquid 仅提供 5000 根历史 K 线数据,因此回测要么需要通过长时间逐步下载数据来构建历史 K 线,要么只能受限于最近的 5000 根 K 线。

一些通用最佳实践(非详尽)

  • 注意防范供应链攻击,例如 pip 包投毒等。每当使用您的私钥时,请确保您的环境是安全的。
  • 不要使用您实际钱包的私钥进行交易。请使用 Hyperliquid 的 API 生成器 创建独立的 API 钱包。
  • 不要将您实际钱包的私钥存储在用于运行 Freqtrade 的服务器上。请改用 API 钱包的私钥。该密钥仅允许交易,不允许提币。
  • 请始终保密您的助记词和私钥。
  • 不要使用与初始化硬件钱包时备份的相同助记词,使用相同的助记词会基本破坏硬件钱包的安全性。
  • 创建一个独立的软件钱包,仅将您打算用于交易的资金转入该钱包,并使用该钱包在 Hyperliquid 上进行交易。
  • 如果您有不打算用于交易的资金(例如盈利后),请将其转回您的硬件钱包。

Hyperliquid 金库 / 子账户

Hyperliquid 允许您创建金库(Vault)或子账户(Subaccount)。
若要在 Freqtrade 中使用这些账户,您需要采用以下配置方式:

"exchange": {
    "name": "hyperliquid",
    "walletAddress": "your_vault_address",  // Vault or subaccount address
    "privateKey": "your_api_private_key",
    "ccxt_config": {
        "options": {
            "vaultAddress": "your_vault_address" // Optional, only if you want to use a vault or subaccount
        }
    },
    // ...
}

现在,您的余额和交易将来自您的金库 / 子账户,而不再是主账户。

历史 Hyperliquid 数据

Hyperliquid API 不提供单次获取当前数据调用之外的历史数据,因此无法下载数据,因为所下载的数据并不构成完整的历史数据。

Bitvavo

如果您的账户需要使用 operatorId,您可以在配置文件中按如下方式设置:

"exchange": {
        "name": "bitvavo",
        "key": "",
        "secret": "",
        "ccxt_config": {
            "options": {
                "operatorId": "123567"
            }
        },
   }

Bitvavo 要求 operatorId 为整数。

所有交易所

如果您持续遇到 Nonce 错误(例如 InvalidNonce),建议重新生成 API 密钥。重置 Nonce 比较困难,通常重新生成 API 密钥更为简便。

其他交易所的零散说明

  • The Ocean(交易所 ID:theocean)使用 Web3 功能,需要安装 web3 Python 包:
pip3 install web3

获取最新价格 / 不完整 K 线

大多数交易所通过其 OHLCV/k 线 API 接口返回当前未完成的 K 线。默认情况下,Freqtrade 假设从交易所获取了未完成的 K 线,并会移除最后一条 K 线,认为其是未完成的 K 线。

您可以通过贡献者文档中的辅助脚本检查您的交易所是否返回未完成的 K 线。

由于存在重绘风险,Freqtrade 不允许您使用这条未完成的 K 线。

但是,如果您的策略需要获取最新价格,可以通过策略内部的数据提供者来实现。

Freqtrade 交易所高级配置

可以使用 _ft_has_params 设置来配置高级选项,这些设置将覆盖默认值和交易所特定的行为。

可用选项在交易所类中以 _ft_has_default 列出。

例如,要在 Kraken 上测试订单类型 FOK,并将 K 线数量限制修改为 200(即每次 API 调用仅获取 200 条 K 线):

"exchange": {
    "name": "kraken",
    "_ft_has_params": {
        "order_time_in_force": ["GTC", "FOK"],
        "ohlcv_candle_limit": 200
        }
    //...
}

警告

请在修改这些设置前,充分理解其带来的影响。