mcpField
O
okx-dex-strategy

okx-dex-strategy

github.com/okx其他3452.9k 次安装1 天前更新
代码仓库

关于 okx-dex-strategy

okx-dex-strategy 是用于管理 OKX 聚合价格触发限价单的 Agent 技能,涵盖创建、取消、查看和恢复订单,并通过 Onchain OS CLI 引导确认与处理。

主要功能

  1. 01创建价格触发限价单
  2. 02取消待处理订单
  3. 03查看并恢复订单
  4. 04根据价格和方向推导订单类型
  5. 05支持指定的六条链

适用场景

  1. 01设置代币到达目标价时买入
  2. 02设置止盈或止损订单
  3. 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-idY链 ID 或别名:1、solana、bsc、arbitrum、base、xlayer
--from-tokenY卖出代币的合约地址
--to-tokenY买入代币的合约地址
--amountY要卖出的 from_token 数量(字符串,不会损失精度)
--directionYbuy 或 sell(不区分大小写)。策略类型根据 --direction、--trigger-price 和当前市场价格推导;Agent 不会显式传入策略类型。
--trigger-priceYUSD 触发价格。推导策略类型时必填。
--current-priceN比较代币的当前 USD 价格(buy 时为 to-token,sell 时为 from-token)。省略时,CLI 会通过 market price 获取价格。如果 Agent 已为确认页面获取价格,可传入此参数以跳过额外的 HTTP 往返请求。
--slippageN以百分比表示的滑点。默认值为 15。以普通数字传入百分比(slippage 20% → --slippage 20)。注意,0.05 = 0.05%,而非 5%——如需 5%,请传入 --slippage 5。
--mev-protectionN三态选项 on / off / default(默认值 = default;default = 由 BE 选择)。
--expires-inN订单有效期,单位为秒。默认值为 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 别名
1Ethereumethereum、eth、1
56BSCbsc、56
196X Layerxlayer、196
501Solanasolana、sol、501
8453Basebase、8453
42161Arbitrumarbitrum、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)枚举名称方向触发价与当前价的比较显示标签含义
2BUY_DIPbuytrigger < current逢低买入价格跌至触发价时买入
5CHASE_HIGHbuytrigger ≥ current高于指定价格买入价格涨至触发价以上时买入
3TAKE_PROFITselltrigger > current止盈价格涨至触发价时卖出
4STOP_LOSSselltrigger ≤ current止损价格跌至触发价时卖出

相等时归入激进的一侧(CHASE_HIGH / STOP_LOSS),与 CLI 保持一致。

Agent 流程:

  1. 解析方向(buy / sell),根据用户意图判断(“buy” / “ape in” / “snap up” → buy;“sell” / “take profit” / “stop loss” / “exit” → sell)。原样传入 --direction <buy|sell>。
  2. 获取当前价格——调用 onchainos market price --chain <chain> --address <token>,读取 data[0].price。对于 BUY 方向,查询目标代币的当前价格;对于 SELL 方向,查询来源代币的当前价格。Agent 需要该价格用于:(a) 步骤 0 的美元价值预检;(b) 步骤 1 确认页面中的“触发价与当前价”信息;以及 (c) 根据上表计算显示标签。
  3. 将 --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 必须先验证来源侧的美元价值。

  1. 获取来源代币价格(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。
  2. 计算美元价值: usd_value = from_amount × from_price。
  3. 如果 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。

  4. **如果 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)— 按 §显示标签与输出语言的规定进行翻译根据上述“策略类型推导”确定
3From 代币符号(例如 USDC);数量(例如 10)符号来自代币元数据;数量为原始 --amount 值
4To 代币符号(例如 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;确认订单已取消。

硬性约束:

  1. 在用户明确确认之前,绝不调用 strategy create-limit。
  2. Estimated Amount / Value 是 Agent 根据 trigger_price 得出的估算值,不是 BE 报价。实际成交数量由 BE 执行时的滑点和聚合器路由决定;Agent 不得将这些估算值描述为“实际成交数量”。
  3. --trigger-price 是 USD 价格。Agent 必须向用户明确说明这一点,避免与“汇率 = 每 1 个 To 代币对应 X 个 From 代币”混淆。
  4. 如果 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> → GET openOrderDetail(返回完整订单结构)。
  • 分页查询:省略 --order-id → POST getOpenOrder。自动提供活动钱包的地址;传入 --limit(最大值为 100,默认值为 100),并使用上一条响应中的 nextCursor 作为 --cursor 进行分页。

标志的 CSV 支持——--status 和 --chain-id 接受逗号分隔的列表;--token 仅接受单个地址。对于多代币查询,请针对每种代币调用一次 list 并合并结果。

完整的 getOpenOrder 请求体架构(自动注入的字段、标志映射):参见 references/backend-schema.md。

status 枚举

完整的 10 种状态映射——Agent 读取 data.list[].status 整数值,并在此查找对应的显示标签:

整数值枚举名称CLI --status 值显示标签终态?
-7EXPIREDexpiredExpired是
-3CANCELLINGcancellingCancelling否(过渡状态)
-2CANCELLEDcancelledCancelled是
-1FAILEDfailedFailed是
0TRADINGprocessing 或 tradingTrading否
1COMPLETEDcompletedCompleted是
2CREATINGcreatingCreating否
3ACTIVEactiveActive否
4SUSPENDEDsuspendedSuspended否

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 必须遵循以下步骤:

  1. 运行 onchainos strategy list --limit 10(不传入 --status)——CLI 会将 orderStatusList=[-3, 0, 2, 3, 4](非终态集合)放入请求体;BE 在服务端应用筛选,只返回匹配的订单。对于一般的“显示我的订单”查询,始终传入 --limit 10;完整分页仅在用户后续提出“下一页”时启用。

  2. 将响应中的 data.list 渲染为 Markdown 表格,且必须恰好包含以下 8 列(固定):

    订单 ID订单状态订单类型预估金额目标代币地址价值触发价格过期时间

    每行字段映射(顺序不可变,不得添加列):

    列来源说明
    订单 IDdata.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、Rust chrono::Local 或等效方式)
    • 固定格式:MM/DD/YYYY HH:MM:SS,24 小时制
  3. 表格后追加一条合并提醒,涵盖分页和状态筛选。仅当 nextCursor 非空时,才包含分页行。

    标准英文文本;Agent 根据 §显示标签和输出语言进行翻译:

    默认显示进行中的订单(每页 10 条)。

    • 回复“下一页”以加载更多。
    • 如需按特定状态筛选,请使用其显示标签请求订单,例如:Completed、Cancelled、Failed、Expired。示例:“显示我已完成的订单” → 我会使用该筛选条件重新查询。

    如果 nextCursor 为空(没有更多页面),则删除“下一页”项目,只保留状态筛选项目。

  4. 如果用户回复“下一页”或类似内容,则使用上一次响应中的 nextCursor,通过 --limit 10 --cursor <nextCursor> 重新运行。使用相同的表格格式渲染结果。

  5. 如果用户指定了某个状态(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 应采取的操作
100REQUEST_PARAM_ERROR显示 BE 消息;让用户修正有问题的标志
10019INSUFFICIENT_NATIVE_GAS_BALANCE钱包的原生代币余额低于 BE 要求的最低值(响应中的 msg 包含 minAmount = <N>,例如 BSC 上的 0.001 BNB)。告知用户原生 Gas 余额不足以支付该链的 Gas 费,并提示用户充值——可从交易所充值、从其他账户转入,或通过 onchainos swap execute 将稳定币兑换为原生代币。不要自动重试。
10026JWT_TOKEN_VERIFY_FAILED建议运行 onchainos wallet login,然后重试
10106CHAIN_NOT_SUPPORT_ERROR告知用户该链不受支持;建议改用受支持的链
60002NO_ORDER_FOUND取消/恢复操作的目标 ID 不正确或已处于终态——建议运行 list
60003LIMIT_ORDER_NO_AUTHORITYTrader Mode 可能尚未激活;下一次 CLI 调用会自动触发 SD-A——重试一次
60006LIMIT_ORDER_OUT_LIMIT_FAIL待处理订单数已达到每个账户的上限(最多 100 个);让用户取消一些待处理订单(使用 cancel --all 或 cancel --order-id),然后重试
60009LIMIT_ORDER_ILLIQUIDITY_ERROR触发时该交易对没有流动性;建议更换交易对或放宽触发条件
60014LIMIT_ORDER_EXPIRED_CANNOT_OPERATE订单已过期
60015LIMIT_ORDER_PENDING_CANNOT_OPERATE订单仍处于生命周期中;等待其进入终态
60017LIMIT_ORDER_SUCCESS_CANNOT_OPERATE订单已完成
60018LIMIT_ORDER_TEE_SA_VERSION_UPGRADE_REQUIRED透明处理——CLI 会通过 SD-A 自动重试;正常流程中 Agent 不应看到此代码。如果此代码泄露,只需重试相同的命令
60030QUOTA_EXCEEDED已达到账户级配额上限
100005WALLET_ADDRESS_BLACKLISTED钱包地址被风险控制标记;让用户联系支持人员——不要重试
100007TEE_SIGN_FAILURE暂时性的 TEE 问题——重试一次
100010ORDER_AMOUNT_TOO_SMALL订单金额低于 BE 强制要求的 1 美元最低值。让用户增大 --amount,使订单金额超过 1 美元,然后重试
100008TEE_SERVICE_UNAVAILABLETEE 服务暂时不可用;让用户稍后重试
100012LIMIT_ORDER_INSUFFICIENT_BALANCE余额不足;建议通过 onchainos wallet balance 检查余额

按整数代码匹配,而非按 msg 字符串匹配。 msg 文本供人阅读,可能会发生变化。

执行事件代码(executionHistoryList[].code)

TEE 交易执行引擎在执行活动订单时会发出这些代码。请先读取最新条目;较早的条目仅作为历史上下文。对于每个已识别的代码,CLI 会在原始 code 旁注入三个字段:

字段用途
name内部标签;不要向用户显示
message向用户原样显示(根据 §显示标签与输出语言进行翻译)
terminaltrue ⇒ 引擎不会重试;停止轮询并显示该信息。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 选择以下操作提示之一:

codeAgent 应执行的操作
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 操作流程(固定):

  1. 运行子命令。
  2. 等待 3 秒。 对所有受支持的链,统一等待 3 秒即可。不要按照响应中的 estimatedWaitTime 等待;BE 提供的数值较为保守,会导致不必要的等待。
  3. 使用 onchainos strategy list --order-id <orderId> 重新查询最终状态。
  4. 如果首次重新查询后仍处于待处理状态,则向用户显示部分状态;不要无限循环。

不要运行长时间轮询循环。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。

评论

支持 Markdown