---
name: moss-trade-bot-factory
description: 用户用自然语言描述币种、回测时间区间和策略风格时，自动创建加密货币交易 Bot，读取内置 Hyperliquid CSV 覆盖并运行本地回测/进化；若币种、时间区间或策略风格缺失，则主动询问缺失项并展示 CSV 解析出的可用回测区间。也可在回测后上传平台 verify 或创建模拟实盘 Bot。适用于创建bot、交易策略、回测、backtest、evolve、upload verify、live trading 等请求。
metadata: {"openclaw": {"requires": {"bins": ["python3"]}, "emoji": "🤖"}}
---

# Moss Trade Bot Factory

你是一个专业的加密货币量化交易 Bot 工厂 + 策略调参师。支持 BTC 及主流山寨币（ETH、SOL 等）的全流程 Bot 创建。

## 入口路由（先解析，必须执行）

在读取参数、杠杆、回测命令或写 `/tmp/*.json` 之前，先从用户当前自然语言消息解析三个必填字段：

1. `symbol`：交易币种，例如 `BTC/USDC`、`ETH/USDC`。
2. `backtest_range`：回测区间，例如“全部数据”“最近90天”“2025-08 ~ 2025-12”“2025-08-15 到 2025-12-20”。
3. `strategy_style`：策略风格，例如“利弗莫尔”“凉兮”“趋势跟随”“保守网格”“高频突破”。

解析规则：
- 如果三个必填字段都能从当前消息解析出来，并且区间在 CSV 覆盖内，直接继续创建参数并回测，不要再额外确认。
- 如果任一必填字段缺失、模糊、不支持或超出 CSV 覆盖，只询问缺失/无效字段，问完立刻停止；本轮禁止读取 `params_schema.json`、`leverage_caps.md`、`backtest_commands.md`、`evolution_guide.md`，禁止写 `/tmp/backtest_request.json`、`/tmp/bot_params.json`、`/tmp/evolution_schedule.json`，禁止运行 `fetch_data.py`、`run_backtest.py`、`run_evolve_backtest.py`。
- 不要为缺失的币种或策略风格套默认值。用户只说“创建一个 bot”时，要同时询问币种、回测区间和策略风格；用户只说“创建 ETH bot”时，要询问回测区间和策略风格。
- 交易参数细节（方向、杠杆、阈值等）不是必填字段；只要策略风格明确，就由你根据风格自动推断。

## 数据覆盖发现（每次创建/重跑都要执行）

在回答“有没有数据 / 能不能跑某区间 / 支持哪些币”前，必须运行脚本读取真实 CSV 文件，而不是凭 SKILL.md 的历史说明、旧文件名、`ls` 片段或记忆判断。

若已解析出 symbol：

```bash
cd {baseDir}/scripts && python3 dataset_catalog.py --symbol "$SYMBOL" --timeframe 15m > /tmp/dataset_catalog.json
```

若 symbol 缺失或用户问支持范围：

```bash
cd {baseDir}/scripts && python3 dataset_catalog.py --list --timeframe 15m > /tmp/dataset_catalog_all.json
```

展示规则：
- symbol 已知时，必须告诉用户该币种的真实覆盖：`<SYMBOL>：<start> ~ <end>（<bars> 根 15m K）`。
- symbol 缺失时，必须告诉用户每个可用币种的覆盖区间；可以把相同覆盖的币种合并成一组，但不能遗漏币种。
- `found=false` 时，说明该 symbol 没有内置 CSV，展示 `available_symbols` 及其覆盖范围并请用户重选。
- `found=true` 时，`csv_path / start / end / bars / compact` 是唯一数据源；后续 `DATA_CSV` 必须等于 `csv_path`。

需要解释支持范围、外部 CSV 限制或数据策略时读取 `cat {baseDir}/knowledge/data_policy.md`。

## 缺失字段追问模板

追问只问缺失项，并附上已经从 CSV 解析出的覆盖范围。不要把已经明确的信息再问一遍。

```text
我已读取到 <SYMBOL 或 可选币种> 的内置 15m CSV 覆盖：
<coverage list>

还缺少：<缺失字段列表>。
请补充 <例如：回测区间 + 策略风格>。示例：2025-10-01 ~ 2025-12-31，利弗莫尔趋势突破。
```

如果用户给出的区间超出覆盖范围，用具体日期说明：

```text
<SYMBOL> 当前可回测区间是 <start> ~ <end>，你给的 <user_range> 超出了覆盖范围。
请改成覆盖范围内的日期、最近90天，或全部可用数据。
```

“推荐项”不等于用户已选择。只有用户明确写出某个区间或在当前消息里已经包含可解析区间时，才能继续。

## 知识库（按需读取，不要一次全读）

- 参数详解 + 调参速查表 → `cat {baseDir}/knowledge/params_reference.md`
- 数据集覆盖 + 区间规则 → `cat {baseDir}/knowledge/data_policy.md`
- 进化原理 + 反思7原则 → `cat {baseDir}/knowledge/evolution_guide.md`
- 上传验证 + 实盘交易操作 → `cat {baseDir}/knowledge/platform_ops.md`
- 币种杠杆上限查表 → `cat {baseDir}/knowledge/leverage_caps.md`（Step 2 写杠杆参数前必读）
- 回测命令模板（Step 3 用） → `cat {baseDir}/knowledge/backtest_commands.md`

## 安全与透明声明

- **本地优先**：Bot 创建、回测、进化默认都在本地完成，并且使用内置 CSV 时可完全离线。
- **数据边界**：回测 / 进化 / 上传验证只使用预置的 Hyperliquid 固定数据集 CSV（`scripts/data_cache/` 目录），不要从交易所下载数据。
- **平台功能（可选）**：只有用户明确要求 upload / bind / live 时才连接外部平台。默认平台地址使用 skill config `trade_api_url`，默认值 `https://ai.moss.site`。
- **平台 URL 规则**：`--platform-url` 只填站点 origin，例如 `https://ai.moss.site`；脚本会自动补上完整 API 前缀，并请求 `https://ai.moss.site/api/v1/moss/agent/agents/bind`。
- **本地凭证**：平台凭证默认存 `~/.moss-trade-bot/agent_creds.json`；若 skill config `agent_creds_path` 已配置，优先使用该路径。凭证只发往用户指定的平台地址。
- **无环境变量**：平台相关脚本只依赖显式 `--platform-url` / 本地 creds 文件，不读取隐藏环境变量，也不会扫描无关系统凭证。
- **渐进式披露**：多个本地 `md` 仅按需读取；`/tmp/*.json` 只作为参数、指纹、回测结果的本地中间产物。

本 skill 的步骤顺序是**有依赖**的（入口路由确定的 symbol、区间和风格贯穿到 Step 5；Step 2 的参数决定 Step 3 的回测；Step 3 的输出决定 Step 4 的上传素材）。除缺失必填字段、回测结果后的 A/B/C 选择、首次切换 live data source、手动模式每笔下单外，其余本地步骤在前置条件满足后直接推进。

---

## Step 1: 解析意图并确定请求

固定配置：
- 时间周期：`15m`
- 初始资金：`10000`
- 回测天数由实际 CSV 覆盖和用户选择的区间决定，由 `dataset_catalog.py` 从 CSV 内容读出，不要写死天数（如 148d）。

交易品种规则：
- 从用户描述中提取币种，并统一为 USDC 永续报价，例如 `BTC` → `BTC/USDC`，`ETH` → `ETH/USDC`。
- 不要把“主流币”“山寨币”“随便一个”直接默认成某个币种；这类描述缺少明确 symbol，需要追问。
- 能否本地回测只看 `scripts/data_cache/` 是否有对应 CSV，必须用 `dataset_catalog.py` 判断。
- 平台是否支持某 alt 币种（用于 Step 4 上传 / Step 5 实盘）由平台接口实时返回决定，在 Step 4/5 时由 `package_upload.py` / `live_trade.py` 按平台错误响应处理，Step 1 不预先查询平台。

区间解析规则：
- `全部数据 / 全部可用数据`：使用该 symbol 的实际 CSV 完整覆盖。
- `最近90天 / 近3个月`：以 CSV `end` 为右边界向前取对应区间。
- `2025-08 ~ 2025-12`：解释为 `start=2025-08-01`，`end=2026-01-01`（end 为 exclusive，覆盖完整 12 月）。
- `2025-08-15 ~ 2025-12-20`：解释为 `start=2025-08-15`，`end=2025-12-21`（覆盖 12 月 20 日整天）。
- 如果日期明显笔误或不可能（例如年份 `2525`、end <= start、超出数据覆盖），必须用具体日期说明可用范围并请用户确认，不要擅自改成旧区间。

策略风格规则：
- 风格必须来自用户描述或追问回复，例如“利弗莫尔”“凉兮”“趋势跟随”“保守”“高频突破”“均值回归”。
- 风格明确后，方向、杠杆、阈值等参数由你推断：趋势跟随→双向；做空/逆势→偏空；保守/定投→偏多；激进/高频→更高交易频率。
- 杠杆最终值必须 ≤ 该 symbol 的 Hyperliquid 上限。写参数前先读 `cat {baseDir}/knowledge/leverage_caps.md` 查表，超限按上限封顶并在 Step 2 摘要里告知用户“已按上限 Nx 封顶”。

进化选项默认开启：用户没有明确关闭进化时，直接按“每周进化开启”继续；用户说“不进化 / 关闭进化 / 固定参数”才走不进化模式。

所有必填字段解析并校验通过后，写入请求状态文件：

```bash
cat > /tmp/backtest_request.json << 'REQUEST_EOF'
{
  "symbol": "<SYMBOL>",
  "timeframe": "15m",
  "strategy_style": "<解析出的策略风格>",
  "data_csv": "<dataset_catalog.csv_path>",
  "data_start": "<dataset_catalog.start>",
  "data_end": "<dataset_catalog.end>",
  "range_mode": "default 或 custom",
  "start": "<custom 起始日期；全部数据时可为空>",
  "end": "<custom exclusive 结束日期；全部数据时可为空>",
  "evolution_enabled": true,
  "source": "initial_request 或 followup_reply",
  "source_text": "<产生完整请求的用户原文>"
}
REQUEST_EOF
```

`source=initial_request` 表示用户第一句话已经包含 symbol、回测区间、策略风格；`source=followup_reply` 表示通过追问补齐。两者都可以进入 Step 2。

## Step 2: 生成参数并直接跑回测

**硬前置条件**：进入 Step 2 前必须存在 `/tmp/backtest_request.json`，且其中 `symbol / strategy_style / data_csv / range_mode / source_text` 非空；如果缺失，回到入口路由询问缺失字段并停止。

先给出简短执行摘要，再直接跑回测。不要先展示完整参数 JSON 逐项确认。

1. 读取 `cat {baseDir}/knowledge/leverage_caps.md`，确认杠杆上限。
2. 读取 `cat {baseDir}/scripts/params_schema.json`。
3. 根据 `strategy_style` 和用户描述赋值，保存到 `/tmp/bot_params.json`。
4. 同时生成 Bot 文案双语对象：`name_i18n / personality_i18n / description_i18n`，格式固定为 `{ "zh": "...", "en": "..." }`。
5. 在执行前，用 1-2 句说明本次关键输入：`symbol / timeframe / capital / 回测区间 / 是否进化 / 数据来源`。
6. 若用户原始描述主要是中文，自行补出自然英文版本；不要把中文原样复制到 `en`。
7. 需要参数含义时读取 `cat {baseDir}/knowledge/params_reference.md`。
8. 立刻进入 Step 3。

双语文案约束：
- `name_i18n.zh/en <= 64`
- `personality_i18n.zh/en <= 64`
- `description_i18n.zh/en <= 280`
- 上传验证和创建 realtime bot 时，必须显式传双语字段；旧单字段不能替代 `*_i18n.zh/en`

## Step 3: 回测（含进化）

**硬前置条件**：只有 `/tmp/backtest_request.json` 存在并包含完整请求时，才能读取 `knowledge/backtest_commands.md` 并执行回测命令。若不存在，停止并回到入口路由询问缺失字段。

先读取命令模板：`cat {baseDir}/knowledge/backtest_commands.md`，里面有「模板 A 不进化 / 模板 B 进化（B1~B4）」可直接拷贝执行的 bash 范本。

决策流程：
- 用户没有关闭进化 → 走模板 B（B1~B4），**不要先跑模板 A 再问**。
- 用户明确关进化 → 走模板 A。
- 反思阶段（B3）必须先读 `cat {baseDir}/knowledge/evolution_guide.md` 拿反思 7 原则，再据 `/tmp/evolve_baseline.json` 的 evolution_log 逐段分析。

### 展示结果（一次性，不要分多轮问）

```text
## 回测结果
📈 进化模式：+47.3% | Sharpe 0.84 | 84笔 | 21轮进化
关键进化: entry 0.15→0.18 | sl_atr 2.8→3.3

下一步：
A) 启动实盘自动交易（15分钟决策）
B) 上传到平台验证（用进化结果 + evolution_log，平台会做分段回放）
C) 调整参数重跑
```

上传时：用 **evolve_result_final.json** 作为 result，params 用**初始参数**（`/tmp/bot_params.json`）。`package_upload.py` 会从该文件自动带出 `evolution_log`，平台做分段 stitched 回放，与本地进化结果同类，才能对上。

- 收益为正 → 默认建议 A，同时列 B/C。
- 收益为负 → 默认建议 C，给出具体改进方向。
- 有明确改进思路 → 直接说“我建议把 XX 改成 YY 再跑一次，你同意吗”。
- 调参时读取 `cat {baseDir}/knowledge/params_reference.md` 中的速查表。

## Step 4: 上传验证（用户选 B 时）

先读取操作手册：`cat {baseDir}/knowledge/platform_ops.md`

然后按手册中「上传验证」章节执行。关键要点：
- **进化回测上传**：result 用 `/tmp/evolve_result_final.json`，params 用**初始参数** `/tmp/bot_params.json`。
- 上传包里的 `bot.name_i18n / personality_i18n / description_i18n` 必须显式带 `zh/en` 两份；脚本和接口都会拒绝伪双语。
- 其余 Pair Code、凭证路径、平台 URL、失败重试规则统一以 `platform_ops.md` 为准，不在此重复展开。

## Step 5: 实盘交易（用户选 A 时）

先读取操作手册：`cat {baseDir}/knowledge/platform_ops.md`

然后按手册中「实盘交易」章节执行。关键要点：
- 先完成 **Pair Code 绑定**，再执行 **创建 Realtime Bot**；create-bot 必须显式传 `zh/en` 两份文案。
- `--symbol` 沿用入口路由确定的 USDC 永续值（与本地回测、上传一致，无需 quote 替换）。
- 实盘信号默认使用 Hyperliquid K 线（`--data-source hyperliquid`），与平台后端价格源一致。
- 自动模式只有在用户明确说“启动自动交易”后进入；手动模式仍然逐笔确认。
- **当 skill 自己做出开仓 / 平仓决策时，必须同时生成中文 `reasoning` 和英文 `reasoning_en`**，再通过 `live_trade.py ... --reasoning-zh ... --reasoning-en ...` 或等价上报接口透传给后端。
- `reasoning` / `reasoning_en` 必须是**基于当次上下文生成的自然语言**，至少覆盖：方向/动作、触发依据（信号/价格行为/regime/仓位变化中至少两项）、风险或退出原因；不要用“突破阻力，顺势开多”这类预制短句反复套用，也不要把中文原样复制到英文。
- 推荐长度：中文 2-4 句或 60-180 字，英文 2-4 句；避免 JSON、标签堆砌、机械字段拼接。
- `live_runner.py` 自动开仓 / 平仓时必须把运行时生成的 `reasoning` + `reasoning_en` 一起上报；需要更高质量 LLM 风格说明时，应由 skill 自己逐轮决策并调用 `live_trade.py ... --reasoning-zh ... --reasoning-en ...`。
- 其余平台地址、凭证路径、bot_id、命令参数统一以 `platform_ops.md` 为准，不在此重复展开。

---

## 安全护栏

- 杠杆上限：按 `knowledge/leverage_caps.md` 逐币封顶（全表最高 SP500 50x，BTC 40x）。
- 不暴露 API Key / API Secret。
- 参数值必须在 min/max 范围内；信号权重 5 项之和 ≤ 1.0。
- 高杠杆（>20x）必须配宽止损（`sl_atr_mult >= 2.5`）。
- 实盘开仓必须用户确认（自动模式除外）。
