关于 okx-dex-strategy
okx-dex-strategy 是用于管理 OKX 聚合价格触发限价单的 Agent 技能,涵盖创建、取消、查看和恢复订单,并通过 Onchain OS CLI 引导确认与处理。
主要功能
- 01创建价格触发限价单
- 02取消待处理订单
- 03查看并恢复订单
- 04根据价格和方向推导订单类型
- 05支持指定的六条链
适用场景
- 01设置代币到达目标价时买入
- 02设置止盈或止损订单
- 03查看或取消现有限价单
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ okx/ onchainos-skills --skill okx-dex-strategy安装后在 Claude Code 中输入/okx-dex-strategy确认已加载。
附带文件_shared/preflight.mdreferences/backend-schema.md
详细介绍
链上 OS DEX 策略
4 个子命令,用于封装 Agentic Wallet 的限价单功能:create-limit、cancel、list、resume。当 BE 返回 UPGRADE_REQUIRED 时,CLI 会透明地激活 SA(升级或重新升级到 Trader Mode);此技能无需向用户透露这一细节。
执行前检查
阅读
../okx-agentic-wallet/_shared/preflight.md。如果该文件不存在,则改为读取_shared/preflight.md。策略端点需要经过身份验证的 Agentic Wallet 会话——运行任何子命令前,请确认已登录。
显示标签和输出语言(唯一事实来源)
本节是面向用户的字符串的规范规则。此技能的其他所有章节均遵循本节规定。
规范显示标签——Agent 唯一可以向用户展示的字符串。CLI 会直接返回这些标签(statusLabel)作为 status 的显示值;对于 strategyType,Agent 会从下方的 §strategyType 和 §status 表格中查找对应标签。
| 字段 | 规范英文显示标签 |
|---|---|
strategyType(4 个值) | Buy Dip / Take Profit / Stop Loss / Buy Above |
status(9 个值) | Expired / Cancelling / Cancelled / Failed / Trading / Completed / Creating / Active / Suspended |
翻译规则——根据用户的对话语言选择对应译文。以上显示标签以英文为规范形式。当用户使用其他语言对话时,Agent 应在输出时翻译标签,使其符合对话语言。
禁止(以下规则适用于此技能的所有位置):
- 在同一个标签中混用两种语言(只能选一种——绝不能同时显示英文标签和译文),
- 向用户展示底层的枚举名称(
BUY_DIP、CHASE_HIGH、COMPLETED……), - 向用户展示底层的 CLI 标志值(
buy_dip、chase_high、completed、cancelled……), - 当用户使用非英语对话时,原样传递 CLI 返回的
statusLabel——应翻译该标签。
注意:
CHASE_HIGH的英文显示标签为Buy Above(而非 “Chase High”)。SPEEDING_UP(-4)不是有效的筛选值或显示值。
与 okx-dex-swap 的边界
| 用户意图 | 技能 |
|---|---|
| “立即将 X 兑换为 Y” / “用 USDC 买入 0.5 ETH” | okx-dex-swap(市价单,立即执行) |
| “如果 ETH 跌到 $2000,就买入” / “ETH 涨到 $5000 时卖出” / “在 X 止盈” / “在 Y 止损” | 此技能(价格触发的限价单) |
| “取消我的待处理订单” | 此技能 |
| “我有哪些限价单?” | 此技能 |
如果明确指定了交易平台(Uniswap、PancakeSwap、Raydium、Curve……),则重新路由到 okx-dapp-discovery。此技能仅适用于 OKX 聚合的限价单。
命令索引
1. onchainos strategy create-limit
下达单个价格触发限价单。
onchainos strategy create-limit \
--chain-id <id|alias> \
--from-token <address> \
--to-token <address> \
--amount <decimal-string> \
--direction <buy|sell> \
--trigger-price <usd> \
[--current-price <usd>] \
[--slippage <value>] \
[--mev-protection <on|off|default>] \
[--expires-in <secs>]
| 标志 | 必填 | 说明 |
|---|---|---|
--chain-id | Y | 链 ID 或别名:1、solana、bsc、arbitrum、base、xlayer |
--from-token | Y | 卖出代币的合约地址 |
--to-token | Y | 买入代币的合约地址 |
--amount | Y | 要卖出的 from_token 数量(字符串,不会损失精度) |
--direction | Y | buy 或 sell(不区分大小写)。策略类型根据 --direction、--trigger-price 和当前市场价格推导;Agent 不会显式传入策略类型。 |
--trigger-price | Y | USD 触发价格。推导策略类型时必填。 |
--current-price | N | 比较代币的当前 USD 价格(buy 时为 to-token,sell 时为 from-token)。省略时,CLI 会通过 market price 获取价格。如果 Agent 已为确认页面获取价格,可传入此参数以跳过额外的 HTTP 往返请求。 |
--slippage | N | 以百分比表示的滑点。默认值为 15。以普通数字传入百分比(slippage 20% → --slippage 20)。注意,0.05 = 0.05%,而非 5%——如需 5%,请传入 --slippage 5。 |
--mev-protection | N | 三态选项 on / off / default(默认值 = default;default = 由 BE 选择)。 |
--expires-in | N | 订单有效期,单位为秒。默认值为 604800(7 天)——参见 §默认订单有效期。 |
输出(始终为 JSON,CLI 没有人类可读格式):
{
"ok": true,
"data": {
"orderId": "<id>",
"status": <int>,
"statusLabel": "<label>",
"estimatedWaitTime": <int|null>,
"eventCursor": "<string|null>"
}
}
Solana 订单返回 estimatedWaitTime=0——订单可立即查询;对于所有其他链,Agent 按照 §异步等待模式操作(固定等待 3 秒后重新查询)。
默认订单有效期
BE 默认值 = 7 天(604800 秒)。本文中所有其他提及的“7 天”均以此为准。
支持的链
策略订单仅支持以下 6 条链。Agent 必须在开始前拒绝任何其他链——不要调用 create-limit,也不要打开步骤 1 确认界面。
| chainIndex | 名称 | --chain-id 别名 |
|---|---|---|
| 1 | Ethereum | ethereum、eth、1 |
| 56 | BSC | bsc、56 |
| 196 | X Layer | xlayer、196 |
| 501 | Solana | solana、sol、501 |
| 8453 | Base | base、8453 |
| 42161 | Arbitrum | arbitrum、arb、42161 |
预检规则(Agent):用户提及某条链时,将其解析为对应的 chainIndex 并检查此列表。如果链不在表格中(例如 Polygon 137、Optimism 10、Avalanche 43114、Linea 59144、Sui 784、Tron 195 等),请直接回复:
当前策略订单仅支持 Ethereum / BSC / X Layer / Solana / Base / Arbitrum。
<requested chain>不受支持——请选择其中一条链以继续。
不要继续步骤 1 确认。不要调用 CLI。CLI 也会防止此类情况(在调用 BE 前使用相同的 6 条链白名单进行验证),但 Agent 提前拦截能省去一次往返请求,并根据用户的原话给出更清晰的提示。
strategyType 枚举 + 推导
strategyType 完全由 CLI 根据(--direction、--trigger-price、当前市场价格)推导——没有 --type 标志,Agent 也不会传入或计算该整数。下表涵盖两种用途:为步骤 1 确认页面推导显示标签,以及将 list 响应中的 strategyType 整数映射回显示标签。显示标签是唯一面向用户的字符串(参见 §显示标签与输出语言)。
| strategyType (int) | 枚举名称 | 方向 | 触发价与当前价的比较 | 显示标签 | 含义 |
|---|---|---|---|---|---|
| 2 | BUY_DIP | buy | trigger < current | 逢低买入 | 价格跌至触发价时买入 |
| 5 | CHASE_HIGH | buy | trigger ≥ current | 高于指定价格买入 | 价格涨至触发价以上时买入 |
| 3 | TAKE_PROFIT | sell | trigger > current | 止盈 | 价格涨至触发价时卖出 |
| 4 | STOP_LOSS | sell | trigger ≤ current | 止损 | 价格跌至触发价时卖出 |
相等时归入激进的一侧(CHASE_HIGH / STOP_LOSS),与 CLI 保持一致。
Agent 流程:
- 解析方向(buy / sell),根据用户意图判断(“buy” / “ape in” / “snap up” → buy;“sell” / “take profit” / “stop loss” / “exit” → sell)。原样传入
--direction <buy|sell>。 - 获取当前价格——调用
onchainos market price --chain <chain> --address <token>,读取data[0].price。对于 BUY 方向,查询目标代币的当前价格;对于 SELL 方向,查询来源代币的当前价格。Agent 需要该价格用于:(a) 步骤 0 的美元价值预检;(b) 步骤 1 确认页面中的“触发价与当前价”信息;以及 (c) 根据上表计算显示标签。 - 将
--current-price <usd>传给 CLI,以避免重新获取。(如果 Agent 省略该参数,CLI 会自行获取相同的值——结果正确,但会多一次往返。)
两步确认流程(Agent 必须遵循)
create-limit 是写入操作。**Agent 必须先向用户展示确认摘要,只有在用户明确确认后才能调用 CLI。**CLI 本身不做拦截(它会直接调用 BE);此约定由 skill 层强制执行。
步骤 0——最低订单金额预检(必须在步骤 1 之前执行):
BE 强制要求最低订单金额为 $1 USD(否则返回错误 100010 ORDER_AMOUNT_TOO_SMALL)。为避免因 BE 会拒绝的金额而浪费一次往返调用和一次确认页面,Agent 必须先验证来源侧的美元价值。
- 获取来源代币价格(USD):
- 如果来源代币是常见稳定币(USDT / USDC / USDG / USDe / DAI / FDUSD / ...):假设
from_price ≈ 1.0,无需进行 HTTP 调用。 - 否则:调用
onchainos market price --chain <chain> --address <from_token>,读取data[0].price作为from_price。
- 如果来源代币是常见稳定币(USDT / USDC / USDG / USDe / DAI / FDUSD / ...):假设
- 计算美元价值:
usd_value = from_amount × from_price。 - 如果
usd_value < 1.0:-
计算
min_from_amount = ceil(1.0 ÷ from_price),并按代币的合理显示精度向上取整(例如,from_price ≥ 0.1时取整到整数;否则保留 2–4 位有效数字)。 -
只向用户显示这一条规范文本,不添加任何额外说明——不展示美元价值计算、不提及 $1 门槛、不复述用户原始金额、不添加后续句子,也不道歉:
Minimum order amount: <min_from_amount> <from_symbol>显示时根据 §显示标签与输出语言翻译前缀(例如,面向中文用户时,Agent 用中文呈现同一信息)。结构保持为单行:
<本地化前缀> <min_from_amount> <from_symbol>。 -
**停止。不要显示步骤 1。不要调用 CLI。**等待用户提供更大的
--amount,然后从头重新执行步骤 0。
-
- **如果
usd_value ≥ 1.0:**保留from_price供后续使用(步骤 1 的“价值”列会复用该值,无需重新获取),然后继续步骤 1。 示例(用户想在某条 OKB ≈ $0.10 的链上花费 1 OKB):
from_price = 0.10,usd_value = 1 × 0.10 = 0.10 < 1.0→ 失败min_from_amount = ceil(1.0 / 0.10) = 10- 输出:
Minimum order amount: 10 OKB - 停止。不要执行 Step 1,也不要添加额外说明。
Step 1 — 向用户展示订单摘要以供确认。 包含五个顶层类别及其子项;Agent 可在运行时自由组织说明文字,但不得遗漏任何类别:
| # | 类别 | 子项 | 来源 |
|---|---|---|---|
| 1 | 链 | — | 根据 --chain-id 解析出的易读链名称(Arbitrum / BSC / Solana / ...) |
| 2 | 订单类型 | 根据 §strategyType 表中的显示标签(Buy Dip / Take Profit / Stop Loss / Buy Above)— 按 §显示标签与输出语言的规定进行翻译 | 根据上述“策略类型推导”确定 |
| 3 | From 代币 | 符号(例如 USDC);数量(例如 10) | 符号来自代币元数据;数量为原始 --amount 值 |
| 4 | To 代币 | 符号(例如 ARB);触发价格(例如 $0.10,以 USD 计价);预估数量(预测的 To 代币数量);价值(预估 USD 价值) | 符号/触发价格直接获取;预估数量和价值由 Agent 计算 — 见下方公式 |
| 5 | 滑点 | Default 15%(用户未提及滑点)或 User-specified X%(用户明确表示“slippage X%”) | 见下方滑点显示规则 |
预估数量/价值公式:
- 买入方向(BUY_DIP / CHASE_HIGH):
Estimated Amount=from_amount÷trigger_price(以 To 代币为单位)Value=from_amount×from_token_USD_price(如果 From 是稳定币,则 ≈from_amount)
- 卖出方向(TAKE_PROFIT / STOP_LOSS):
Estimated Amount=from_amount×trigger_price(以 To 代币为单位,通常是稳定币)Value=from_amount×trigger_price(如果 To 是稳定币,则等于 Estimated Amount)
滑点显示规则:
- 用户在对话中未提及滑点 → 显示
Slippage: Default 15%,并在 CLI 调用中省略--slippage(CLI 默认值为 15)。 - 用户明确表示“slippage X%”/“use X% slippage”/类似表述 → 显示
Slippage: User-specified X%,并在 CLI 调用中传入--slippage X。
结构示例(显示标签取自 §strategyType / §status 表;跨场景规则见 §显示标签与输出语言):
1. Chain: Arbitrum
2. Order Type: Buy Dip
3. From: USDC 10
4. To:
- Symbol: ARB
- Trigger Price: $0.10
- Estimated Amount: 100 ARB
- Value: $10
5. Slippage: 15% (default)
If the trigger condition is not met within 7 days, this order auto-expires.
Reply confirm / change / cancel.
到期说明(必需):在展示五个类别之后、询问用户是否确认之前,Agent 必须说明:如果触发条件始终未满足,限价订单将在创建 7 天后自动过期。默认表述:If the trigger condition is not met within 7 days, this order auto-expires.
Step 2 — 处理用户回复:
- 用户回复“confirm”/“yes”/“submit” → 调用
onchainos strategy create-limit ...。 - 用户回复“change amount = 5”/“set trigger to 0.08”/类似表述 → 更新相应字段,并重新呈现 Step 1,再次请求确认。
- 用户回复“cancel”/“abort” → 不要调用 CLI;确认订单已取消。
硬性约束:
- 在用户明确确认之前,绝不调用
strategy create-limit。Estimated Amount/Value是 Agent 根据trigger_price得出的估算值,不是 BE 报价。实际成交数量由 BE 执行时的滑点和聚合器路由决定;Agent 不得将这些估算值描述为“实际成交数量”。--trigger-price是 USD 价格。Agent 必须向用户明确说明这一点,避免与“汇率 = 每 1 个 To 代币对应 X 个 From 代币”混淆。- 如果 Step 0 的 USD 价值检查失败,绝不呈现 Step 1。 改为输出单行最低金额警告,然后停止 — 用户必须重新以更大的
--amount发起操作。
2. onchainos strategy cancel
取消单个、批量或所有活动订单。传入以下三个标志中的且仅一个:
onchainos strategy cancel --order-id <id>
onchainos strategy cancel --order-ids id1,id2,...
onchainos strategy cancel --all
输出(JSON): {ok:true,data:{updateNum:N,estimatedWaitTime:null|n}}。updateNum 是 BE 接受的数量,并非达到终态的数量——等待后使用 list 重新查询。
3. onchainos strategy list
onchainos strategy list \
[--order-id <id>] \
[--status active,suspended,...] \
[--chain-id 1,501] \
[--token <address>] \
[--limit <int>] \
[--cursor <string>] \
[--strategy-mode 7]
两种模式:
- 单个订单:传入
--order-id <id>→ GETopenOrderDetail(返回完整订单结构)。 - 分页查询:省略
--order-id→ POSTgetOpenOrder。自动提供活动钱包的地址;传入--limit(最大值为 100,默认值为 100),并使用上一条响应中的nextCursor作为--cursor进行分页。
标志的 CSV 支持——--status 和 --chain-id 接受逗号分隔的列表;--token 仅接受单个地址。对于多代币查询,请针对每种代币调用一次 list 并合并结果。
完整的
getOpenOrder请求体架构(自动注入的字段、标志映射):参见 references/backend-schema.md。
status 枚举
完整的 10 种状态映射——Agent 读取 data.list[].status 整数值,并在此查找对应的显示标签:
| 整数值 | 枚举名称 | CLI --status 值 | 显示标签 | 终态? |
|---|---|---|---|---|
| -7 | EXPIRED | expired | Expired | 是 |
| -3 | CANCELLING | cancelling | Cancelling | 否(过渡状态) |
| -2 | CANCELLED | cancelled | Cancelled | 是 |
| -1 | FAILED | failed | Failed | 是 |
| 0 | TRADING | processing 或 trading | Trading | 否 |
| 1 | COMPLETED | completed | Completed | 是 |
| 2 | CREATING | creating | Creating | 否 |
| 3 | ACTIVE | active | Active | 否 |
| 4 | SUSPENDED | suspended | Suspended | 否 |
SPEEDING_UP (-4) 不是有效的筛选选项。CLI 的
statusLabel已返回显示标签(唯一面向用户的字符串);请按 §显示标签与输出语言进行翻译。
非终态集合(5 种):{-3, 0, 2, 3, 4} = CANCELLING / TRADING / CREATING / ACTIVE / SUSPENDED
终态集合(4 种):{-7, -2, -1, 1} = EXPIRED / CANCELLED / FAILED / COMPLETED
默认状态筛选器(省略 --status 时):CLI 会发送 5 种非终态状态 [-3, 0, 2, 3, 4](CANCELLING / TRADING / CREATING / ACTIVE / SUSPENDED);默认排除终态订单(Cancelled / Completed / Failed / Expired)——“显示我的订单”几乎总是指仍在进行的订单。
要查看终态订单,Agent 必须显式传入 --status:
| 用户意图 | 要传入的 --status 值 |
|---|---|
| “显示我已完成的订单” | completed(orderStatusList=[1]) |
| “显示我已取消的订单” | cancelled(orderStatusList=[-2]) |
| “显示失败的订单” | failed(orderStatusList=[-1]) |
| “显示过期的订单” | expired(orderStatusList=[-7]) |
| “显示所有订单,包括终态订单” | active,suspended,creating,trading,cancelling,completed,cancelled,failed,expired(完整的 9 种状态) |
| “显示我正在进行的订单”/未指定状态 | (省略 --status——使用默认的非终态筛选) |
--status 接受逗号分隔的值;每个条目可以是整数(例如 4)或字符串标签(active、suspended、processing、creating、cancelling、cancelled、completed、failed、expired)。
Agent 的渲染规则(用户未指定具体状态而询问订单时)
符合此规则的用户提示包括:“显示我的策略订单”/“列出订单”/“显示我的限价订单”/“我有哪些订单”——即任何未指定状态的概括性“显示我的订单”意图。
Agent 必须遵循以下步骤:
-
运行
onchainos strategy list --limit 10(不传入--status)——CLI 会将orderStatusList=[-3, 0, 2, 3, 4](非终态集合)放入请求体;BE 在服务端应用筛选,只返回匹配的订单。对于一般的“显示我的订单”查询,始终传入--limit 10;完整分页仅在用户后续提出“下一页”时启用。 -
将响应中的
data.list渲染为 Markdown 表格,且必须恰好包含以下 8 列(固定):订单 ID 订单状态 订单类型 预估金额 目标代币地址 价值 触发价格 过期时间 每行字段映射(顺序不可变,不得添加列):
列 来源 说明 订单 ID data.list[i].orderId— 订单状态 data.list[i].statusLabel(根据 §status表显示标签)根据 §显示标签和输出语言进行翻译 订单类型 根据 data.list[i].strategyType整数值,从 §strategyType表中获取显示标签(2 → Buy Dip/3 → Take Profit/4 → Stop Loss/5 → Buy Above)根据 §显示标签和输出语言进行翻译 预估金额 data.list[i].toToken.tokenAmount++data.list[i].toToken.tokenSymbol例如: 0.2 SOL目标代币地址 data.list[i].toToken.tokenContractAddress,截取前 6 位和后 4 位EVM: 0x1234...cdef(0x+ 4 个字符 +...+ 4 个字符);Solana base58:前 6 位 +...+ 后 4 位价值 data.list[i].toToken.tokenUsd,格式为<n> USD例如: 16 USD(四舍五入或保留 2 位小数,遵循 BE 精度)触发价格 data.list[i].triggerInfo.triggerPrice,前缀为$例如: $80;如果为空(触发率路径,目前未使用),则显示data.list[i].triggerInfo.triggerRate过期时间 data.list[i].expireTime(13 位 UTC 毫秒时间戳),转换为用户当前时区,格式为MM/DD/YYYY HH:MM:SS例如: 05/15/2026 17:50:49(语义上默认等于 createTime + 7 天)示例行(Solana SOL→USDC take_profit):
| 17262791359882688 | Active | Take Profit | 0.2 SOL | 9xQeWv...vEjz | 16 USD | $80 | 05/15/2026 17:50:49 |地址缩短规则:
- EVM(
0x前缀):前 6 个字符(0x+ 4 个字符)+...+ 后 4 个字符 - Solana/其他无前缀的 base58:前 6 位 +
...+ 后 4 位 - 少于 10 个字符的字符串:不截断,原样显示
过期时间时区转换:
- BE 中的
expireTime是 UTC 毫秒时间戳 - Agent 必须在渲染时将其转换为用户当前本地时区(例如 JS
Intl.DateTimeFormat、Rustchrono::Local或等效方式) - 固定格式:
MM/DD/YYYY HH:MM:SS,24 小时制
- EVM(
-
表格后追加一条合并提醒,涵盖分页和状态筛选。仅当
nextCursor非空时,才包含分页行。标准英文文本;Agent 根据 §显示标签和输出语言进行翻译:
默认显示进行中的订单(每页 10 条)。
- 回复“下一页”以加载更多。
- 如需按特定状态筛选,请使用其显示标签请求订单,例如:
Completed、Cancelled、Failed、Expired。示例:“显示我已完成的订单” → 我会使用该筛选条件重新查询。
如果
nextCursor为空(没有更多页面),则删除“下一页”项目,只保留状态筛选项目。 -
如果用户回复“下一页”或类似内容,则使用上一次响应中的
nextCursor,通过--limit 10 --cursor <nextCursor>重新运行。使用相同的表格格式渲染结果。 -
如果用户指定了某个状态(9 个显示标签中的任意一个),则使用
list --limit 10 --status <label>重新运行(单个值),并使用相同的表格格式渲染结果。从提醒中删除状态筛选项目;若nextCursor非空,则保留分页项目。
4. onchainos strategy resume
onchainos strategy resume # auto-discover all SUSPENDED + canResume=true on active wallet
onchainos strategy resume --order-ids id1,id2 # explicit
省略 ID 时,CLI 会运行 list,筛选 status=4,并仅保留 canResume 标志为 true 的订单;随后将找到的 ID 提交给 reactivate。恢复后,Agent 应提醒用户:已满足触发条件的订单可能会立即执行——请使用 list 重新查询以确认。
错误代码 → Agent 操作
CLI 会以易读的形式显示 BE 错误代码。根据每个代码采取建议的下一步操作:
| 代码 | 名称 | Agent 应采取的操作 |
|---|---|---|
| 100 | REQUEST_PARAM_ERROR | 显示 BE 消息;让用户修正有问题的标志 |
| 10019 | INSUFFICIENT_NATIVE_GAS_BALANCE | 钱包的原生代币余额低于 BE 要求的最低值(响应中的 msg 包含 minAmount = <N>,例如 BSC 上的 0.001 BNB)。告知用户原生 Gas 余额不足以支付该链的 Gas 费,并提示用户充值——可从交易所充值、从其他账户转入,或通过 onchainos swap execute 将稳定币兑换为原生代币。不要自动重试。 |
| 10026 | JWT_TOKEN_VERIFY_FAILED | 建议运行 onchainos wallet login,然后重试 |
| 10106 | CHAIN_NOT_SUPPORT_ERROR | 告知用户该链不受支持;建议改用受支持的链 |
| 60002 | NO_ORDER_FOUND | 取消/恢复操作的目标 ID 不正确或已处于终态——建议运行 list |
| 60003 | LIMIT_ORDER_NO_AUTHORITY | Trader Mode 可能尚未激活;下一次 CLI 调用会自动触发 SD-A——重试一次 |
| 60006 | LIMIT_ORDER_OUT_LIMIT_FAIL | 待处理订单数已达到每个账户的上限(最多 100 个);让用户取消一些待处理订单(使用 cancel --all 或 cancel --order-id),然后重试 |
| 60009 | LIMIT_ORDER_ILLIQUIDITY_ERROR | 触发时该交易对没有流动性;建议更换交易对或放宽触发条件 |
| 60014 | LIMIT_ORDER_EXPIRED_CANNOT_OPERATE | 订单已过期 |
| 60015 | LIMIT_ORDER_PENDING_CANNOT_OPERATE | 订单仍处于生命周期中;等待其进入终态 |
| 60017 | LIMIT_ORDER_SUCCESS_CANNOT_OPERATE | 订单已完成 |
| 60018 | LIMIT_ORDER_TEE_SA_VERSION_UPGRADE_REQUIRED | 透明处理——CLI 会通过 SD-A 自动重试;正常流程中 Agent 不应看到此代码。如果此代码泄露,只需重试相同的命令 |
| 60030 | QUOTA_EXCEEDED | 已达到账户级配额上限 |
| 100005 | WALLET_ADDRESS_BLACKLISTED | 钱包地址被风险控制标记;让用户联系支持人员——不要重试 |
| 100007 | TEE_SIGN_FAILURE | 暂时性的 TEE 问题——重试一次 |
| 100010 | ORDER_AMOUNT_TOO_SMALL | 订单金额低于 BE 强制要求的 1 美元最低值。让用户增大 --amount,使订单金额超过 1 美元,然后重试 |
| 100008 | TEE_SERVICE_UNAVAILABLE | TEE 服务暂时不可用;让用户稍后重试 |
| 100012 | LIMIT_ORDER_INSUFFICIENT_BALANCE | 余额不足;建议通过 onchainos wallet balance 检查余额 |
按整数代码匹配,而非按 msg 字符串匹配。 msg 文本供人阅读,可能会发生变化。
执行事件代码(executionHistoryList[].code)
TEE 交易执行引擎在执行活动订单时会发出这些代码。请先读取最新条目;较早的条目仅作为历史上下文。对于每个已识别的代码,CLI 会在原始 code 旁注入三个字段:
| 字段 | 用途 |
|---|---|
name | 内部标签;不要向用户显示 |
message | 向用户原样显示(根据 §显示标签与输出语言进行翻译) |
terminal | true ⇒ 引擎不会重试;停止轮询并显示该信息。false ⇒ 引擎会重试;可以安全等待 |
未识别的代码会直接传递,且不包含 name/message/terminal;如果存在原始 BE msg,则显示该内容,否则显示 "event code <N>"。
阅读模式
- 最新条目优先。 显示最新的
executionHistoryList[]项;较早的条目仅作为历史背景。 - 相同代码重复出现。 如果相同代码每隔约 10 秒重复出现,且没有出现
txHash,说明引擎处于软重试循环。显示最新的message,注明重复次数(“这是第 5 次出现No quote due to low liquidity事件”),并询问用户是要等待、取消还是调整参数。 terminal=true代码。 立即停止轮询并向用户显示;引擎不会重试。- 重复 3 次或以上的
terminal=false代码。 视为需要用户采取操作:建议更改滑点、金额、交易对或链,或者取消。 - 带有
txHash的代码0。 交易成功;显示txHash和区块浏览器链接。
热门代码的操作提示
message 字段是面向用户显示的字符串。Agent 还会根据 code 选择以下操作提示之一:
| code | Agent 应执行的操作 |
|---|---|
| 0 | 报告成功;显示 txHash 和区块浏览器链接 |
| 3013 | 建议为 from-token 充值,或以较小金额重新创建 |
| 3014 | 告知用户为该链的原生手续费代币充值(SOL / ETH / BNB / ...) |
| 3015 | 建议增大 --slippage |
| 3016 | 非暂时性问题——建议更换交易对、减小金额、扩大触发范围或更换链 |
| 3017 | 引擎会重试;如果重复出现 3 次或以上,则按 3016 处理 |
| 3019 | 终止状态——目标代币已列入屏蔽名单;订单不会执行 |
| 3020 | 终止状态——钱包地址已被标记;明确告知用户 |
| 3023 | 使用更长的 --expires-in 重新创建 |
此表之外的代码:从 CLI 输出中读取 terminal。terminal=true ⇒ 显示并停止。terminal=false ⇒ 显示并再等待一个周期。
异步等待模式
create-limit、cancel 和 resume 会在请求被接受后返回,而不会等到订单达到终止状态。CLI 会显示 estimatedWaitTime(秒,由 BE 提供——通常 Solana 为 0,BSC 约为 3,ETH 类链约为 12)。
Agent 操作流程(固定):
- 运行子命令。
- 等待 3 秒。 对所有受支持的链,统一等待 3 秒即可。不要按照响应中的
estimatedWaitTime等待;BE 提供的数值较为保守,会导致不必要的等待。 - 使用
onchainos strategy list --order-id <orderId>重新查询最终状态。 - 如果首次重新查询后仍处于待处理状态,则向用户显示部分状态;不要无限循环。
不要运行长时间轮询循环。CLI 并非为此而设计;BE 会在链下处理订单最终确认,正常情况下,定向重新查询一次就足够了。
SA 激活透明化
Trader Mode 的升级或重新升级由 CLI 透明完成:
- 执行
create-limit或resume时,如果 BE 返回代码 60018(UPGRADE_REQUIRED),CLI 会透明地激活 Trader Mode,并重试原操作一次。成功后,用户会看到Trader Mode activated.,随后是常规命令输出。 - Agent 不应先要求用户“激活 Trader Mode”——CLI 会按需完成。
- 如果激活失败,原命令会中止,并显示激活错误。建议使用
onchainos wallet status检查会话。
输出格式约定
所有策略子命令始终会在 stdout 输出标准的 onchainos JSON 封装 {ok: true, data: { ... }}。没有 --format 标志——策略 CLI 面向 Agent,因此结构化 JSON 是唯一输出;Agent 会根据该 JSON 呈现用户可见的表格(例如 §list 的 8 列 Markdown 表格)。
限制
符号→地址解析不在范围内——请直接将合约地址作为 --from-token / --to-token 传入。
完整的当前限制列表:请参阅 references/backend-schema.md。