故障排查 · OKX Webhook

OKX 错误码 54094
冷静期扩到 REST/WebSocket,webhook 被 server-side 拒单

2026-07-31·9 分钟

你把 TradingView alert 接到 OKX,某天开始 webhook 送过去只拿回一个 54094API key 没过期、IP 白名单没动、额度也还在——但 OKX 冷静期 API 拒单这件事从 2026-07-07 起就是系统设计上的预期行为,不是你哪里设错。这篇把 OKX 官方《Notice on Upgrade to the Futures Cool-off Period》与 OKX API v5 changelog 那两份原文,跟你的 webhook payload 对到字段,把「哪些单会被拒、哪些不会、既有用户要不要担心」讲清楚。

这篇不评论 OKX 这个机制设计得好不好——冷静期本身是保护散户的功能,我们没有立场否定它。这篇也不教你怎么绕过去,因为它是 server-side 执行的,没有任何客户端做法可以绕。范围缩在这里:告诉你 54094 是什么、你的 webhook 为什么会踩到、以及可以怎么调整流程。

先讲结论
三件事,重要性排序:第一,只有「开仓/加仓」的非 reduce-only 单会被拒回 54094,你原本要走 reduce-only 的平仓单一律放行;第二,策略单(Strategy Order)与跟单(Copy Trading)不管开平都会被拒——这比 REST 一般单严——所以走 OKX 内建策略下单的 bot 完全动不了;第三,如果你是在 2026-07-07 升级前就已经设过冷静期的旧用户,你会沿用旧制,只挡 web/app 的手动下单,API 不受影响,直到你主动重置冷静期为止。

症状长什么样子:HTTP 200 但单没进去

这个错误最容易把人绕晕的地方,是它的 HTTP status code200——不是 4xx、也不是 5xx。你的 HTTP client 会告诉你「请求成功」,但 OKX 回的 JSON body 里的 sCode(下单细项状态码)是 54094,消息是官方 changelog 原文写的一句:

text
Order rejected. The cool-off period is active for the current instId.

意思是:这根本不是一笔订单。OKX 收到你的请求、验过签名、跑过风控、然后在下单那一层被冷静期挡掉——所以整个 HTTP request 的 lifecycle 是「成功」的,但你以为的那笔单根本没送进撮合。这种情况如果你的 webhook consumer 只看 HTTP status code 就当成成功,就会出现「响应码是 200,但持仓没动」——这种错不会吵,它会安静地坏掉,一直安静地坏到你去对账才发现。

这是不是 OKX 特有的行为?
是。Binance、Bybit、Bitget 目前都没有把「冷静期/cool-off」扩到 REST API 的官方公告——它们的冷静期(如果有)通常只是 UI 上不给你按下单按钮。OKX 是我们查证过的交易所里,第一个把这件事拉进 API server-side 拒单逻辑的。要看跨交易所的 webhook 支持情况,可以看 哪些交易所真的支持 TradingView Webhook 信号?

为什么会这样:机制在 API 层,不在你的代码里

OKX 在 2026-07-03 贴出公告2026-07-07 生效2026-07-16 起在特定地区逐步启用,把原本只在 web/app 上生效的冷静期扩到「REST API, WebSocket, third-party authorization (including Broker OAuth, Agent Trade Kit, etc.), trading bots」这几个通道(原文出自公告第二段)。这意味着:只要你在 OKX 账号上主动开了冷静期,这段时间内从任何通道送进来的开仓/加仓单都会被 server-side 拒掉。

官方公告讲到哪里为止?公告白纸黑字写的是「any orders to open or increase positions submitted through the above channels will be rejected. Orders to reduce or close positions are not affected.」——open/increase 拒、reduce/close 放行。策略单与跟单另有一句「Strategy orders and copy trading orders will be rejected regardless of whether they are for opening or closing positions.」——不管开平一律拒。这两句是本篇所有推导的基础,其他都是我们把它跟 webhook payload 对到字段得出的结论,不是官方原文另外写的一句。

错误码 54094 本身是 2026-07-07 API changelog 新加进去的,changelog 的 Cool-off period order rejection 段落原文写着「While a user's cool-off period is active, non reduce-only orders on SWAP and FUTURES instruments covered by the cool-off are rejected server-side.」——所以受影响的品种也框好了:SWAP(永续)与 FUTURES(交割合约)。现货与期权在原文里没被列进去。

哪些单会被拒、哪些不会

这张表是把公告与 changelog 两份原文交叉出来的结果——第一栏是下单通道,后面三栏是三种常见场景。你可以拿它对照自己的部署,看每一条路径会不会被 54094 挡。

下单通道/类型开仓/加仓reduce-only 平仓策略单(含止盈止损挂单)
Web/App 手动被拒(原本就是这样)放行被拒
REST API(TradingView webhook → 你的 server → OKX)被拒回 54094放行被拒
WebSocket 下单被拒回 54094放行被拒
Broker OAuth/Agent Trade Kit(第三方授权)被拒回 54094放行被拒
OKX 内建 Trading Bot被拒回 54094放行被拒
Copy Trading(跟单)被拒(不论开平)被拒(不论开平)被拒(不论开平)

OKX 冷静期升级后受影响范围。来源:OKX Help Center《Notice on Upgrade to the Futures Cool-off Period》(2026-07-03 发布)+ OKX API v5 changelog 2026-07-07《Cool-off period order rejection》段落。品种:SWAP 与 FUTURES,spot 与 options 不在原文范围内。查证日期 2026 年 7 月。

策略单为什么比一般单严?
一般 REST 单只挡开/加仓、放行 reduce-only,这里有明确的例外逻辑可以走。但策略单(含条件单、止盈止损、trailing stop 这类要放在交易所端等触发的挂单)是「不管开平一律拒」——原文用了 「regardless of whether they are for opening or closing positions」。实务意义是:你如果依赖 OKX 端的止盈止损挂单,冷静期一开,你不只是「开不了新仓」,连「用 OKX 端保护单去平旧仓」这条路也会断。所以冷静期期间,你的止损只能靠客户端侦测价格 + 主动送 reduce-only market 单这条备援路径。

TVSBot/TradingView webhook 的 payload 对到哪个字段

TVSBot 的 webhook payload schema 里有一个字段叫 reduce_only,类型 bool、默认 false。这个字段就是决定 OKX 端会不会把这笔单当「reduce-only 平仓」放行的关键——是不是布尔 true,效果差非常多:

payload 写法OKX 冷静期期间会发生什么事
action=buy/sell、没指定 reduce_only{ "action": "buy", "symbol": "BTC-USDT-SWAP" }被拒回 54094——因为 reduce_only 默认是 false
action=close(TVSBot 会自动把它翻成 reduce_only){ "action": "close", "symbol": "BTC-USDT-SWAP" }放行——TVSBot 的下单 service 对 action=close 一律强制带 reduce_only=true
action=buy/sell、payload 明确带 reduce_only=true{ "action": "sell", "reduce_only": true }放行——直接写死是 reduce-only 的平仓单
action=buy/sell、payload 带 reduce_only=false{ "action": "buy", "reduce_only": false }被拒回 54094——显式的开/加仓单

对 Pine Script 策略作者的意义是:你如果在 strategy.entry() 触发的 alert 里送 webhook,它天然是开/加仓,冷静期会挡。strategy.close()strategy.exit() 触发的 alert 如果你在 payload 模板里有把 action 设成 "close"(或直接写 reduce_only: true),那条路就会通。这篇讲 qty_type 的陷阱里有 payload 完整字段对照,一起看比较快。

检查你自己的 payload 模板
现在打开 TradingView 上一个你在用的 alert,看 Message 那格的 JSON。如果里面没有 reduce_only 这个 key,代表你送过去是 false(TVSBot 端的默认值)——冷静期期间所有这种 alert 都会被 OKX 拒。这件事没有任何错误消息会提前告诉你,要么你自己现在补起来,要么下次冷静期一开你才会用对账单的形式知道。

三种修法,选一个

收到 54094 之后你只有三种选择:撤掉冷静期、等它自然到期、或者把整个下单流程改成「用 reduce-only 平仓为主」的模式。没有第四种选项——这是 OKX server-side 拒单,客户端做什么都没用。

修法适合的场景限制
撤掉冷静期你其实不需要冷静期,是之前为了测试或误触开的如果你是 2026-07-07 升级后才设的新版冷静期,可以主动关掉;如果是升级前设的旧版冷静期,官方公告明讲 current cool-off period cannot be terminated early(现行的冷静期无法提前中止)——要等
等它自然到期冷静期本来就是你为了保护自己开的期间内开/加仓一律回 54094,除非改走 reduce-only
改成「客户端持仓状态机」+ reduce-only 平仓策略跑久了、无法每次踩到 54094 都手动处理写代码的成本;并且不能再靠 OKX 端的策略挂单(止盈止损)做保护,要自己在 client 端追行情并送 reduce-only market 单去平——类似 备援设计那篇讲的模式

收到 54094 之后的三种修法选择。实务上大多数 TVSBot 用户会走第三条——把 payload 改成明确带 action=close 或 reduce_only=true 的方向,让平仓路径不受影响,开仓那边只能等或关掉冷静期。查证日期 2026 年 7 月。

既有用户会不会被影响?

不会,但有条件。官方公告的第三段写着「Users who configured the cool-off period before this upgrade will remain on the existing service, which only restricts orders placed via the web and app. These users will not be subject to the expanded restrictions introduced in this upgrade.」——2026-07-07 升级前就设过冷静期的用户,会沿用旧制(只挡 web/app)直到本轮冷静期结束。

但接下来会有一个切换点:如果你想要新的完整保护,官方建议「we recommend re-enabling the cool-off period after your current one expires」——旧冷静期到期后再重新开一次,就会套用新规则。所以「我以前设过冷静期、我 API 一直正常」这件事,会在你下一次重置冷静期那一刻自动转成新制。如果你想维持 API 不被冷静期影响,就不要重置。

这个「旧制沿用」的保证会持续多久?
官方原文没有写终止日。这是官方目前的过渡承诺,不是永久保证——类似的过渡条款过去在其他交易所常常在半年到一年内悄悄消失,实际动手前建议自己再去 OKX 公告页确认一次是不是还这样写。这一段判断是我们的推论,不是 OKX 白纸黑字写出来的一句话。

收到 54094 时的排查顺序

这张清单是给你收到 54094 时照顺序跑一遍用的——不用背,卡在哪一步就停在那里处理。前三条先确认是不是这件事,后三条决定要怎么修。

  • 看 HTTP body,不是只看 status code。 OKX 对这个错回 HTTP 200 + sCode: "54094",只信 HTTP status 的 consumer 一定会漏掉。你的 webhook consumer 一定要 parse JSON body 拿 sCode
  • 确认你的 OKX 账号目前有冷静期在跑。 进 OKX web 端 Account > Trading > Cool-off Period,看 status 是不是 Active、剩余时间多少。如果是 Inactive,那 54094 不是这个原因,去查子账号设置或 Broker OAuth 的授权范围。
  • 确认品种是 SWAP 或 FUTURES。 Changelog 只把这两类写进覆盖范围。如果你的 instIdBTC-USDT(spot)或 options,看到 54094 可能是别的原因,不是这里讨论的机制——回头去 OKX 官方 API 文档的 sCode 表查一次那个代号目前的最新定义。
  • 看你这笔单是不是 reduce-only。 Payload 里的 reduce_only 有没有带、值是不是 true。TVSBot 用户把 action 改成 "close" 也算——下单 service 会自动翻成 reduce_only=true
  • 看是不是策略单/跟单。 走 OKX 内建策略下单、或跟单交易的 sub-account,冷静期期间开平都会被拒。这种情况要么切换去自己的 REST 下单、要么等冷静期过。
  • 决定要撤冷静期还是改流程。 如果是旧版冷静期,官方明讲不能提前中止,只能等;新版可以主动关。长期解法是把策略逻辑拆成「开仓可能被冷静期挡、平仓一律 reduce-only」,之后再遇到就不会全流程停摆。

诚实的一段:我们也挡不掉这件事

任何跑在 OKX 上的自动化交易系统——包括我们自己的 TVSBot——遇到冷静期都只能照规则走。这是 OKX server-side 执行的规则,不在客户端;没有任何 SaaS、broker、bot 服务能替你绕过去。举例来说,TVSBot 的做法是在下单前不做冷静期的预先检查(OKX 也没开这种查询 API),拒单回来后把 54094 的原始消息保留在该次下单记录里,让你在 dashboard 上直接看到「这笔为什么没进去」——但这只解决了「你比较快知道」的问题,没有解决「这笔单真的没下去」的事实。冷静期就是为了让你冷静,任何「帮你自动绕过冷静期」的服务都跟这个功能设计初衷相反,我们不做,你也不该用做这件事的第三方服务。

常见问题

我没有主动开过冷静期,为什么还会收到 54094?
OKX 官方原文只写「冷静期 active 时触发拒单」,没有写「用户从未设置过冷静期时会不会误触」。如果你确定自己从没进 Cool-off Period 那一页按过,先进去确认 status——有可能是子账号授权时被主账号代设、或是 Broker OAuth/Agent Trade Kit 授权时附带开的。这件事查证日期 2026 年 7 月,官方文档目前没有列出「代设冷静期」的完整路径,实务上遇到就是自己去 dashboard 一格一格看。
现货(spot)会不会被 54094 挡?
不会。API changelog 的原文明确写 「non reduce-only orders on SWAP and FUTURES instruments covered by the cool-off are rejected server-side」——只包 SWAP(永续)与 FUTURES(交割)。现货与 options 不在这句话的范围里。但这是「目前查证日期为止」的状态,OKX 之后如果把冷静期扩到更多品种也不会意外——冷静期本身是保护功能,扩大是自然方向。
TVSBot 的 dry-run 模式会踩到 54094 吗?
不会,因为 dry-run 本来就不打真实下单 API——它只在本机模拟 payload 解析、风控、qty 计算,不会走到 OKX server。你要验证冷静期期间的行为,唯一的方法是真的送一笔非 reduce-only 的 open 单去测试环境(demo trading)或用小额真实下单。OKX demo 环境的冷静期是否跟真实环境行为一致,我们没实测过,这篇不会做判断。
OKX 端的止盈止损挂单(TP/SL algo order)冷静期时能不能新增?
不能。这类挂单属于官方公告分类的「Strategy Order」,原文写的是「regardless of whether they are for opening or closing positions」——不管你要新增的是保护开仓的止损、还是保护平仓的策略单,冷静期期间都会被拒。你在冷静期开始前设好的止盈止损不受影响,OKX 只挡「新增/修改」,不挡既有的触发。所以进冷静期前先把该挂的保护单挂好。
既然旧用户会沿用旧制,我要不要现在就赶快去设一个冷静期把自己「锁」在旧制?
不建议。这么做等于用「开一段冷静期」的成本去换「未来沿用旧制」的期望——但这个期望是官方过渡承诺,没有终止日、也没有承诺永久(见上面「这个旧制沿用的保证会持续多久?」那段的推论)。而且冷静期期间你自己的手动下单也会被挡。比较实际的做法是把 payload 改成明确标示 reduce_only 的平仓路径——不管新旧制、不管将来 OKX 怎么改,你的平仓单都会通。
Binance/Bybit/Bitget 会跟进吗?
没有官方公告。这件事没有任何预告,通常这种 API 层的行为改动会在 changelog 悄悄出现、生效日往前推一到两周——查证日期 2026 年 7 月,Binance/Bybit/Bitget 三家的 API changelog 都没有类似机制的预告或 hint。不代表官方承诺永远都会这样,只是目前观察到的现状。要跟进的话,订阅它们各自的 API changelog RSS 是最省事的做法。

Get started

想把今天学到的东西自动化跑起来?

把 TradingView 信号接到 OKX 自动下单——TVSBot 非托管、用你自己的 API key、payload 支持 reduce_only 精细控制、下单前 dry-run、每笔错误原文都保留在记录里,收到 54094 你能直接看到是冷静期还是别的原因。

免费开始使用