关于 aicoin-trading
aicoin-trading 是面向交易操作的 AiCoin skill,通过脚本处理现货和合约订单、平仓及止盈止损,并要求关键操作先展示预览、取得确认。
主要功能
- 01脚本执行现货与合约下单
- 02订单及平仓须经确认
- 03设置杠杆前须取得确认
- 04按持仓设置止盈止损
- 05支持 8 家交易所
适用场景
- 01在支持的交易所提交现货或合约订单
- 02查看订单预览后确认执行
- 03为已有仓位设置止盈止损
- 04查询合约市场信息
MCP 相关
这是供 Agent 使用的 skill,通过命令行脚本操作交易所;输入未说明它提供或管理 MCP 服务。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aicoincom/ coinos-skills --skill aicoin-trading安装后在 Claude Code 中输入/aicoin-trading确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
package.jsonlib/cli.mjsdefaults.jsonenv-loader.mjsscripts/api-key-info.mjsauto-trade.mjsexchange.mjsregister.mjstrade.mjsverify-order-matrix.mjs详细介绍
运行脚本:在 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 倍,用户未明确要求修改前,不准静默设置。调用前必须:用自然语言告知用户你准备将哪个交易所、哪个交易对的杠杆 / margin_mode 从什么改成什么,以及会产生什么影响;等待用户回复“确认”或“yes”后才能执行。
反例 ❌:用户说“开 100x 多 BTC”,你不确认杠杆是否写错,就直接
set_trading_params leverage=100然后下单——用户可能是口误,想说的是 10x;静默设置 100x 风险极高。 正确 ✅:先回复“100x 杠杆的爆仓距离只有约 0.95%(不计手续费),BTC 一根 5 分钟 K 线就能扫掉。确认是 100x,还是想说 10x?”,等待用户明确回答后再设置。
下单流程(两步,不可跳过)
步骤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、OKXposSide、BybitpositionIdx),止损 / 止盈 / 平仓时根据真实持仓推导方向——币安 / 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 六家 CEX 上全部受支持(分别映射到各交易所的原生条件单)。下单前设有安全网:如果触发价被某交易所静默丢弃(导致订单变为立即成交的市价单),
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。