OpenClaw 自动化交易机器人怎么配置?从零搭建 + 踩坑全记录(2026)

1 阅读1分钟

上周看到掘金热榜上好几篇 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。不算惊艳但至少没亏。等再跑两周数据稳定了再考虑切实盘。反正不急,先让机器人多跑跑,比自己盯盘强。