PyCryptoBot / 报错排查

PyCryptoBot 报错怎么查:按现象索引的排查对照表

官方仓库没有独立的排查文档——它的支持渠道是 GitHub Discussions 与 Telegram 群,而 README.md 本身只有约 2 KB,把安装与配置都外链到了作者的个人博客。这一页把「你会看到什么现象」和「去哪个文件、哪个开关、哪条开源记录里找原因」对上,按可核对的方式整理成表。

排查顺序建议固定为四步:先读日志定位是哪个阶段失败 → 再对照 config 排除配置问题 → 然后验证接口与权限 → 最后回看自己跑的是哪一版代码。这个顺序的价值在于:PyCryptoBot 的绝大多数「报错」其实不是程序写错了,而是环境、权限或版本对不上——本站把「版本」放在最后一步,是因为它最容易被忽略,也最容易解释「官方说修了但我还有」这类现象。

需要提前说明一条边界:本站没有实机运行过这个PyCryptoBot 机器人,所有条目都来自源码、配置样本、Dockerfile 与 CHANGELOG 的核对,因此每一条都标注了依据;凡是需要真实账户才能确认的行为,本站只写检查动作,不写结论。

依据:源码错误处理点依据:429 与 recvWindow依据:CHANGELOG 历史修复本站未实机运行
本文验证环境
  • PyCryptoBot v8.2.4(main=1fa9aaef,2024-03-04)
  • Python 3.11(官方 Dockerfile 基线)
  • 交易所范围:Binance / Coinbase / KuCoin
  • 验证日期 2026-09-21
  • 本站未实机运行机器人
读日志定位先判断失败发生在取数、判断还是下单阶段
对照配置开关键方向、周期写法、币对与计价币种
验证接口与权限密钥范围、最小下单量、时钟与时区
回看分支与版本main 还是 beta,钉子依赖是否装对
排错路径示意(依据各交易所 api.py 的错误处理点、429/recvWindow 处理与 CHANGELOG.md 的历史修复记录整理,非官方排查流程)。四格对应本页的四张表;顺序不建议调换——先定位阶段,再改配置。
现象索引

十四个常见现象,分别该查哪里

下表按「你会看到什么」组织,最后一列给出结论依据,便于你自己回到源码或 CHANGELOG 复核。本站不对任何一条做「这是官方 bug」的断言,只记录项目是否修复过同类问题。

现象最可能原因检查什么处置方向依据
日志出现 429、请求被拒调用频率超过交易所限制单周期内的请求次数、是否同时开了多个实例或 scanner降低频率、减少并行实例;不要指望库替你退避某交易所 api.py 有显式 429 处理;其余三家的 retry 计数为 8/17/18,但四家的 backoff 计数均为 0——没有指数退避
时间戳不同步 / 签名校验失败本机时钟漂移,或请求时间窗口过窄系统时间与 NTP 同步状态;时间窗口参数是否被人为改小同步系统时钟;不要随意改动时间窗口参数某交易所 api.py 使用 recvWindow;四家均提供 get_time 类方法用于校准
提示密钥无效 / 未授权密钥权限不足、密钥文件缺失或路径不对密钥文件是否存在于配置里写明的路径;权限是否覆盖现货交易按最小权限重建密钥;确认文件路径与配置一致CHANGELOG 记录过某交易所密钥缺失相关的修复(对应 PR #839)
下单被拒:余额不足计价币种余额不够,或资金在另一个账户账户里计价币种的实际可用余额补齐余额;开启「余额不足记录为警告」的开关以继续运行config 有 enableinsufficientfundslogging 开关,可把该异常降级为日志提醒
下单被拒:数量不合法低于交易所最小下单量,或数量精度不符合步进该币对的最小下单量与数量步进;程序算出的下单量提高单笔规模或调整 buymaxsize;确认精度处理仓库内有市场合法性校验与数量/价格增量处理;CHANGELOG 记录过最小下单函数抛异常与增量计算的修复
启动后报历史数据不足请求的 K 线根数超过交易所单次返回上限该交易所单次返回的最大根数;请求的周期与根数让程序按起始时间分段取数,而不是一次取满CHANGELOG 记录过某交易所只返回 100 行的问题,修复方式是传入计算好的起始时间以取到 300 行
模拟/回测跑完,一笔都没成交买入过滤条件未满足、周期写法不对,或点数阈值未达到disable* 系列取值的 0/1 方向;granularity 的写法;策略要求的点数阈值先用最宽松的过滤组合验证链路能成交,再逐项加过滤买入过滤共 8 个 disable* 键;默认自定义策略是点数制,pts_to_buy 默认 9,而部分趋势分支把该阈值抬到 100(等价于禁止买入)
同一市场被重复买入 / 出现重复下单API 报错后重试、同一轮重复处理、或多实例并行是否同时有多个实例在跑同一个币对;是否共用了同一个数据目录一个币对只跑一个实例;多实例用不同数据目录隔离CHANGELOG 有多轮同类修复记录(涵盖 API 出错重复买入、同一轮重复处理、WebSocket 双重买入、只启动未运行实例)
依赖装到一半编译失败钉子依赖在 Python 3.11 上没有预编译轮子报错里出现的是哪个包;本机是否有 C 编译器与头文件用官方容器镜像(编译阶段已装编译工具),或在裸机上补齐编译环境探测显示 matplotlib==3.3.3pyyaml==5.3.1websockets==9.1 均无 cp311 轮子;而 Dockerfile 的编译阶段确实安装了 build-essential
启动即报配置缺失或解析失败工作目录没有配置文件,或 JSON 格式错误配置文件名是否已从样本改名;JSON 是否有多余逗号或中文标点按样本改出正式配置并做一次 JSON 语法校验仓库提供的是 config.json.sample 系列样本文件,需要自行改名为正式配置
Web 面板空白 / 没有数据控制数据未写入,或界面启动顺序不对是否已开启控制开关;界面相对PyCryptoBot 机器人是早启动还是晚启动先开控制开关并跑起PyCryptoBot 机器人,最后再启动界面;界面刷新有延迟官方界面说明文件写明:界面通过读取控制数据目录工作,需在所有PyCryptoBot 机器人启动后再启动,首次加载约 6–7 秒、刷新间隔约 ±5 秒
进程重启后状态与实际持仓不符本地状态文件与交易所侧真实持仓不同步交易所侧的挂单与持仓;本地状态文件的更新时间以交易所侧为真相核对一次,再决定是否继续运行PyCryptoBot用本地状态文件记录持仓与交易状态(CHANGELOG 多次提到状态文件与异常退出后的处理)
容器起来就退出缺少配置或首次运行前置条件未满足容器日志的第一段报错;挂载的配置是否存在先补配置再启动;注意按需选择退出即重启的策略镜像入口固定为启动器脚本;编排样本里的重启策略是「失败时重启」,正常退出不会拉起
日志里偶发 HTML 或 JSON 解析错误交易所返回了非预期内容(网关页、限流页等)该错误的出现频率与发生时段记录频率;若伴随 429 则优先按限频处理CHANGELOG 记录过「偶发 HTML 错误无法在项目侧修复」与若干 JSON 解析相关的容错改动
读这张表的正确方式:它不是「官方报错码字典」,而是一份把现象映射到可核对位置的索引。同一现象可能有多个原因,最后一步永远是回看日志里失败发生的阶段——取数失败、指标失败、下单失败,三者的处置方向完全不同。
先看哪里

日志里有什么、在哪里看

排错的第一步不是改配置,而是先把「失败发生在哪」这一件事确定下来。下面这张表列出可以看的对象与各自能回答的问题。

要看的对象路径或命令能看到什么注意点
PyCryptoBot 机器人日志文件工作目录下的 pycryptobot.log(编排样本里作为卷挂载)每一轮的分析结果、买卖判断、接口调用与异常先看最后一屏,再看异常第一次出现的位置,不要从文件头读
日志服务入口仓库根目录的 logsvc.py与日志相关的服务入口,用于把日志分离出来查看它是独立进程,需要单独启动;本站未实测其界面形态
日志开关配置里的 disablelog开启后可关闭日志写入排错期间不要关日志,否则会失去唯一的现场证据
日志级别配置里 telegram 段的 logger_level控制通知与日志的详细程度标准样本里默认是 DEBUG;降低级别有助于减少噪声
成交明细导出工作目录下的 csv/ 目录与其中的交易明细文件逐笔成交记录,可用于核对「到底下了几单」怀疑重复下单时,先看这份明细而不是只看日志文本
你实际跑的是哪一版在仓库目录执行 git log -1 --format="%h %ad %s"当前代码的 commit、日期与提交信息这一步放在最前也不为过——它能直接排除一整类「版本差」问题
本地状态与交易所侧对账交易所网页端或官方客户端真实挂单、真实持仓与真实余额本地状态文件不是真相来源,交易所侧才是
一个实用习惯:把「最后一轮日志 + 当前配置 + 当前 commit」三样东西一起留存。绝大多数求助帖缺少的正是这三样,导致讨论只能停留在猜测层面。
对照配置

五步把配置逐项核对一遍

配置类问题的特点是「程序不报错、行为不符合预期」。下面五步按「最容易搞错」的顺序排列,每一步都给出可直接执行的检查动作与预期结果。

  1. 确认运行模式开关的值

    检查动作:打开配置文件,找到交易所段里的 live。预期结果:值为 0 表示非实盘,1 表示实盘。如果你「明明改了策略却什么都没发生」,先确认这个值——非实盘模式不会真实下单。

  2. 确认周期(granularity)的写法

    检查动作:看该交易所段的 granularity 字段。预期结果:同一份官方样本里存在两种写法——有的交易所段写字符串 "1hour",有的写整数秒 "3600"。周期只支持 7 档固定值(1m / 5m / 15m / 30m / 1h / 6h / 1d),写一个不在枚举里的值不会自动纠正。

  3. 确认 disable* 系列的方向

    检查动作:逐个看买入侧 disable 开头的开关取值。预期结果:值为 1 表示「关闭该项过滤」0 表示「启用该项过滤」——方向与字面直觉相反。官方两份样本里各项的默认方向并不一致,所以「照抄默认值」不等于统一口径。若模拟跑完没有成交,先把过滤逐项放开验证链路。

  4. 确认币对与计价币种

    检查动作:核对基础币种、计价币种,以及账户里该计价币种的实际余额。预期结果:币对的写法要与交易所的命名一致;计价币种余额决定了PyCryptoBot 机器人是否有资金可下单。

  5. 确认密钥文件路径真的存在

    检查动作:按配置里写的密钥文件名,在工作目录确认文件存在且可读。预期结果:文件存在、内容格式正确、权限不对外开放。这一步能排掉相当一部分「提示未授权」的误判。

接口与权限

哪七项接口与权限检查最容易误判?

「常见误判」这一列是这张表的价值所在——很多被当成程序 bug 的现象,实际是权限或账户设置问题,改代码永远改不好。

检查项怎么做期望结果常见误判
密钥权限范围在交易所后台查看该密钥已勾选的权限覆盖现货交易所需的最小集合把「只读权限」当成「可以下单」,于是把所有失败都归因于代码
是否误开提现权限检查密钥是否勾选了提现 / 转账类权限关闭提现权限「权限越多越保险」——实际相反,多开的权限只增加风险,不提升成功率
IP 白名单若使用了白名单,确认运行机器的出口 IP 已在其中请求来源 IP 与白名单一致换网络、换 VPS 或启用代理后忘记同步白名单,表现为「昨天还能用」
交易所侧最小下单量在交易所页面查该币对的最小下单量程序算出的单笔规模高于该下限把「下单被拒」当成代码错误,实际是资金规模不够一个最小单位
地区与端点可用性确认当前网络能正常访问配置里写的接口地址配置里的接口地址可访问把网络层失败(超时、无法解析)当成密钥问题反复重配
沙箱与正式环境确认密钥属于哪个环境、接口地址是否与之匹配密钥环境与接口地址一致用测试环境密钥打正式接口,或反之,表现为「密钥无效」
时间窗口与系统时钟同步系统时钟;确认请求时间窗口未被改小本机时间与标准时间偏差在秒级以内忽略容器与宿主机的时区差异;容器里时间不滚动导致签名持续失败
接口调用的并发度统计同一时间在跑几个实例、是否有额外脚本在调同一账户同一账户的并发调用可控多实例 + 扫描脚本同时打同一个账户,触发限频却以为是程序写错
一条通用判断:如果错误信息里出现「未授权 / 拒绝 / 无效」这类词,优先怀疑权限与环境,而不是策略逻辑;反之,如果错误里出现具体数值(数量、精度、余额、最小量),优先怀疑规模与精度。这两类的处置方向没有交集。
版本相关排查

「官方说修了但我这里还有」怎么办?

这是本站认为最值得单独成表的一类问题:它不属于你的配置错,也不属于代码错,而是你手上那份代码和别人讨论的那份不是同一版

症状可能原因结论依据怎么做
按 README 命令更新后,问题依旧README 教的更新方式拿到的是主干分支,而主干已有一段时间没有新提交主干分支最后一次提交是 2024-03-04;最新发行版 8.2.4 也在同一天不要假设「pull 过就是最新」;先看 commit 与日期,再判断问题是否可能已在新代码里被修
看到一个修复记录,但代码里找不到对应改动该修复在另一条分支上,尚未合并进主干仓库的领先分支上有一条 2025-05-26 的提交,比主干新约 14 个月确认该修复位于哪条分支;若不在主干,说明按 README 更新拿不到它
依赖升级后行为变了 / 装不上项目把多个依赖钉在 2020–2022 年的版本上,「升级依赖」会去装这些旧钉子依赖清单里存在无对应 Python 版本轮子的旧包;仓库里存在一条未合并的依赖升级改动升级前先看清要装的具体版本号;不要用「装最新的」这种模糊预期
找不到「最新版」的发布说明变更日志的最后一条记录停在 8.2.0发行版标签到 8.2.4,但变更日志末条是 8.2.0把变更日志当补充材料,不要当完整发行说明;以标签与提交为准
想用 pip 升级却提示找不到包PyCryptoBot没有发布到包索引四个常见候选包名在包索引上均不存在升级只能走仓库拉取或容器镜像两条路;不要试图 pip 升级
换机器后表现不同两台机器上装到的依赖版本不同依赖清单里既有钉死版本的包,也有未钉版本的包把装好的完整依赖清单一并留存,换机器时对照,而不是只装清单里那几行
不确定该用主干还是领先分支两条分支各有取舍:主干稳但有已知未修问题,领先分支新但未经发行验证两条分支的提交日期与发行标签状态先明确你的目标(追新修还是求稳),再选分支;不要把两条分支的代码混用来排查
三条可直接执行的核对命令:在仓库目录依次执行 git log -1 --format="%h %ad %s"(看当前 commit 与日期)、git branch -a(看本地与远端有哪些分支)、git tag --sort=-v:refname | head -5(看最近的发行标签)。把三条的输出贴进求助帖,比任何文字描述都有效。
本站的结论口径:只陈述分支、提交与发行的时间线事实,不推断官方后续计划,也不替官方判断某个名称或做法是否「已过时」。版本与分支现状页有完整的原始数据与采集日期。
FAQ

关于报错排查的高频问题

回答依据源码、配置样本与仓库变更日志的核对结果;涉及运行期行为的结论以你的实际环境与官方仓库为准,本站未实机运行。

遇到 429 限频到底该怎么处理?

先降低请求频率,再排查并发来源。可核对的事实是:四个交易所实现里都有错误处理,其中三家写了重试逻辑(重试相关代码的出现次数分别为 8、17、18),另一家则对 429 有显式处理但重试计数为 0;四家都没有指数退避(退避关键词命中均为 0)。这意味着程序不会自己「越限越慢地退让」,所以真正的解法通常是减少同一时间在跑的实例、降低轮询频率、或确认是否有额外脚本在打同一个账户。

提示时间戳不对或签名失败,改代码有用吗?

通常没用,优先改环境。这类错误的根源一般是本机时钟漂移、容器与宿主机时区不一致,或者有人为了「更快」把请求时间窗口改得很小。仓库里提供了取交易所时间的方法用于校准,也有交易所使用了请求时间窗口参数。正确顺序是:先同步系统时钟并确认容器时间在滚动,再考虑是否动过时间窗口参数。

提示密钥无效或未授权,怎么快速判断是权限还是代码问题?

用「错误信息里有没有具体数值」来判断。如果错误只说未授权、拒绝、无效,优先查权限与环境:密钥勾选的权限范围、密钥属于哪个环境、配置里写的接口地址是否与之匹配、密钥文件路径是否真的存在。如果错误里带具体数值(数量、精度、余额、最小量),那就是规模与精度问题,改权限不会有帮助。

数量精度错误是怎么回事?

交易所对每个币对都有数量与价格的步进要求,程序算出的下单量必须落在合法格点上,且不低于最小下单量。可核对的是:仓库内有市场合法性校验以及数量/价格增量的处理代码,变更日志里也记录过最小下单相关函数抛异常、以及增量计算问题的修复。实务上先做两件事:到交易所页面确认该币对的最小下单量与精度,再看程序算出的单笔规模是否在其中。

模拟跑完了却一笔都没成交,最可能是哪里?

按三步排查。第一,看运行模式:非实盘模式下不会真实下单,判断「有没有成交」要看模拟输出而不是账户。第二,看过滤开关:disable 开头的开关值为 1 表示关闭该项过滤,方向与直觉相反,而官方两份样本里各开关的默认方向并不一致——照抄默认值不等于统一口径。第三,看策略阈值:默认自定义策略是点数制,买入选点数默认 9,而部分市场趋势分支会把该阈值抬到 100,相当于「本阶段不买入」。建议先用最宽松的过滤组合验证链路能成交,再逐项加回过滤。

依赖装不上,是不是我的环境有问题?

不完全是。可核对的探测结果是:依赖清单里钉死版本的包中,有三个在 Python 3.11 上没有预编译轮子(只发布到更早的 Python 版本),因此必须本地编译;而同清单里另有一个重量级包是有新版本轮子的。这也解释了为什么官方容器镜像能在同一 Python 版本上装成功——它的构建阶段安装了编译工具链。所以裸机装失败时,合理的做法是补齐编译环境,或者直接用官方容器路径。

Web 面板打开是空白的,是没数据还是启动错了?

两者都可能,但先查启动顺序。官方界面说明文件写明:界面通过读取控制数据目录工作,需要在控制开关打开、且所有PyCryptoBot 机器人启动之后再启动界面;首次加载约需 6–7 秒,之后刷新间隔约 ±5 秒。因此「刚打开就空白」未必是故障,「一直是空白」则先确认控制开关是否开启、界面是否早于机器人启动。本站未实测该界面的实际可操作项。

下一步:怎么确定你跑的是哪一版?

排错走到最后,很多现象都收敛到同一个问题——你手上的代码和讨论里的代码不是同一版。版本与分支现状页给出完整的分支清单、提交日期与发行时间线,可以直接用于核对。