运行脚本: 从 SKILL.md 所在目录运行 node scripts/exchange.mjs <action>. 三引擎(OpenClaw / Hermes / Claude Code)容器自动加载 skill, 直接 cd 到 skill 目录即可.
AiCoin Trading — 下单专用
⛔ 铁律(违反任何一条都是严重错误)
- 禁止写代码下单。 不准写
import ccxt、new ccxt.okx()、fetch("https://...") 或任何自定义代码来下单。所有订单只能通过 node scripts/exchange.mjs create_order 执行。
- 禁止自动确认。
create_order / close_position 第一次调用返回预览(含风险提示),你必须把预览完整展示给用户,等用户回复"确认"或"yes"后,才能第二次调用加 "confirmed":"true" 执行。
- 禁止修改用户参数。 余额不够就告诉用户,不准自动调整数量或杠杆。
- 禁止主动平仓。 除非用户明确要求。
- 平仓必须用
close_position。 禁止用 create_order 构建平仓单(容易开反向单)。
- 杠杆 / 保证金模式改动必须先确认。
set_trading_params 和 set_leverage 不是只读操作 — 它们改交易所账户的合约配置,直接影响后续所有订单的保证金占用、爆仓价、强平距离。100x 杠杆和 5x 杠杆的爆仓距离差 20 倍,用户没明确说改之前不准 silent set。调用前必须:用自然语言告诉用户你准备把哪个交易所、哪个交易对的杠杆 / margin_mode 从什么改成什么、影响是什么,等用户回复"确认"或"yes"才能执行。
反例 ❌:用户说"开 100x 多 BTC",你不反问杠杆是不是写错了直接 set_trading_params leverage=100 然后下单 — 用户可能是口误想说 10x,100x 直接 silent 设了风险极高。
正确 ✅:先回"100x 杠杆爆仓距离只有约 0.95%(不算手续费),BTC 一根 5 分钟 K 线就能扫掉。确认是 100x 还是想说 10x?",等用户明确回答再 set。
下单流程(两步,不可跳过)
步骤1: node scripts/exchange.mjs create_order '{"exchange":"okx","symbol":"BTC/USDT:USDT","type":"market","side":"buy","amount":1,"market_type":"swap"}'
→ 返回预览(交易对、方向、数量、价格、杠杆、保证金、风险提示)
→ 你必须把所有字段展示给用户
步骤2: 用户确认后
node scripts/exchange.mjs create_order '{"exchange":"okx","symbol":"BTC/USDT:USDT","type":"market","side":"buy","amount":1,"market_type":"swap","confirmed":"true"}'
→ 实际下单
平仓流程(两步,不可跳过)
平仓必须用 close_position,禁止用 create_order 手动构建平仓单(容易开反向单)。
步骤1: node scripts/exchange.mjs close_position '{"exchange":"okx","market_type":"swap"}'
→ 返回所有持仓预览(交易对、方向、张数、盈亏)
→ 展示给用户
步骤2: 用户确认后
node scripts/exchange.mjs close_position '{"exchange":"okx","market_type":"swap","confirmed":"true"}'
→ 市价平掉所有持仓(自动 reduceOnly)
步骤3: 执行后必须验证 + 总结(不可省略)
node scripts/exchange.mjs positions '{"exchange":"okx","market_type":"swap"}'
→ 确认仓位已清空,然后用一句话告诉用户结果(平了什么、盈亏多少)
指定交易对只平部分:加 "symbol":"BTC/USDT:USDT"
为什么有步骤3: close_position 的返回有时被 streaming 截断,用户看不到结果。多查一次 positions 既能确认平仓成功,又能把结论写进最终消息让用户看到。
止盈止损 / 条件单流程(两步,不可跳过)
给已有仓位挂止损 / 止盈,必须用 set_stop,禁止手搓 create_order 的 STOP_MARKET+原始 params。set_stop 会从交易所真实持仓自动推导方向、reduceOnly / posSide / positionSide(币安双向持仓、OKX、Bybit 各自适配),并校验触发价在现价正确一侧——手搓极易开成反向单或方向搞反。
步骤1: node scripts/exchange.mjs set_stop '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap","stop_loss":63.5,"take_profit":66.5}'
→ 返回预览(持仓方向、触发价、触发后动作、平仓模式、方向校验结果)
→ 你必须把预览展示给用户
步骤2: 用户确认后
node scripts/exchange.mjs set_stop '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap","stop_loss":63.5,"take_profit":66.5,"confirmed":"true"}'
→ 实际挂条件单
步骤3: 执行后复核(不可省略)
node scripts/exchange.mjs stop_orders '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap"}'
→ 确认条件单已挂上,再把结论告诉用户
- 参数:
stop_loss(止损触发价)/ take_profit(止盈触发价)至少给一个,可同时给;只给单一 trigger_price 会按方向自动归类为止损或止盈。amount 可选,默认全仓,超过持仓自动 clamp。side(long/short):当同一交易对同时持有多空两个仓(双向持仓)时必须指定,否则 set_stop 会报错让你选边,绝不替你猜。
- 多单:止损 < 现价、止盈 > 现价;空单反之。设反会被
set_stop 拦下报错(防瞬间触发)。拿不到当前价时默认中止(无法校验方向),确需跳过校验可传 "force":true 自负风险。
- 双向持仓(hedge mode)全自动适配:开仓自动补方向参数(币安
positionSide、OKX posSide、Bybit positionIdx),止损/止盈/平仓从真实持仓推导方向 —— 币安/OKX/Bybit/Bitget/HTX 双向账户都无需手动指定。其中 Bitget/HTX 平仓由 ccxt 翻成 tradeSide:Close/offset:close(纯 reduceOnly 在它们的双向模式会被当反向开仓,已专门处理);Bitget 持仓模式万一识别不出会中止并报错而非冒险反向开仓。set_stop 挂的止损/止盈是交易所条件/算法单(stop_orders 可查),平仓后用 cancel_order 可一并清掉残留条件单。
- 确认执行前
set_stop 会再读一次持仓把数量校准到当前仓位;若确认期间仓位已被平掉/反手,会直接报告“持仓已不存在”而不挂废单。
- 为什么有步骤3:条件单在部分交易所(OKX 等)属算法/委托单,不出现在普通
open_orders 列表,只能用 stop_orders 或交易所 APP 的「条件委托」栏查到。别用 open_orders 误判“没挂上”。
- 兜底:ccxt 跨所条件单细节有差异(币安触发用标记价/最新价、OKX algo 单等),若
set_stop 某条返回失败,如实告诉用户失败原因,并建议去交易所 APP 手动挂——不要谎报已挂上。
- 条件单支持矩阵(ccxt 4.5.47 实测):止损/止盈/触发单 在 Binance / OKX / Bybit / Bitget / Gate / HTX 6 家 CEX 全部支持(各映射到该所 native 条件单)。下单前有安全网:若触发价被某所静默丢弃(会变成立即成交的市价单),
placeOrder 会直接拒绝而非误下单。每次升级 ccxt 后跑 npm run verify-orders(请求体黄金矩阵)确认没漂移。Hyperliquid 走 trigger、属边角(USDC,多路由到 aicoin-onchain),以实盘为准。
下单前准备
| 步骤 |
命令 |
是否需要确认 |
| 设置杠杆+保证金模式 |
node scripts/exchange.mjs set_trading_params '{"exchange":"okx","symbol":"BTC/USDT:USDT","leverage":10,"margin_mode":"isolated","market_type":"swap"}' |
需要(见铁律 #6) |
| 单独设杠杆 |
node scripts/exchange.mjs set_leverage '{"exchange":"okx","symbol":"BTC/USDT:USDT","leverage":10,"market_type":"swap"}' |
需要(见铁律 #6) |
| 查合约信息 |
node scripts/exchange.mjs markets '{"exchange":"okx","market_type":"swap","base":"BTC"}' |
不需要(只读) |
杠杆 / 保证金确认模板(直接照抄换数字):
"我准备把 OKX BTC/USDT 永续杠杆改为 {N}x,margin_mode = {isolated/cross}。这会影响后续这个交易对所有订单的保证金占用和爆仓距离({N}x 杠杆爆仓约 {1/N*100}% 不计手续费)。确认改吗?"
确认后再实际调 set_trading_params / set_leverage。如果用户说"算了"、"先别"、"我再想想",不要调脚本。
其他命令
| 操作 |
命令 |
| 平仓(全部或指定) |
node scripts/exchange.mjs close_position '{"exchange":"okx","market_type":"swap"}' — 加 "symbol":"BTC/USDT:USDT" 只平单个 |
| 止盈止损(给已有仓位挂保护单) |
node scripts/exchange.mjs set_stop '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap","stop_loss":63.5,"take_profit":66.5}' — 两步确认,见上方「止盈止损流程」 |
| 查条件单/算法委托 |
node scripts/exchange.mjs stop_orders '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap"}' — 普通 open_orders 查不到的条件单用这个 |
| 取消订单 |
node scripts/exchange.mjs cancel_order '{"exchange":"okx","symbol":"BTC/USDT","order_id":"xxx"}' — 也能取消条件单 |
| 存交易所 key(本地,用户在 chat 给了 key 时) |
node scripts/exchange.mjs save_key '{"exchange":"binance","api_key":"...","api_secret":"..."}' — 写进 ~/.coinos/.env、chmod 600、不回显 secret(OKX/Bitget 还要 "password":"...")。容器内引导用户去 web UI EnvSection,别在 chat 收 key |
数量
合约自动换算: amount 一律是用户说的币数量(如 0.01 BTC、1000 DOGE),脚本统一按 amount / contractSize 自动换算成张数 —— 整数也按币数量算(旧版"整数=张数"的约定在 OKX/Gate 等 contractSize≠1 的所会把张数算错几个数量级,已废除)。确实要直接传张数时加 "amount_unit":"contracts"。
用 USDT 金额下单: 当用户说"用10U做多"或"花10 USDT开仓",传 cost=10(合约=USDT保证金金额,按价格+杠杆算张数;现货市价买入=花多少 USDT,按现价反算币数量),不要传 amount。
现货: amount = 币数量;或用 cost 按 USDT 金额买入。
格式: 现货 BTC/USDT,合约 BTC/USDT:USDT,Hyperliquid 用 USDC: BTC/USDC:USDC。
交易所: Binance, OKX, Bybit, Bitget, Gate.io, HTX, Pionex, Hyperliquid。
1---2name: aicoin-trading3description: **CEX 中心化交易所**(Binance / OKX / Bybit / Bitget 等)的下单交易工具。严格规则:(1) 所有订单必须通过 node scripts/exchange.mjs create_order 执行,禁止写自定义代码下单 (2) create_order 分两步:第一次返回预览,展示给用户等确认,用户说确认后第二次加 confirmed=true 执行 (3) 禁止自动确认,禁止跳过预览 (4) 平仓必须用 close_position,禁止用 create_order 构建平仓单。Trigger 关键词: 'buy on okx', 'sell on binance', '在 OKX 买 BTC', '在 Binance 下单', '做多 BTC 永续', '杠杆做空 ETH', '平掉我的 SOL 仓位', 'CEX 下单', '现货买入', '合约开仓', '永续平仓', '止盈止损', 'long', 'short', 'leverage', '买', '卖', '下单', '做多', '做空', '开仓', '平仓', '平掉', '关仓'. **路由提示**: 用户说“链上 swap / Uniswap / DEX 买 PEPE / Solana 上买”是**链上 DEX 交易**,应走 `aicoin-onchain` 而不是本 skill. Hyperliquid 上的下单也走 aicoin-onchain(HL 是链上 perp DEX),不是这里. 本 skill **只**处理 CEX 现货 + 永续合约下单。4---56> **运行脚本**: 从 SKILL.md 所在目录运行 `node scripts/exchange.mjs <action>`. 三引擎(OpenClaw / Hermes / Claude Code)容器自动加载 skill, 直接 `cd` 到 skill 目录即可.78# AiCoin Trading — 下单专用910## ⛔ 铁律(违反任何一条都是严重错误)11121. **禁止写代码下单。** 不准写 `import ccxt`、`new ccxt.okx()`、`fetch("https://...")` 或任何自定义代码来下单。所有订单只能通过 `node scripts/exchange.mjs create_order` 执行。132. **禁止自动确认。** `create_order` / `close_position` 第一次调用返回预览(含风险提示),你必须把预览完整展示给用户,等用户回复"确认"或"yes"后,才能第二次调用加 `"confirmed":"true"` 执行。143. **禁止修改用户参数。** 余额不够就告诉用户,不准自动调整数量或杠杆。154. **禁止主动平仓。** 除非用户明确要求。165. **平仓必须用 `close_position`。** 禁止用 `create_order` 构建平仓单(容易开反向单)。176. **杠杆 / 保证金模式改动必须先确认。** `set_trading_params` 和 `set_leverage` 不是只读操作 — 它们改交易所账户的合约配置,直接影响后续所有订单的保证金占用、爆仓价、强平距离。100x 杠杆和 5x 杠杆的爆仓距离差 20 倍,用户没明确说改之前不准 silent set。**调用前必须**:用自然语言告诉用户你准备把哪个交易所、哪个交易对的杠杆 / margin_mode 从什么改成什么、影响是什么,等用户回复"确认"或"yes"才能执行。1819> **反例 ❌**:用户说"开 100x 多 BTC",你不反问杠杆是不是写错了直接 `set_trading_params leverage=100` 然后下单 — 用户可能是口误想说 10x,100x 直接 silent 设了风险极高。20> **正确 ✅**:先回"100x 杠杆爆仓距离只有约 0.95%(不算手续费),BTC 一根 5 分钟 K 线就能扫掉。确认是 100x 还是想说 10x?",等用户明确回答再 set。2122## 下单流程(两步,不可跳过)2324```25步骤1: node scripts/exchange.mjs create_order '{"exchange":"okx","symbol":"BTC/USDT:USDT","type":"market","side":"buy","amount":1,"market_type":"swap"}'26→ 返回预览(交易对、方向、数量、价格、杠杆、保证金、风险提示)27→ 你必须把所有字段展示给用户2829步骤2: 用户确认后30node scripts/exchange.mjs create_order '{"exchange":"okx","symbol":"BTC/USDT:USDT","type":"market","side":"buy","amount":1,"market_type":"swap","confirmed":"true"}'31→ 实际下单32```3334## 平仓流程(两步,不可跳过)3536**平仓必须用 `close_position`,禁止用 `create_order` 手动构建平仓单(容易开反向单)。**3738```39步骤1: node scripts/exchange.mjs close_position '{"exchange":"okx","market_type":"swap"}'40→ 返回所有持仓预览(交易对、方向、张数、盈亏)41→ 展示给用户4243步骤2: 用户确认后44node scripts/exchange.mjs close_position '{"exchange":"okx","market_type":"swap","confirmed":"true"}'45→ 市价平掉所有持仓(自动 reduceOnly)4647步骤3: 执行后必须验证 + 总结(不可省略)48node scripts/exchange.mjs positions '{"exchange":"okx","market_type":"swap"}'49→ 确认仓位已清空,然后用一句话告诉用户结果(平了什么、盈亏多少)50```51指定交易对只平部分:加 `"symbol":"BTC/USDT:USDT"`5253> **为什么有步骤3**: close_position 的返回有时被 streaming 截断,用户看不到结果。多查一次 positions 既能确认平仓成功,又能把结论写进最终消息让用户看到。5455## 止盈止损 / 条件单流程(两步,不可跳过)5657**给已有仓位挂止损 / 止盈,必须用 `set_stop`,禁止手搓 `create_order` 的 `STOP_MARKET`+原始 params。**`set_stop` 会从交易所**真实持仓**自动推导方向、`reduceOnly` / `posSide` / `positionSide`(币安双向持仓、OKX、Bybit 各自适配),并校验触发价在现价正确一侧——手搓极易开成反向单或方向搞反。5859```60步骤1: node scripts/exchange.mjs set_stop '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap","stop_loss":63.5,"take_profit":66.5}'61→ 返回预览(持仓方向、触发价、触发后动作、平仓模式、方向校验结果)62→ 你必须把预览展示给用户6364步骤2: 用户确认后65node scripts/exchange.mjs set_stop '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap","stop_loss":63.5,"take_profit":66.5,"confirmed":"true"}'66→ 实际挂条件单6768步骤3: 执行后复核(不可省略)69node scripts/exchange.mjs stop_orders '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap"}'70→ 确认条件单已挂上,再把结论告诉用户71```7273- 参数:`stop_loss`(止损触发价)/ `take_profit`(止盈触发价)至少给一个,可同时给;只给单一 `trigger_price` 会按方向自动归类为止损或止盈。`amount` 可选,默认全仓,超过持仓自动 clamp。`side`(`long`/`short`):当同一交易对**同时持有多空两个仓**(双向持仓)时必须指定,否则 `set_stop` 会报错让你选边,绝不替你猜。74- **多单**:止损 < 现价、止盈 > 现价;**空单**反之。设反会被 `set_stop` 拦下报错(防瞬间触发)。拿不到当前价时默认中止(无法校验方向),确需跳过校验可传 `"force":true` 自负风险。75- **双向持仓(hedge mode)全自动适配**:开仓自动补方向参数(币安 `positionSide`、OKX `posSide`、Bybit `positionIdx`),止损/止盈/平仓从真实持仓推导方向 —— 币安/OKX/Bybit/Bitget/HTX 双向账户都无需手动指定。其中 Bitget/HTX 平仓由 ccxt 翻成 `tradeSide:Close`/`offset:close`(纯 `reduceOnly` 在它们的双向模式会被当反向开仓,已专门处理);Bitget 持仓模式万一识别不出会**中止并报错**而非冒险反向开仓。`set_stop` 挂的止损/止盈是交易所条件/算法单(`stop_orders` 可查),平仓后用 `cancel_order` 可一并清掉残留条件单。76- 确认执行前 `set_stop` 会**再读一次持仓**把数量校准到当前仓位;若确认期间仓位已被平掉/反手,会直接报告“持仓已不存在”而不挂废单。77- **为什么有步骤3**:条件单在部分交易所(OKX 等)属算法/委托单,**不出现在普通 `open_orders` 列表**,只能用 `stop_orders` 或交易所 APP 的「条件委托」栏查到。别用 `open_orders` 误判“没挂上”。78- **兜底**:ccxt 跨所条件单细节有差异(币安触发用标记价/最新价、OKX algo 单等),若 `set_stop` 某条返回失败,如实告诉用户失败原因,并建议去交易所 APP 手动挂——不要谎报已挂上。79- **条件单支持矩阵(ccxt 4.5.47 实测)**:止损/止盈/触发单 在 **Binance / OKX / Bybit / Bitget / Gate / HTX 6 家 CEX 全部支持**(各映射到该所 native 条件单)。下单前有**安全网**:若触发价被某所静默丢弃(会变成立即成交的市价单),`placeOrder` 会直接拒绝而非误下单。每次升级 ccxt 后跑 `npm run verify-orders`(请求体黄金矩阵)确认没漂移。Hyperliquid 走 trigger、属边角(USDC,多路由到 aicoin-onchain),以实盘为准。8081## 下单前准备8283| 步骤 | 命令 | 是否需要确认 |84|------|------|------------|85| 设置杠杆+保证金模式 | `node scripts/exchange.mjs set_trading_params '{"exchange":"okx","symbol":"BTC/USDT:USDT","leverage":10,"margin_mode":"isolated","market_type":"swap"}'` | **需要**(见铁律 #6) |86| 单独设杠杆 | `node scripts/exchange.mjs set_leverage '{"exchange":"okx","symbol":"BTC/USDT:USDT","leverage":10,"market_type":"swap"}'` | **需要**(见铁律 #6) |87| 查合约信息 | `node scripts/exchange.mjs markets '{"exchange":"okx","market_type":"swap","base":"BTC"}'` | 不需要(只读) |8889**杠杆 / 保证金确认模板**(直接照抄换数字):90> "我准备把 OKX BTC/USDT 永续杠杆改为 **{N}x**,margin_mode = **{isolated/cross}**。这会影响后续这个交易对所有订单的保证金占用和爆仓距离({N}x 杠杆爆仓约 {1/N*100}% 不计手续费)。确认改吗?"9192确认后再实际调 `set_trading_params` / `set_leverage`。如果用户说"算了"、"先别"、"我再想想",**不要**调脚本。9394## 其他命令9596| 操作 | 命令 |97|------|------|98| 平仓(全部或指定) | `node scripts/exchange.mjs close_position '{"exchange":"okx","market_type":"swap"}'` — 加 `"symbol":"BTC/USDT:USDT"` 只平单个 |99| 止盈止损(给已有仓位挂保护单) | `node scripts/exchange.mjs set_stop '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap","stop_loss":63.5,"take_profit":66.5}'` — 两步确认,见上方「止盈止损流程」 |100| 查条件单/算法委托 | `node scripts/exchange.mjs stop_orders '{"exchange":"binance","symbol":"HYPE/USDT:USDT","market_type":"swap"}'` — 普通 `open_orders` 查不到的条件单用这个 |101| 取消订单 | `node scripts/exchange.mjs cancel_order '{"exchange":"okx","symbol":"BTC/USDT","order_id":"xxx"}'` — 也能取消条件单 |102| 存交易所 key(本地,用户在 chat 给了 key 时) | `node scripts/exchange.mjs save_key '{"exchange":"binance","api_key":"...","api_secret":"..."}'` — 写进 `~/.coinos/.env`、`chmod 600`、不回显 secret(OKX/Bitget 还要 `"password":"..."`)。容器内引导用户去 web UI EnvSection,别在 chat 收 key |103104## 数量105106**合约自动换算:** `amount` 一律是用户说的**币数量**(如 0.01 BTC、1000 DOGE),脚本统一按 `amount / contractSize` 自动换算成张数 —— 整数也按币数量算(旧版"整数=张数"的约定在 OKX/Gate 等 contractSize≠1 的所会把张数算错几个数量级,已废除)。**确实要直接传张数**时加 `"amount_unit":"contracts"`。107**用 USDT 金额下单:** 当用户说"用10U做多"或"花10 USDT开仓",传 `cost=10`(合约=USDT保证金金额,按价格+杠杆算张数;现货市价买入=花多少 USDT,按现价反算币数量),不要传 amount。108**现货:** `amount` = 币数量;或用 `cost` 按 USDT 金额买入。109110**格式:** 现货 `BTC/USDT`,合约 `BTC/USDT:USDT`,Hyperliquid 用 USDC: `BTC/USDC:USDC`。111112**交易所:** Binance, OKX, Bybit, Bitget, Gate.io, HTX, Pionex, Hyperliquid。