交易机器人不下单、报错怎么办?自动下单程序的九类故障先查什么

策略写对了,自己跑的交易机器人(自动下单程序)照样可能在运行时出问题:该下的单没下、请求报错,或者进程没退、日志还在滚,但它的状态、配额或参数已经和账户、行情对不上。这里按「连接与请求」「信号与订单」「数据与参数」三组列出九类故障,每类只讲现象和第一步该查什么,展开的排查步骤放在各自的文章里。
九类故障一览
| 故障 | 会不会报错 | 第一步查什么 |
|---|---|---|
| 断线后状态错位 | 断线有,重连后的错位没有 | 重连后重新拉持仓和挂单对账 |
| 下单请求超时 | 有 | 按自己起的订单号查这张单 |
| 限频 | 有(429,继续发会变成 418) | 响应头 Retry-After |
| 信号没到下单程序 | 不一定 | 警报日志的 Webhook 状态和接收端请求记录 |
| 订单时效选错 | 没有 | 订单的时效参数,未成交部分去了哪 |
| 换平台后规则不同 | 有时有(下单被拒) | 该平台的最小下单量、精度、订单类型 |
| 行情口径不一致 | 没有 | 程序用的是哪种价格、延迟多少 |
| 模拟盘结果带不到实盘 | 没有 | 模拟盘对滑点、成交、手续费的假设 |
| 参数漂移 | 没有 | 定期回看实际成交 |
表里「没有」报错的那几行只能靠主动去查,程序和接口都不会提醒你。
连接与请求:断线、超时、限频
断线:挂单还在,做决策的程序不在
已经挂在平台上的委托单不会因为程序掉线而消失,价格到了照样成交。断线切掉的是另一半:程序收不到成交回报,也发不出新指令。止损如果写在本地逻辑里、靠程序判断价格后再发平仓单,断线期间它就不存在。能挂到平台上的保护性委托,不要留在本地。
重连之后,程序内存里的持仓和挂单还停在断线前。重连后的第一件事应当是重新拉一次真实持仓和挂单,对不上就停下来等人处理,不让程序自己往下猜。
下单请求超时:成没成不知道
请求发出去没等到回应,不等于没下成,直接重发可能变成两张单。下单时带上自己起的订单号,超时后按这个编号查,或者在当前委托和成交记录里找这张单。查到与查不到各怎么处理、没带编号怎么收拾,见 下单请求超时了,这一单到底成没成?
限频:出错后的立即重试最危险
一个请求失败后立刻重试、再失败再重试,循环几秒钟就能把配额用完,到真要撤单时请求也发不出去。收到 429 先停下;响应带 Retry-After 就照它等,没带就让等待时间逐次翻倍并加随机错开,设好封顶值和重试次数。
币安现货 REST API 文档的访问限制一节写明,访问限制按 IP 计算而不是按 API Key;收到 429 后仍继续发会被封禁 IP 并返回 418,封禁时间从 2 分钟到 3 天。撤单、平仓这类请求要留出余量,别让轮询行情的循环把配额吃光。每一步怎么排见 接口返回 429 之后,先做什么、等多久再重试。
信号与订单:信号没到、时效选错、换平台
警报响了,下单程序没动
从图表警报到交易所订单要过四段:警报触发、Webhook 发出、接收端收到、下单程序提交。对照 TradingView 警报日志里的 Webhook 状态和接收端的请求记录,就能定位信号停在哪一段。四段各自怎么核,见 TradingView 警报响了却没下单,Webhook 信号分四段查。
订单时效选错
GTC 把没成交的部分留在盘口等,IOC 成交多少算多少、剩下的撤掉,FOK 不能一次全成就整张撤。程序如果按「下了单就等于全部成交」来记账,用 IOC 时会多记没成交的那部分,用 GTC 时会漏掉还挂在盘口的残单。用一组盘口数字算三种时效的结果,见 IOC、FOK、GTC 有什么区别,下单时该选哪个?
换一家平台,规则跟着变
用 CCXT 这类开源库时,下单、查余额、取 K 线的叫法是统一的;最小下单量、精度、支持的订单类型和限频,仍由各家平台自己定。同一套代码换平台跑之前,这几项要逐项重核,清单在 机器人底层用了 CCXT,换一家平台跑还要重新核哪些东西。
数据与参数:行情口径、模拟盘、参数漂移
程序看到的价格和你看到的不是一个数
最新成交价、盘口买一卖一、指数或标记价是三种口径,同一时刻数值可以不同;再加上数据延迟和还没收线的那根 K 线,程序拿到的「当前价」和图上看到的可能对不上。用错口径的程序,运行时一点毛病没有,决策依据也是偏的。见 AI 工具看到的行情和你看到的不一样:数据源、延迟与口径。
模拟盘的结果带不到实盘
以 Freqtrade 的 dry-run 为例:它用实时行情加模拟钱包,订单不发到交易所;市价单滑点最多算 5%,限价单到价就记成交,手续费按默认档。这几条假设到了实盘不一定成立,切换前逐条核,见 Freqtrade dry-run 的结果哪些带不到实盘。
参数漂移:不报错,只是不再合适
网格的上下轨和间距、趋势策略的周期、止损的百分比,都是在某一段行情里调出来的,隐含的假设是之后的波动和当时差不多。行情换了状态,程序不报错,接口照常返回,它只是按不再合适的参数继续下单。
能看见它的地方只有成交记录:成交频率和设参数时的预期对不上;区间类策略的价格长期贴在一侧,另一边的格子一直没用上;单笔盈亏比在变差。定一个固定的回看节奏,把这段时间的实际成交和当初的假设并排比。调参时怎样留一段没碰过的数据做检验,见 回测调完参数,要留一段没碰过的数据再考一次。
开跑前落实的三件事
- 每开一个策略,先回答「此刻掉线,这单会怎样」。答不上来就先别开。答案通常指向同一个动作:把保护性委托挂到平台上。
- 留一个几秒内能停的开关。停下之后不再发新单,并且不依赖改配置、重新部署。
- 让程序定期把三个数写到你看得到的地方:当前持仓、挂单数量、最近一次成功请求的时间。有这三个数,出了问题能很快分出是上面哪一类;没有就只能翻日志。
策略思路或代码骨架如果是让 AI 帮着出的,它给的参数和阈值要对照官方文档逐项核,原因和四个例子在 AI 给的交易建议为什么不能直接照做。API 密钥的权限和 IP 白名单怎么设,见 币安 API 密钥怎么设才安全。