面向 Freqtrade 的 ccxt 最佳实践清单 👈 你可以稍后阅读¶
一、在 Freqtrade 里正确“摆放” ccxt¶
1) 最小可用配置(Spot 现货)¶
{
"exchange": {
"name": "binance",
"key": "YOUR_KEY",
"secret": "YOUR_SECRET",
// ccxt 通用配置(同时作用于同步/异步实例)
"ccxt_config": {
"enableRateLimit": true, // 强烈建议:内置限流
"timeout": 30000 // 30s 超时(按需调整)
},
// 仅作用于同步实例(下单/REST 轮询)
"ccxt_sync_config": {
"enableRateLimit": true
},
// 仅作用于异步实例(WS/并发拉取等)
"ccxt_async_config": {
"enableRateLimit": true,
"rateLimit": 500 // 例:每 500ms 1 次;具体值看交易所规则
},
// WebSocket(Freqtrade 用 ccxt.pro 接入,默认启用)
"enable_ws": true
}
}
enableRateLimit
/rateLimit
是 ccxt 的内置节流选项;不开很容易 429/临时封禁。(CCXT 文档)- Freqtrade 的
exchange.enable_ws
通过 ccxt.pro 消费行情流(官方已将 ccxt.pro 的功能并入主库,概念沿用)。(Freqtrade, GitHub)
2) 期货账户(以 Binance U 本位为例)¶
Binance 期货建议直接用专门的 exchange id:
{
"exchange": {
"name": "binanceusdm", // ✅ 正确:USDT-M Futures
"key": "YOUR_KEY",
"secret": "YOUR_SECRET",
"ccxt_config": { "enableRateLimit": true }
}
}
这是维护者在社区答复中推荐的方式,优于
options.defaultType='future'
的旧写法。(Stack Overflow)
3) 代理(频繁下载 K 线 / 公司网络出海)¶
全局(除交易所外):用环境变量
export HTTP_PROXY=http://host:port export HTTPS_PROXY=http://host:port
仅交易所流量:放到
ccxt_config
"exchange": { "ccxt_config": { "httpsProxy": "http://host:port", "wsProxy": "http://host:port" } }
这一段是 Freqtrade 文档推荐的做法;
httpsProxy/wsProxy
是 ccxt 支持的代理键名。(Freqtrade, CCXT 文档)
4) 不同交易所限流基线¶
用
enableRateLimit
打开内置限流,并按交易所要求设置rateLimit
。例如 Kraken 官方示例里给了 3100ms(仅示例,实际以交易所规则为准):
"ccxt_async_config": { "enableRateLimit": true, "rateLimit": 3100 }
(GitHub)
5) 市场元数据刷新¶
- 频繁上新/退市时,把
markets_refresh_interval
调高一点(默认 60 分钟):"exchange": { "markets_refresh_interval": 60 }
。(Freqtrade)
二、实盘/回测的“稳健十条”(和你分模块跑的习惯相配)¶
限流+并发
- 打开
enableRateLimit
,批量拉多交易对时控制并发(异步端再加rateLimit
)。(CCXT 文档)
- 打开
超时/重试
timeout
≥ 10s(建议 20–30s),对临时DDoSProtection/ExchangeNotAvailable
做指数回退重试。(Scribd)
精度与最小下单量
- 依据
load_markets()
返回的precision
/limits
做数量与价格合法化(策略内做 round/clip)。
- 依据
账户/产品线选择
- 期货/永续用专用 id(如
binanceusdm
),现货用binance
;避免混用导致签名/路由错误。(Stack Overflow)
- 期货/永续用专用 id(如
WebSocket 优先、REST 兜底
代理与网络
- 公司网络下尽量给“交易所流量”走
httpsProxy/wsProxy
,把下载器、Telegram 等放全局代理。(Freqtrade)
- 公司网络下尽量给“交易所流量”走
下载与缓存
- 批量补历史数据时,必要时设
only_from_ccxt
以强制走交易所源(兼顾一致性 vs 速度)。(Freqtrade)
- 批量补历史数据时,必要时设
沙盒/干跑
- 初次上线或大改策略,先
dry_run: true
;可再结合交易所测试网(若支持)。(Freqtrade)
- 初次上线或大改策略,先
交易所差异化参数
- 通过
params
定制(如不同 Stop 类型命名差异);遇到“触发单/止盈止损”命名不一致时,查各所说明。(Stack Overflow)
- 通过
配置分层与密钥隔离
- 用
add_config_files
或多--config
,把密钥放私有文件,公用配置里仅放通用参数。(Freqtrade)
三、你最常用的两段模板¶
A) Binance 现货 + 代理 + WS + 限流¶
{
"exchange": {
"name": "binance",
"key": "YOUR_KEY",
"secret": "YOUR_SECRET",
"enable_ws": true,
"ccxt_config": {
"enableRateLimit": true,
"timeout": 30000,
"httpsProxy": "http://127.0.0.1:7890",
"wsProxy": "http://127.0.0.1:7890"
},
"ccxt_async_config": { "enableRateLimit": true, "rateLimit": 500 }
}
}
这一套满足你“一边拉数据一边跑模拟”的模式,尽量把实时订阅交给 WS,减少 REST 压力。(Freqtrade)
B) Binance USDT 永续(USDM)¶
{
"exchange": {
"name": "binanceusdm",
"key": "YOUR_KEY",
"secret": "YOUR_SECRET",
"ccxt_config": { "enableRateLimit": true }
}
}
用专用 id 避免期货/现货 API 搞混。(Stack Overflow)
四、ccxt 背景速览(你关心的“底子”)¶
定位 / 作用:跨多语言(JS/TS、Python、PHP、C#、Go)的“统一交易所 API”库,覆盖行情、订单、账户、历史 K 线等,常用于策略研究、回测、实盘与做工具层。(GitHub)
文档丰富度:
WebSocket:原 CCXT Pro 的 websocket 能力自 **v1.95+(2022-10)**并入免费主库;接口延续
watch_*
形态。(GitHub)维护与团队:
- GitHub 组织活跃,核心维护者包含 Igor Kroitor (kroitor)、Carlo Revelli (frosty00) 等。(GitHub)
- PyPI 元数据作者为 Igor Kroitor,许可证 MIT,近月仍在更新(例如 2025-08 的发布记录)。(PyDigger)
- 有 OpenCollective 赞助支持(包含近期的交易所/公司月度赞助)。(opencollective.com)
支持交易所体量:官方描述“100+”家以上(不同来源统计略有差异,以 docs/PyPI 描述为准)。(PyDigger)
历史沿革:社区与媒体普遍将项目起源追溯到 2016–2017 年(学术与资讯页面均有该时间窗的引用/记载)。(ETH Zürich, Binance)
五、和你的使用场景强相关的补充建议¶
- 分离“数据抓取”和“信号/撮合”: 把高频行情订阅放 WS,回测/补数据走 REST 批量(限流 + 缓存);策略线程仅消费统一的“本地缓冲/队列”,减少 API 压力。(GitHub)
- 交易所特殊性:
触发单/止盈止损命名不一,必要时查各自参数(例如某些所需要
stop_loss_limit
/take_profit_limit
)。(Stack Overflow) - 上线流程:
dry_run
→ 小资金实盘 → 扩容;每一步都跑足 1–2 个波动周期,观测订单生命周期(提交→挂单→部分成交→撤单/补单)。(Freqtrade)