---
name: fw-trade-skill
description: 复星财富（Fosun Wealth）港美股 OpenAPI 交易总入口 skill：统一管理共享凭证 `fosun.env`（生成/修复/备份恢复），并在实盘与模拟盘间路由执行账户、资金、持仓、流水、行情、下单/撤单/改单等能力；全局单凭证 `FOSUN_ENV_PATH`，变更操作强制二次确认并遵循单步执行。
---

# fw-trade-skill

这是总入口 skill，不直接实现交易。它只负责三件事：解析共享凭证路径、确保 `fosun.env` 已由 `fosun-env-setup` 生成或修复、判断盘别后路由到实盘或模拟盘子 skill。

## 模型必须遵守

### 0. 先思考再行动（最高优先级）

每一步动作前，必须先在内部完成一轮显式思考，再决定下一步：

- 复盘已有信息：用户原话、当前共享凭证状态、上一步脚本输出（含 stderr / 退出码）、缓存里的账户索引；
- 明确这一步要回答的问题：现在到底是路由、凭证生成/修复、查询还是交易？所需参数是否齐全？
- 评估可行方案，挑最小改动 / 最少副作用 / 最少询问用户的那一条；
- 严禁基于猜测或不完整信息直接调用脚本、改写参数、跨盘别切换；
- 任何不确定项（盘别、`subAccountId`、市场/产品类型、金额方向）必须先回头问用户，不得脑补。
- 港美股交易的币种、余额和购买力彼此独立：`HKD` 余额只能用于港股，`USD` 余额只能用于美股，不能跨市场混用或替用户做换汇推断。

### 1. 先定位共享凭证

全局只使用一个共享凭证路径变量 `FOSUN_ENV_PATH`。

- 未设置时：由脚本根据自身位置解析为总 skill 根目录下的 `fosun.env` 绝对路径
- 已设置且为相对路径时：以总 skill 根目录为基准解析
- 已设置且为绝对路径时：直接使用
- 推荐写法：`FOSUN_ENV_PATH=fosun.env`，既保留可迁移性，又不会受当前工作目录影响

禁止在文档或脚本里写死某台机器的绝对路径；需要绝对路径时，只能由相对路径和环境变量在运行时解析得到。

### 2. 先确保 `fosun.env` 存在

任何实盘或模拟盘操作前，先执行共享凭证初始化入口：

```bash
python3 fosun-env-setup/code/ensure_fosun_env.py
```

这个脚本的路径规则与总入口一致：

- 默认写入总 skill 根目录的 `fosun.env`
- `FOSUN_ENV_PATH` 可覆盖目标文件
- 相对 `FOSUN_ENV_PATH` 仍以总 skill 根目录为基准
- 验证通过后会额外备份到 skill 目录之外的系统原生用户数据目录，兼容 macOS / Linux / Windows
- `fosun.env` 缺失或缺少完整密钥材料时，脚本会先自动扫描备份并验证恢复，恢复成功时输出 `restored_from_backup`

结果处理：

- `status=valid`：共享凭证已可用，且已包含或刷新 `FSOPENAPI_ACCOUNT_INDEX`，继续下一步盘别判断；如果输出里包含 `restored_from_backup`，表示已从用户级本地备份恢复，不需要重新开通
- `status=pending`：已生成或复用 `open_url`；必须逐字符原样转发脚本 JSON 里的 `exact_open_url` / `open_url` 给用户完成复星 OpenAPI 开通，禁止手打、改写或重拼域名。此时正式 `fosun.env` 不写入 `pending` 凭证；用户看到“OpenAPI权限已开通”或在 OpenClaw 页面说“开通好了”后，立即再次运行同一脚本，脚本会自动轮询 TicketQuery，并在需要时读取已打开授权页正文，验证通过才收敛为 `valid`
- `status=error`：停止后续业务脚本，按 `message` 修复依赖、网络或复星凭证接口问题

如果用户明确要求修复已有凭证，再使用：

```bash
python3 fosun-env-setup/code/ensure_fosun_env.py --repair
```

### 3. 再判盘别

凡是涉及以下任一金融相关操作，都必须确认用户这次是`实盘`还是`模拟盘`：

- 查询账户 / 资金 / 持仓 / 流水
- 查询订单
- 下单 / 撤单 / 改单
- 查询行情
- 任何需要 `subAccountId` 的证券操作

如果用户没有明确回答，禁止继续执行。禁止根据账户类型、脚本名或历史上下文替用户猜盘别。

### 4. 凭证体检与路由

- 用户选择`实盘`：
  1. 使用 `real-trade-skill`。
  2. 只读取同一个 `FOSUN_ENV_PATH` 指向的共享 `fosun.env`。
  3. 凭证不存在时，先回到 `fosun-env-setup` 生成；凭证无效时，先修复或重新开通。
  4. 实盘变更操作必须先复述完整意图并获得用户明确确认。

- 用户选择`模拟盘`：
  1. 使用 `moni-trade-skill`。
  2. 只读取同一个 `FOSUN_ENV_PATH` 指向的共享 `fosun.env`。
  3. 凭证不存在时，先回到 `fosun-env-setup` 生成；凭证无效时，先修复或重新开通。
  4. 模拟盘不得生成、复制或维护第二份凭证。

## 子 skill 职责

### `fosun-env-setup`

- 负责生成、检查和修复共享 `fosun.env`
- 负责客户端私钥、Ticket、开通 URL 的初始化；授权中材料只保存在临时 state，验证通过才写正式 `fosun.env`
- 不执行交易业务

### `moni-trade-skill`

- 模拟盘子 skill
- 不生成、不修复共享凭证
- 直接复用 `FOSUN_ENV_PATH` 指向的共享凭证
- 只负责执行模拟盘接口

### `real-trade-skill`

- 实盘子 skill
- 直接复用 `FOSUN_ENV_PATH` 指向的共享凭证
- 只负责执行实盘接口
- 任何下单、改单、撤单等变更动作都必须先确认用户明确选择实盘，并完成二次确认

## 最简执行顺序

1. 运行 `python3 fosun-env-setup/code/ensure_fosun_env.py`
2. 如果输出 `status=pending`，把脚本 JSON 里的 `exact_open_url` 逐字符原样给用户完成开通；禁止手写 URL，尤其不要把 `mfosunhani` 写成 `mofosunhani`
3. 如果用户已在页面看到“OpenAPI权限已开通”，或直接说“开通好了”，再次运行同一脚本，等待验证通过并输出 `status=valid`
   - 脚本默认轮询后端授权结果，并可自动读取已打开授权页正文，不需要用户点击“全部复制”
4. 确认用户选择 `实盘` 还是 `模拟盘`
5. 实盘路由到 `real-trade-skill`，模拟盘路由到 `moni-trade-skill`
6. 全程只使用同一个 `FOSUN_ENV_PATH` / `fosun.env`

## 目录结构

```text
fw-trade-skill/
├── SKILL.md
├── fosun.env                       # 默认共享凭证落点（未设置 FOSUN_ENV_PATH 时使用）
├── fosun-env-setup/                # 共享凭证生成与修复
├── real-trade-skill/               # 实盘 skill
└── moni-trade-skill/               # 模拟盘 skill
```
