# Beast Trader — Gitea 仓库结构与自动化工作流设计 > 版本:v1.0 | 日期:2026-06-11 | 作者:FXY --- ## 一、背景 Gitea 1.24.2 已部署于东京服务器(43.163.225.30:3000),库存为空,数据库为 SQLite。现有量化交易系统(freqtrade + Binance Futures)的后端基础设施已就位,需建立完整的版本管理、研发工作流和自动化运维体系。 --- ## 二、仓库结构 ### (一)总体方案:单仓库(Monorepo) 理由:单人使用场景下多仓库增加管理成本,且策略、回测、文档之间存在强耦合关系。 ### (二)目录结构 ``` beast-trader/ # 根仓库 │ ├── strategies/ # ── 策略代码 ── │ ├── current/ # 当前活跃策略(软链指向具体版本) │ ├── v1.6/ # 历史版本(从 versions/ 迁移) │ ├── v2.1/ │ ├── v2.2b/ │ ├── v2.2c/ │ ├── v2.2d/ # 🔥 当前最优基线 │ └── swing/ # 波段策略系列 │ ├── v3.0/ │ └── v3.1/ │ ├── backtests/ # ── 回测结果 ── │ ├── full/ # 全周期回测(2021-2026) │ │ ├── v2_2c_full.txt │ │ ├── v2_2c_full.meta.json │ │ └── v2_2d_full.txt │ ├── yearly/ # 逐年回测 │ │ ├── v2_2d_2021.txt │ │ ├── v2_2d_2022.txt │ │ └── ... │ └── swing/ # 波段策略回测 │ ├── trades/ # ── 实盘交易记录(自动生成)── │ ├── 2026/ │ │ ├── 06/ │ │ │ ├── trades_2026-06-11.md │ │ │ ├── trades_2026-06-12.md │ │ │ └── ... │ │ └── ... │ ├── monthly/ # 月度汇总(自动生成) │ │ ├── 2026-06.md │ │ └── ... │ └── INDEX.md # 交易记录索引(自动维护) │ ├── daily_briefs/ # ── 日报 ── │ ├── 2026/ │ │ ├── 06/ │ │ │ ├── brief_2026-06-11.md │ │ │ └── ... │ │ └── ... │ └── INDEX.md │ ├── docs/ # ── 文档 ── │ ├── manual/ # 策略说明书 │ │ ├── v2_2d_manual.pdf │ │ └── v2_2d_manual.html │ ├── reports/ # 阶段性报告 │ │ ├── today_report_2026-06-11.md │ │ └── ... │ └── guides/ # 操作指南 │ ├── api_deployment.md │ └── workflow_reference.md │ ├── config/ # ── 配置文件 ── │ ├── freqtrade/ │ │ ├── config.json # Docker内配置(去掉密钥占位) │ │ ├── config.pairlist.json │ │ └── config.backtest.json │ ├── docker/ │ │ ├── docker-compose.yml │ │ └── Dockerfile │ └── dashboard/ │ ├── nginx.conf │ └── dashboard.env │ ├── scripts/ # ── 自动化脚本(服务器可执行)── │ ├── export_trades.sh # 实盘交易导出 → git push │ ├── generate_brief.sh # 日报生成 → git push │ ├── deploy_strategy.sh # 策略部署到 Docker │ ├── archive_backtest.py # 回测结果自动归档 │ └── init_gitea_repo.sh # 首次初始化脚本 │ ├── .gitea/workflows/ # ── Gitea Actions 工作流 ── │ ├── deploy-on-tag.yml # tag 推送时自动部署 │ └── daily-backup.yml # 每日自动备份 │ ├── .gitignore └── README.md ``` ### (三)设计原则 1. **按时间组织**:trades/、daily_briefs/ 按年/月两级目录自然归档 2. **按版本归档**:strategies/ 每个版本独立子目录(延续现有原则) 3. **自动写入,人工阅读**:实盘记录和日报是程序自动写入的,格式要规范可读 4. **一台服务器,一套体系**:开发者 = 用户,不需要分支策略,master/main 即可 5. **紧耦合不分离**:策略代码和它的回测结果放在不同目录但同一仓库,禁止拆分 --- ## 三、完整工作流设计 ### (一)生命周期总览 ``` ┌────────────────────────────────────────────────────────────────────────┐ │ │ │ [研发] ──→ [回测] ──→ [评估] ──→ [发布] ──→ [实盘] ──→ [复盘] │ │ ↑ │ │ │ └──────────────────── 迭代 ──────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────────────┘ ``` ### (二)各阶段详细流程 #### Phase 1:策略研发 | 步骤 | 操作 | 自动化 | |:---|:---|:---| | 1.1 | 在 WorkBuddy 中编写/修改策略代码 | — | | 1.2 | `git add strategies/current/ && git commit -m "v2.3: XXXX"` | — | | 1.3 | `git push` 到 Gitea | ✅ 触发 Gitea Webhook 通知 | #### Phase 2:回测验证 | 步骤 | 操作 | 自动化 | |:---|:---|:---| | 2.1 | Docker 内回测:`freqtrade backtesting ...` | ✅ 可脚本化 | | 2.2 | 回测结果保存到 `backtests/full/` | ✅ 脚本自动写入 | | 2.3 | 回测结果推送到 Gitea | ✅ git push | *标准回测命令(固化):* ``` # 策略层 full 测试 freqtrade backtesting --strategy StructureFlowStrategyV2_2d \ --timerange 20210101-20260601 \ --config /freqtrade/user_data/config.backtest.json \ --export trades ``` #### Phase 3:评估决策 | 步骤 | 操作 | 自动化 | |:---|:---|:---| | 3.1 | 查看回测结果(对比 v2.2d 基线) | — | | 3.2 | 决定是否部署 | — | | 3.3 | 如优化,回到 Phase 1;如发布,进入 Phase 4 | — | #### Phase 4:代码发布(Release) | 步骤 | 操作 | 自动化 | |:---|:---|:---| | 4.1 | 更新 `strategies/current/` 指向新版本 | — | | 4.2 | `git tag v2.3.0 && git push --tags` | ✅ 触发 Actions 自动部署 | | 4.3 | 服务器拉取 → 复制策略到 `user_data/strategies/` | ✅ Shell 脚本 | | 4.4 | 重启 freqtrade Docker 容器 | ✅ `docker-compose down && up -d` | #### Phase 5:实盘运行 | 步骤 | 操作 | 自动化 | |:---|:---|:---| | 5.1 | freqtrade 启动 live/dry-run | — | | 5.2 | 每笔成交 → 自动记录到 `trades/` | ✅ 每小时 cron 导出 | | 5.3 | 每日日报 → Server酱推送微信 | ✅ daily_brief.py + cron | | 5.4 | 日报 → 推送至 Gitea | ✅ cron + git push | #### Phase 6:复盘优化 | 步骤 | 操作 | 自动化 | |:---|:---|:---| | 6.1 | 查看 `trades/` 实盘记录 | — | | 6.2 | 分析盈亏分布、胜率、出场原因 | — | | 6.3 | 提出新思路 → 回到 Phase 1 | — | --- ## 四、自动化架构 ### (一)总体架构图 ``` ┌───────────────────────────────────────────────────┐ │ WorkBuddy(智能调度层) │ │ ┌──────────────┐ ┌───────────────────────┐ │ │ │ 每日08:00读取 │ │ Webhook 接收通知 │ │ │ │ Gitea 最新日报│ │ → 触发回测/分析 │ │ │ └──────────────┘ └───────────────────────┘ │ └───────────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────────┐ │ 东京服务器(执行层) │ │ │ │ ┌─────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ Cron │ │ Gitea │ │ Gitea Actions │ │ │ │ (系统级)│ │ Webhooks │ │ (CI/CD 可选) │ │ │ └────┬────┘ └────┬─────┘ └───────┬──────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────┐ │ │ │ Shell 脚本层 │ │ │ │ export_trades.sh │ generate_brief.sh │ │ │ │ deploy.sh │ archive_results.sh │ │ │ └────────────────────┼────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────┐ │ │ │ Docker/Freqtrade │ │ │ │ 实盘执行 / 回测引擎 │ │ │ └─────────────────────────────────────────────┘ │ └───────────────────────────────────────────────────┘ ``` ### (二)Cron 任务表 | 任务 | 调度 | 脚本 | 功能 | |:---|:---|:---|:---| | 实盘导出 | **每小时** | `export_trades.sh` | 查 Freqtrade DB → 写入 trades/ → git commit+push | | 日报生成 | 每日 **23:55 UTC** | `daily_brief.py`(已有) | 现行系统,扩充写入 Gitea | | 日报推送 | 日报生成后 | `generate_brief.sh` | 日报文件 → git push | | 仓库备份 | 每日 **03:00** | `backup_repo.sh` | Gitea 内 git bundle → 备份到独立存储 | ### (三)实盘交易记录自动导出机制 这是本次设计的核心创新点。方案如下: ``` Freqtrade SQLite DB │ tradesv3.sqlite(Docker内 /freqtrade/user_data/) │ ▼ export_trades.sh(每小时 cron 执行) │ ├── 1. 拉取最新成交记录(自上次导出时间戳之后) ├── 2. 格式化为 Markdown 表格 ├── 3. 写入 trades/2026/06/trades_2026-06-11.md ├── 4. 更新 INDEX.md(追加本日记录入口) ├── 5. git add + git commit + git push │ ▼ Gitea 仓库自动更新 ``` **每条记录的字段:** | 字段 | 说明 | 来源 | |:---|:---|:---| | 序号 | #001, #002... | 自动递增 | | 时间 | 入场/出场时间戳 | Freqtrade DB | | 方向 | 做多/做空 | Freqtrade DB | | 入场价 | | Freqtrade DB | | 出场价 | | Freqtrade DB | | 数量 | ETH 数量 | Freqtrade DB | | 盈亏 | 绝对金额(USDT) | Freqtrade DB | | 收益率 | % | 计算 | | 出场原因 | take_profit / stop_loss / trailing_stop / signal | Freqtrade DB | | 冷却期 | 交易后冷却剩余 | 策略上下文 | | 备注 | 人工填写 | 手动 | **查询 SQL:** ```sql SELECT id, pair, open_time, close_time, open_rate, close_rate, amount, close_profit, close_profit_abs, exit_reason FROM trades WHERE close_time > {last_export_timestamp} ORDER BY close_time ASC; ``` ### (四)首次初始化脚本 首次搭建时,需要将服务器上现有的所有文件推送到 Gitea。这需要一个一次性脚本: ```bash #!/bin/bash # init_gitea_repo.sh — 首次初始化 # 1. 在 Gitea 创建仓库 # 2. git init + 建立目录结构 # 3. 复制现有策略文件到 strategies/ # 4. 复制回测结果到 backtests/ # 5. 复制文档到 docs/ # 6. 复制配置文件到 config/ # 7. 复制 Dashboard 代码到 dashboard/ # 8. 首次 commit + push ``` ### (五)关键自动化脚本设计 #### 5.1 `export_trades.sh` — 实盘交易记录导出 ```bash #!/bin/bash # 每小时执行,从 Freqtrade DB 导出新成交记录到 Gitea 仓库 LAST_EXPORT_FILE="/var/lib/gitea/export_timestamp.txt" TRADES_DB="/home/ubuntu/freqtrade/user_data/tradesv3.sqlite" REPO_DIR="/home/ubuntu/beast-trader" TRADES_DIR="$REPO_DIR/trades/$(date +%Y/%m)" # 1. 读取上次导出时间 if [ -f "$LAST_EXPORT_FILE" ]; then LAST_TS=$(cat "$LAST_EXPORT_FILE") else LAST_TS=0 fi # 2. 查询新成交记录(需在 Docker 内或直接读 SQLite) # 注意:tradesv3.sqlite 在 Docker volume 内,需从宿主机访问 # 如果 Docker 挂载了目录,可直接读取 # 3. 格式化写入 Markdown # ... # 4. 更新 INDEX.md # ... # 5. git push cd "$REPO_DIR" && git add . && git commit -m "trades: auto export $(date +%Y-%m-%d %H:%M)" && git push ``` #### 5.2 `deploy_strategy.sh` — 策略自动部署 ```bash #!/bin/bash # 在 git tag push 后触发 TAG=$1 # 例如 v2.3.0 # 1. 从 Gitea 拉取最新代码 cd /home/ubuntu/beast-trader && git pull # 2. 将策略复制到 freqtrade 目录 cp strategies/current/*.py /home/ubuntu/freqtrade/user_data/strategies/ # 3. 重启 freqtrade Docker cd /home/ubuntu/freqtrade && docker-compose down && docker-compose up -d # 4. 记录部署版本 echo "Deployed: $TAG at $(date)" >> deploy_history.log ``` --- ## 五、实现优先级建议 建议分三个阶段推进: ### 第一阶段:数据入仓(1-2天) | 优先级 | 任务 | 产出 | |:---|:---|:---| | P0 | 写好 `init_gitea_repo.sh`,将现有全部文件推送到 Gitea | Gitea 仓库完整初始化 | | P0 | 建立目录结构 | 目录框架 | | P1 | 迁移 strategies/ 下所有版本 | 版本历史完整 | | P1 | 迁移 backtest_results/ 下的结果 | 回测历史完整 | | P2 | 迁移 docs/ 说明书和报告 | 文档完整 | ### 第二阶段:自动化搭建(2-3天) | 优先级 | 任务 | 产出 | |:---|:---|:---| | P0 | 编写 `export_trades.sh` + 配置 cron | 实盘记录每小时自动归档 | | P0 | 日报增加 git push 步骤 → Gitea | 日报自动入仓 | | P1 | 编写 `deploy_strategy.sh` | 一键部署 | | P1 | 实现 `scripts/archive_backtest.py` | 回测结果自动归档 | ### 第三阶段:工作流闭环(持续) | 优先级 | 任务 | 产出 | |:---|:---|:---| | P1 | Gitea Webhook → WorkBuddy 通知 | 变更即感知 | | P2 | 月度交易报告自动生成 | 复盘辅助 | | P2 | Gitea Actions 搭建 | CI/CD 能力 | | P3 | 策略对比看板(Gitea Pages) | 可视化演进 | --- ## 六、附则 1. **密钥不入库**:Exchange API key/secret、Server酱 SendKey 等敏感信息禁止提交到 Gitea 2. **回测数字仅供参考**:回测结果说明"过去表现好",不代表未来收益 3. **只增不删**:trades/ 和 daily_briefs/ 是单向录入,禁止手动删除 4. **日志即文档**:Gitea 的 commit log 本身就是研发日志,commit message 写清楚改动内容