机器人底层用了 CCXT,换一家平台跑还要重新核哪些东西

CCXT 是夹在机器人和各家交易所接口中间的一层开源代码库。机器人要下单、查余额、取 K 线时,先按 CCXT 定的同一套叫法说一遍,由它换成对面那家交易所自己的请求格式发出去,返回的结果也由它整理成同一种样子再交回来。
所以一个机器人写着底层用 CCXT,说明它接入新平台时,程序那头要改的地方很少。平台那头的规矩一条没少:最小下单量、价格和数量能写到小数点后几位、支持哪些订单类型、每秒能发多少次请求,仍旧各家各样,换平台前要重新看的就是这些。
CCXT 夹在机器人和交易所之间,做的是翻译这一层
API 是交易所开给程序用的接口,程序靠它发指令、取数据。每家的 API 长得都不一样:地址不同,参数名不同,返回的数据排布也不同。CCXT 仓库的 README 对自己的介绍是一个连接 100 多家交易所的加密交易接口库,用途列了行情存储、分析、策略回测、写机器人这几样,面向的是开发者、懂技术的交易者和数据分析人员。用现成机器人的人碰不到它本身,是隔着机器人在用。
它的结构在 在线手册(Manual) 开头几段就讲完了:库里每家交易所对应一个"类",可以理解成一份只针对这家的翻译手册,各自实现这家的公共接口和私有接口;所有的类都建在同一个基础类上面,共用一组方法。公共接口拿行情,不需要任何身份验证。私有接口用来交易和读账户数据,需要验证,也就是机器人让你填 API 密钥(平台发给程序用的一对钥匙)的那部分。
翻译之外,它还留了一条直通的路。每家交易所原本的每个接口,在库里都有一个对应的"隐式方法":参数原样送过去,拿回来的是这家交易所自己格式的原始结果,不做整理。手册的建议是优先用统一方法,隐式方法留给统一方法还没覆盖到的情况。机器人的某个功能若只支持少数几家平台,一种可能就是它走了这条路。
下单、查余额、取 K 线,换平台后叫法不变的有哪些
方法的名字和参数顺序是固定的。取最新价是 fetchTicker,取盘口(买卖双方的挂单队列)是 fetchOrderBook,取 K 线是 fetchOHLCV,查余额是 fetchBalance,下单是 createOrder,撤单是 cancelOrder,查自己的成交是 fetchMyTrades。下单方法的参数固定按"交易对、订单类型、买卖方向、数量、价格、附加参数"这个顺序排。机器人的作者写一遍下单逻辑,接哪家用的都是这一句。
交易对在库里统一写成中间带斜杠的大写字母,像 BTC/USDT 这样。各家交易所内部对同一个交易对另有自己的编号,叫 market id,真正发请求时用的是编号。机器人配置里要是让你填 BTC/USDT 这样的写法,填的就是库里的统一写法。个别币种的代号各家不一致,库会按已知的对应关系替换,比如把 XBT 换成 BTC。
出错的时候,各家交易所报的是自己的错误码和文字。CCXT 把它们归进一棵固定的错误类别树,机器人日志里看到的 NetworkError、InvalidOrder 这类英文名就是树上的节点。
最小下单量、精度、订单类型和限频仍是各家定的
同一句话说出去,对面认不认、认到多细,这一层管不了。手册里有几个词专门对应这部分,机器人的文档和报错里也会出现。
has(能力表)。每家交易所的类都带一张表,逐个标出统一方法在这家的情况。标 true 是交易所原生有这个接口,库也已经统一;标 false 是这家交易所的接口里本来就没有;标 emulated 是交易所没有,由库用别的接口拼出一个结果;空值是库里还没实现。主要的几家另有一张 features 表,按现货、合约这些市场类型列出支持哪些方法和功能。同一个功能在一家平台能开、在另一家是灰的,可以先往这张表上想。
params(附加参数)。多数统一方法末尾都留了一个可选的附加参数位,用来塞这家交易所特有的设置,里面能填什么要查这家自己的接口文档。一家交易所不会接受另一家的附加参数,两者不能互换。只减仓、止盈止损、追踪委托这类进阶下单方式,在 CCXT 的 FAQ 页 里都是靠这个位置传的。同一页里还有一个容易栽的差别:现货市价买入时,许多交易所要求"数量"填的是花多少计价货币(比如多少 USDT),不接受填买多少个币。
precision 和 limits(精度和限额)。precision 管价格、数量能写到多细,limits 管单笔数量、价格、金额的最小值和最大值。这两样容易混:最小下单数量是 0.05、数量精度是 0.0001,可以同时成立,前者管能不能下,后者管能写几位。库会把每个交易对的这些数值读回来放在市场信息里,但它不替人把关,守在所有限额和精度之内归使用者负责。对用现成机器人的人来说,"使用者"先是机器人的作者,他有没有替你取整、有没有在下单前比一下下限,要看机器人自己的文档。
rateLimit(请求间隔)。库里有一个内置限速器,默认开启,会在后台把连续的请求隔开,目前还带着实验性的标注。间隔的默认值偏保守,各家实际给的额度不同。限速器是每个实例各有一个(程序里每建一个连到某家交易所的对象,就是一个实例),一个实例不知道另一个实例发了多少请求。
| 项目 | CCXT 做到哪一步 | 你要自己核什么 |
|---|---|---|
| 下单、撤单、查余额的叫法 | 统一 | 不用核 |
| 交易对写法 | 统一成带斜杠的写法 | 新平台有没有这个交易对,当前是否开放交易 |
| 订单类型与附加参数 | 只统一了入口,内容各家不同 | 策略用到的订单类型在新平台是否支持 |
| 最小下单数量与金额 | 能读到数值,不替你遵守 | 策略里最小的那笔单是否高于下限 |
| 价格与数量精度 | 能读到数值,不替你遵守 | 按新精度取整后,每笔数量和价格间距变了多少 |
| 手续费 | 市场信息里带吃单、挂单两个费率字段,数值各家不同 | 按新费率重算单笔利润 |
| 请求频率 | 有内置限速器,额度各家不同 | 轮询间隔(程序隔多久问一次行情),以及同一账户上还有没有别的程序在发请求 |
| 行情快慢 | 不处理 | 新平台行情的更新节奏 |
吃单(taker)指你的单直接和盘口上已有的挂单成交,挂单(maker)指你的单先挂在盘口上等别人来成交,两种费率在市场信息里是分开的两个字段。这篇里几个词的解释和错误类别的划分,对应 2026 年 10 月 docs.ccxt.com 上 Manual、FAQ、AI Skills 三页的版本,库更新后字段和默认值可能改,用的时候看机器人实际装的是哪一版。
日志里的 NetworkError、InvalidOrder、RateLimitExceeded 各指哪类问题
排错时先分清错误落在树上的哪一枝。按 CCXT 文档站 AI Skills 一页 的划分,NetworkError 一枝属于可恢复的错误,做法是隔一会儿再试,连续失败就把间隔拉长;ExchangeError 一枝属于不可恢复的,原样再发一遍还是错。
NetworkError 这一枝里,RateLimitExceeded 指撞到了请求频率上限,等一等再发。仓库的错误定义文件(python/ccxt/base/errors.py)里,同一枝上还挂着 RequestTimeout、ExchangeNotAvailable、OnMaintenance、DDoSProtection 几个名字,字面意思依次是请求超时、交易所不可用、维护中、DDoS 防护。看到这一枝的错误,问题出在路上,或者对面暂时不接,策略参数本身没有被拒绝。撞限频之后隔多久再发、间隔里为什么要加一点随机量,收到 429 之后怎么重试 里有具体做法。
ExchangeError 这一枝里,AuthenticationError 指 API 凭证无效,InsufficientFunds 指余额不够,InvalidOrder 指订单参数不合规。同一枝上还有 NotSupported 和 BadSymbol,字面意思是不支持这个功能、交易对名字不对。这一枝的错误重发没有用,要改的是密钥、余额、下单参数,或者干脆换一种这家支持的做法。
同一套策略换一家平台跑,要重新看的几样东西
换平台时,机器人配置里要改的可能只有平台名和密钥两处,策略参数原封不动就能启动。程序能启动,只说明叫法对上了。
打开新平台的交易规则页,或者让机器人把这个交易对的市场信息打印出来,抄下四个数:最小下单数量、最小下单金额、价格的最小变动单位、数量的最小变动单位。拿策略里最小的那一笔单去比,金额低于下限的会被拒;数量按新精度取整后若变成 0,或者和原来差出一截,每次进出的仓位就变了。再看手续费页上吃单、挂单两个费率,把单笔预期利润减掉一买一卖两次费用,看还剩多少。最后翻机器人的文档,查它对新平台标了哪些订单类型可用,策略用到的止损单、只减仓这类若没列出来,就当作不支持。
拿网格来说,每格的下单额是总资金除以格数得出来的,格子分得密时单格金额很小。原平台的下限低,它跑得起来;换到下限高一些的平台,同样的格数会有一批单发不出去。这类拒绝重试没有用,得把每格金额提到下限以上,比如减少格数。
限频也要重新看。内置限速器各算各的:同一个账户上同时开两个机器人,或者机器人之外还有脚本在轮询行情,各自都以为没超。平台那边怎么合计,要读它的接口文档。
行情这一头,CCXT 取的是那家平台给的数据,平台更新得慢、合并得粗,到机器人手里也一样。换平台后信号触发的时机和原来对不上,可以先往 各家行情价为什么不一样 那边查。
还没打算放真钱、只在模拟模式里试的人,这几项同样可以先看:市场信息走的是公共接口,读它不需要密钥,也不需要往平台里充钱。
接着读:下单那一行报了超时,先查这笔单到底成没成 再决定要不要补;换平台后费率变了,定期调仓的成本要重算,见 按日历调还是按偏离调;只在模拟模式里跑的,接着看 Freqtrade 的 dry-run 和实盘差在哪。