# 比特骆驼自动化对冲系统 — 代码结构 > **产品名**:比特骆驼自动化对冲系统 · **工程目录**:`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:00~D+1 08:00;次数≤3 ├── signal.py # Call 卖一 vs Put 卖一 → 方向 ├── exits.py # 权利金覆盖 / 30 点 ├── sizing.py # 永续 1 ETH、期权 2 ETH(写死) ├── group.py # 组 ID:G-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 ``` 负责人创建远程仓库后,将本目录作为首批提交即可;业务代码按上表目录逐步添加。