上周看到掘金热榜上好几篇 OpenClaw 相关的文章,什么"50 个 Skills"、"CC Workflow Studio",我才后知后觉地发现这玩意儿已经不只是个聊天壳子了。正好我手头有个需求——帮朋友搞一个加密货币的网格交易机器人,之前用 Python 脚本 + crontab 硬写的那套太脆弱了,动不动就挂。所以花了一整个周末折腾 OpenClaw 的自动化交易 Skill,踩了不少坑,这里把完整流程记一下。
核心思路:通过 Skills 系统接入大模型做策略决策,再用 Action 模块对接交易所 API 执行下单。整个链路是「行情数据 → LLM 分析 → 策略输出 → 交易执行 → 风控回检」,比纯规则引擎灵活很多,但配置上也确实比写死规则要复杂。
先说结论
折腾了两天半,最终跑通的方案长这样:
| 环节 | 方案 | 备注 |
|---|---|---|
| OpenClaw 版本 | v2.4.1(4 月 18 号更新) | 低于 2.3 的 Skills 系统不兼容 |
| 底层模型 | Claude Sonnet 4.6 | 策略推理够用,比 Opus 便宜一大截 |
| 交易所 | Binance Testnet → 实盘 | 先在测试网验证!别上来就真金白银 |
| 行情数据源 | CoinGecko Free API | 够用了,1 分钟粒度 |
| 部署环境 | Ubuntu 22.04 + Docker | 本地 Mac 也能跑,但延迟不稳定 |
| 策略类型 | 网格交易 + 趋势过滤 | 纯网格在震荡市还行,单边行情会亏死 |
环境准备
OpenClaw 依赖 Node.js 18+,如果你还在用 16 的赶紧升。
# 拉最新版 git clone https://github.com/anthropics/openclaw.git cd openclaw git checkout v2.4.1 # 安装依赖 npm install # 复制配置模板 cp .env.example .env.env文件里最关键的就是模型 API 配置。这里我用的是聚合 API,因为 OpenClaw 的 Skills 运行时会高频调用模型(一个交易周期大概 3-8 次 LLM 请求),直连官方 API 偶尔会碰到限流。
# .env 核心配置 OPENCLAW_LLM_PROVIDER=openai_compatible OPENCLAW_LLM_BASE_URL=https://api.ofox.ai/v1 OPENCLAW_LLM_API_KEY=sk-your-key-here OPENCLAW_LLM_MODEL=claude-sonnet-4-6 # 交易所配置(先用测试网!) EXCHANGE_NAME=binance EXCHANGE_API_KEY=your-binance-testnet-key EXCHANGE_SECRET=your-binance-testnet-secret EXCHANGE_SANDBOX=true架构概览
整个调用链路画出来大概是这样:
graph LR A[CoinGecko 行情数据] --> B[OpenClaw Skills Engine] B --> C[Claude Sonnet 4.6<br/>策略推理] C --> B B --> D{风控检查} D -->|通过| E[Binance 交易 API] D -->|拒绝| F[记录日志 + 告警] E --> G[持仓管理模块] G --> B关键点是 Skills Engine 在中间做编排。它不是简单地把行情丢给模型让它输出"买/卖",而是分好几步:先让模型分析趋势,再根据当前持仓计算网格位置,最后生成具体的订单参数。每一步都是独立的 Skill。
方案一:用内置 Trading Skill 模板(推荐新手)
OpenClaw v2.4 之后内置了trading-grid这个 Skill 模板,省了很多事。
# 初始化交易 Skill npx openclaw skill init trading-grid --name my-btc-grid这会在skills/my-btc-grid/下生成一堆文件。核心要改的是config.yaml:
# skills/my-btc-grid/config.yaml skill: name: my-btc-grid type: trading-grid version: 1.0.0 strategy: pair: BTC/USDT grid: upper_bound: 72000 # 网格上界 lower_bound: 58000 # 网格下界 grid_count: 15 # 网格数量 investment: 1000 # 总投入 USDT # 趋势过滤(这个很重要,不加的话单边行情会一直逆势补仓) trend_filter: enabled: true lookback_hours: 24 # 让 LLM 判断当前是震荡还是趋势 llm_analysis: true execution: interval_seconds: 60 # 每分钟检查一次 max_orders_per_hour: 10 # 每小时最多下 10 单 risk: max_drawdown_pct: 8 # 最大回撤 8% 自动停 single_order_max_usdt: 200然后启动:
npx openclaw skill run my-btc-grid --verbose第一次跑的时候大概率会看到这个报错:
Error: Exchange API returned 403: {"code":-2015,"msg":"Invalid API-key, IP, or permissions for action."}这是因为 Binance 测试网的 API Key 需要单独去 testnet.binance.vision 申请,不是用你主站的 Key。我在这卡了半小时,说实话挺蠢的。
跑起来之后终端会输出每一轮的决策日志:
[2026-04-22 14:32:01] Cycle #47 started [2026-04-22 14:32:01] Fetching BTC/USDT 1m candles... [2026-04-22 14:32:02] LLM analysis: trend=RANGING, confidence=0.82 [2026-04-22 14:32:02] Grid check: 2 buy orders triggered (grid #7, #8) [2026-04-22 14:32:03] Risk check: PASSED (drawdown: 1.2%) [2026-04-22 14:32:03] Executing: BUY 0.0014 BTC @ 63,847.20 [2026-04-22 14:32:04] Order filled. Cycle #47 completed in 3.1s方案二:自定义 Skill(灵活但要写代码)
内置模板够用但不够灵活。比如我想加一个"恐惧贪婪指数"作为额外输入,模板就搞不定了。
自定义 Skill 的核心是写一个handler.js:
// skills/my-custom-strategy/handler.js import { OpenAI } from 'openai'; const client = new OpenAI({ apiKey: process.env.OPENCLAW_LLM_API_KEY, baseURL: 'https://api.ofox.ai/v1', }); export async function analyze(context) { const { candles, positions, fearGreedIndex } = context; const prompt = `你是一个量化交易分析师。根据以下数据判断当前 BTC/USDT 的交易策略: 市场数据(最近24根1小时K线): ${JSON.stringify(candles.slice(-24))} 当前持仓:${JSON.stringify(positions)} 恐惧贪婪指数:${fearGreedIndex}(0=极度恐惧,100=极度贪婪) 请输出 JSON 格式: { "action": "BUY" | "SELL" | "HOLD", "confidence": 0-1, "reason": "简短理由", "suggested_price": number, "suggested_amount_usdt": number }`; const response = await client.chat.completions.create({ model: 'claude-sonnet-4-6', messages: [{ role: 'user', content: prompt }], temperature: 0.1, // 交易决策要低温度 response_format: { type: 'json_object' }, }); return JSON.parse(response.choices[0].message.content); }这里有个坑:temperature一定要设低。我一开始用默认的 0.7,同样的行情数据连续问三次,模型给出了"买、卖、持有"三种不同答案。改成 0.1 之后一致性好很多,虽然偶尔还是会摇摆,但至少不会自相矛盾了。
然后在skills/my-custom-strategy/actions.js里写执行逻辑:
// skills/my-custom-strategy/actions.js import ccxt from 'ccxt'; const exchange = new ccxt.binance({ apiKey: process.env.EXCHANGE_API_KEY, secret: process.env.EXCHANGE_SECRET, sandbox: process.env.EXCHANGE_SANDBOX === 'true', }); export async function executeOrder(decision) { // 风控前置检查 if (decision.confidence < 0.7) { console.log(`Skipped: confidence ${decision.confidence} < 0.7`); return null; } if (decision.suggested_amount_usdt > 200) { console.log(`Risk limit: capped order from ${decision.suggested_amount_usdt} to 200 USDT`); decision.suggested_amount_usdt = 200; } try { const order = await exchange.createOrder( 'BTC/USDT', 'limit', decision.action.toLowerCase(), decision.suggested_amount_usdt / decision.suggested_price, decision.suggested_price ); console.log(`Order placed: ${order.id}`); return order; } catch (err) { // 最常见的报错 if (err.message.includes('insufficient balance')) { console.error('余额不足,跳过本次下单'); return null; } throw err; } }最后注册 Skill:
npx openclaw skill register ./skills/my-custom-strategy npx openclaw skill run my-custom-strategy --interval 120踩坑记录
说几个我实际碰到的坑。
坑 1:模型返回的 JSON 偶尔不合法
大概每 50 次调用会碰到一次模型返回的 JSON 里夹带 markdown 代码块标记:
```json {"action": "HOLD", "confidence": 0.6, ...} ```解决办法是加一层清洗:
function cleanJsonResponse(text) { // 去掉 markdown 代码块标记 let cleaned = text.replace(/```json\n?/g, '').replace(/```\n?/g, ''); return JSON.parse(cleaned.trim()); }坑 2:OpenClaw 的 Skill 调度器内存泄漏
跑了大概 18 个小时之后,Node 进程内存从 180MB 涨到了 1.2GB。翻了 GitHub Issues 发现是 v2.4.0 的已知 bug,v2.4.1 修了。所以一定要用最新版。如果你暂时不想升级,加个--max-old-space-size=512限制一下,到上限自动重启。
坑 3:交易所 API 限频
Binance 的 API 限频是 1200 次/分钟,听起来很多,但如果你同时跑好几个交易对,再加上行情查询 + 下单 + 查询订单状态,很容易撞上去。碰到限频会返回:
{"code":-1003,"msg":"Too many requests; please use the websocket for live updates."}解决方案是把行情数据改成 WebSocket 推送,别用轮询。OpenClaw 内置了ws-feed插件:
# config.yaml 里加上 data_source: type: websocket provider: binance channels: - btc_usdt@kline_1m - btc_usdt@depth5坑 4:Prompt 太长导致 token 费用飙升
一开始我把最近 200 根 K 线全塞进 prompt,算了一下每次调用大概 4000 input tokens。一天跑 720 次(每 2 分钟一次),光 input 就是 288 万 tokens。用 Claude Sonnet 4.6 的话,一天大概 ¥21.6,一个月 ¥648。后来我改成只传最近 24 根 + 几个技术指标的计算结果(RSI、MACD、布林带),input 压到 800 tokens 左右,一天降到 ¥4.3。
我也不确定只传技术指标而不传原始 K 线是不是最优解——理论上模型看到原始数据能发现更多模式,但成本差了 5 倍,目前先这么跑着。
部署建议
本地开发调通之后建议用 Docker 部署到服务器上:
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --production COPY . . CMD ["npx", "openclaw", "skill", "run", "my-btc-grid", "--interval", "120"]加个docker-compose.yml把日志挂载出来,方便排查问题。我还加了个简单的 Telegram 告警 bot,每次成交或者触发风控都推一条消息,这部分就不展开了。
小结
OpenClaw 的 Skills 系统比我预期的要成熟。自动化交易这个场景,核心难点不在代码,而是策略调优和风控——模型给出的交易建议只能当参考,千万别无脑执行。我现在的做法是模型建议 + 硬编码规则双重过滤,任何单笔超过 200 USDT 或者日亏损超过 5% 就直接停机。
跑了一周测试网的数据,胜率大概 58%,盈亏比 1.3:1。不算惊艳但至少没亏。等再跑两周数据稳定了再考虑切实盘。反正不急,先让机器人多跑跑,比自己盯盘强。