Files
eth_hedge_sim/docs/代码结构.md
T
2026-07-30 13:07:25 +08:00

309 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 比特骆驼自动化对冲系统 — 代码结构
> **产品名**:比特骆驼自动化对冲系统 · **工程目录**`eth_hedge_sim`
> 本文描述目标仓库目录与模块职责。当前阶段以文档为准;业务代码按阶段逐步添加。
> 可从 `crypto_monitor` **复制** 有用片段到本仓库后改造;**禁止修改** 现网仓库内文件。
---
## 1. 根目录总览
```text
eth_hedge_sim/ # 产品:比特骆驼自动化对冲系统
├── README.md
├── .gitignore
├── .env.example # 策略机示例;真 .env 不上库
├── .env.control.example # 中控示例;真 .env.control 不上库
├── requirements.txt
├── docs/
│ ├── 开发方案.md
│ ├── 代码结构.md # 本文件
│ ├── 中控Fleet说明.md # 本地中控安装 / 配对 / 监控
│ └── 更新说明.md
├── deploy/ # 策略机部署 + manage.sh 菜单
│ ├── manage.sh # 1策略机 / 2中控 / 4更新策略 / 5更新中控
│ ├── ecosystem.config.cjs
│ └── pull_and_restart.sh
├── backend/ # 策略机 API
│ └── app/api/fleet.py # 中控专用:status/start/pause/update/issue-login
├── frontend/ # 策略机 Web
├── control/ # 本地中控(独立进程 :5160)
│ ├── backend/app/ # FastAPI:机器清单、Token、代理启停/更新
│ ├── frontend/ # 监控区 + 系统设置(Tab)
│ └── deploy/
│ ├── ecosystem.config.cjs # PM2 eth-hedge-control
│ └── update.sh
└── scripts/
├── deploy_remote.py # SSH 更新策略机
└── deploy_control.py # SSH/本机更新中控
```
中控详细用法见 **[中控 Fleet 说明](./中控Fleet说明.md)**。
---
## 1b. 中控模块职责(`control/`
| 路径 | 职责 |
|------|------|
| `control/backend/app/main.py` | 中控入口,托管前端 dist |
| `control/backend/app/api/nodes.py` | 机器 CRUD、探活、启停/更新/免密登录 URL |
| `control/backend/app/api/auth_routes.py` | 登录、改密、局域网免登、login-meta |
| `control/backend/app/envfile.py` | `.env.control` 补缺(不覆盖已有值) |
| `control/backend/app/lan.py` | 私网 IP 判断 |
| `control/frontend/src/pages/Monitor.tsx` | 监控卡片 / 详情弹层 |
| `control/frontend/src/pages/Settings.tsx` | 账户 / 添加机 / 列表 Tab |
策略机侧配对接口:`backend/app/api/fleet.py` + 设置页「中控 API Token」。
---
## 1. 根目录总览(策略机为主,续)
```text
eth_hedge_sim/
├── backend/ # API + 行情 + 策略 + 本地撮合
│ ├── app/
│ │ ├── main.py
│ │ ├── config.py
│ │ ├── api/ # HTTP 路由(含 fleet
│ │ ├── strategy/
│ │ ├── sim/
│ │ ├── live/
│ │ └── models/
│ ├── data/
│ └── tests/
├── frontend/ # 策略机 Web
│ └── src/pages/
│ ├── Plan.tsx
│ ├── Trades.tsx
│ ├── Stats.tsx
│ └── Settings.tsx # 含中控 Token
└── ...
```
> 下文原「根目录总览」中较旧的骨架示意仍保留模块职责描述;以本节 + [中控说明](./中控Fleet说明.md) 为准补充 `control/`。
---
## 2. 后端模块职责
### 2.1 `backend/app/market/` — 行情(OKX 实盘只读)
```text
market/
├── okx_rest.py # 合约列表、到期、启动对齐
├── okx_ws.py # 永续 + 期权盘口订阅
├── instruments.py # 解析「次日 16:00」到期、ATM 行权价
├── book_cache.py # 买一/卖一/深度内存缓存
└── types.py # Quote / Depth 结构
```
职责:
- 只拉行情,**不调用交易接口**。
- 对外提供:永续买卖一、Call/Put 买卖一与深度、标记价。
- 可选:行情快照落盘,供 P4 回放。
可参考现网 OKX WS/REST 实现,复制后改成本模块 API。
### 2.2 `backend/app/sim/` — 本地模拟
```text
sim/
├── matcher.py # 撮合:永续市价;期权吃买卖一;滑点=1×f;双边手续费
├── ledger.py # 虚拟资金、占用、流水
├── liquidity.py # 买一深度是否覆盖 2 ETH
└── pricing.py # 成交价公式(含 f)
```
成交价口径(与开发方案一致):
| 腿 | 动作 | 基准 | 成交价 |
|----|------|------|--------|
| 永续 | 开多 / 平空 | 卖一 | 基准 × (1+f) |
| 永续 | 开空 / 平多 | 买一 | 基准 × (1-f) |
| 期权 | 买入 | 卖一 | 基准 × (1+f) |
| 期权 | 卖出 | 买一 | 基准 × (1-f) |
另扣:`手续费 = 名义 × f`
### 2.3 `backend/app/strategy/` — 自动对冲
```text
strategy/
├── clock.py # 业务窗:D 16:00D+1 08:00;次数≤3
├── signal.py # Call 卖一 vs Put 卖一 → 方向
├── exits.py # 权利金覆盖 / 30 点
├── sizing.py # 永续 1 ETH、期权 2 ETH(写死)
├── group.py # 组 IDG-YYYYMMDD-NN
└── engine.py # 状态机:空仓→开仓→盯盘→全平→下一组
```
状态机要点:
- 同时最多 1 组。
- 平完才允许下一组;达 3 次或过 08:00 则停开。
- 每组锁定 `initial_premium`
### 2.4 `backend/app/live/` — 实盘(P5
```text
live/
├── okx_trade.py # 永续市价单;期权吃一对应下单
└── adapter.py # 与 sim.matcher 相同接口,便于切换
```
默认关闭;仅 `MODE=LIVE` 且设置页确认后启用。
### 2.5 `backend/app/api/` + `ws/`
```text
api/
├── plan.py # 当前组、策略启停、紧急全平
├── trades.py # 组列表、组成交明细
├── stats.py # 汇总统计
└── settings.py # 读写配置(脱敏)
ws/
└── push.py # market.snapshot / group.updated / fill.created / strategy.state
```
### 2.6 `backend/app/models/` — 数据
建议表:
| 表 | 用途 |
|----|------|
| `groups` | 组头:方向、开平时间、初始权利金、平仓原因、盈亏 |
| `fills` | 成交:腿、价、量、滑点、手续费 |
| `positions` | 当前仓(最多一组两腿) |
| `ledger_entries` | 资金流水 |
| `settings` | 配置 KV |
| `market_ticks` | 可选行情快照 |
---
## 3. 前端结构
```text
frontend/src/pages/
├── Plan.tsx # 自动对冲计划(主盘)
├── Trades.tsx # 交易记录(按组)
├── Stats.tsx # 统计
└── Settings.tsx # 系统设置
frontend/src/components/
├── Nav.tsx # 四项导航
├── GroupBadge.tsx # 组 ID + 状态色
├── PerpOrderBook.tsx # 永续盘口
├── OptionOrderBook.tsx # Call/Put;卖一选向高亮、买一平仓
├── PositionBar.tsx # 1 ETH + 2 ETH、浮盈、触发进度
└── EquityChart.tsx # 统计页曲线
```
导航文案固定:
1. 自动对冲计划
2. 交易记录
3. 统计
4. 系统设置
---
## 4. 部署相关文件
目标环境:**Ubuntu 22.04** + PM2。目录默认 `/opt/eth_hedge_sim`
### 4.1 `deploy/ecosystem.config.cjs`(示意)
```js
module.exports = {
apps: [
{
name: 'eth-hedge-api',
cwd: '/opt/eth_hedge_sim/backend',
script: 'uvicorn',
args: 'app.main:app --host 0.0.0.0 --port 8100',
interpreter: 'python3',
env: { MODE: 'SIM' },
},
// 若前端独立静态服务可再加 eth-hedge-web;也可由 nginx 指到 frontend/dist
],
};
```
### 4.2 `deploy/pull_and_restart.sh`(原则)
-`cd /opt/eth_hedge_sim && git pull`
- 安装依赖 / `frontend` build
- `pm2 startOrReload deploy/ecosystem.config.cjs --update-env`
- **禁止** `pm2 restart all`**禁止** 调用现网 `crypto_monitor` 的部署脚本
---
## 5. 进程与端口(建议,可改)
| 服务 | 端口 | PM2 名 |
|------|------|--------|
| API + WS | `8100` | `eth-hedge-api` |
| 前端(若独立) | `8101` 或 nginx 反代 | `eth-hedge-web` |
与现网端口、进程名全部错开。
---
## 6. 配置与密钥
```text
.env.example # 提交到 git
.env # 仅服务器 / 本机,gitignore
```
关键项:
- `MODE=SIM|LIVE`
- `OKX_API_KEY / SECRET / PASSPHRASE`SIM 阶段只读权限即可)
- `FEE_RATE`(滑点自动 = 1 × FEE_RATE
- `INITIAL_EQUITY`
- `MAX_ROUNDS=3`
- `OPEN_HHMM=16:00` / `STOP_OPEN_HHMM=08:00`
- `TZ=Asia/Shanghai`
---
## 7. 从现网复制代码时的规则
| 允许 | 禁止 |
|------|------|
| 复制 OKX 行情订阅、签名、深度解析到本仓库 | 修改现网 `crypto_monitor` 仓库内任何文件 |
| 复制「买一流动性检查」思路后重写 | 把本项目塞进现网 monorepo 一起 PM2 |
| 新建本仓库的 `.env` | 默认使用现网交易 Key 做模拟(模拟不需要交易权限) |
复制后在本仓库内自由修改;现网保持原样。
---
## 8. 建议落地顺序(与开发方案分期对应)
1. 建 git 远程 → clone 到本机该目录与服务器 `/opt/eth_hedge_sim`
2. P0`market/` 通行情
3. P1`sim/` 手动开平
4. P2`strategy/` 自动化
5. P3`frontend/` 四页
6. `deploy/` PM2 上独立机
7. P5`live/` 实盘开关
---
## 9. 当前仓库已有文件
```text
eth_hedge_sim/
└── docs/
├── 开发方案.md
└── 代码结构.md
```
负责人创建远程仓库后,将本目录作为首批提交即可;业务代码按上表目录逐步添加。