diff --git a/docs/gitea_workflow_design.md b/docs/gitea_workflow_design.md new file mode 100644 index 0000000..ffaee8b --- /dev/null +++ b/docs/gitea_workflow_design.md @@ -0,0 +1,397 @@ +# 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 写清楚改动内容 diff --git a/docs/today_report_2026-06-11.md b/docs/today_report_2026-06-11.md new file mode 100644 index 0000000..429ad6b --- /dev/null +++ b/docs/today_report_2026-06-11.md @@ -0,0 +1,98 @@ +# 关于v2.2d量化交易策略研发进度及实盘部署准备情况的报告 + +根据近期工作部署,现将2026年6月11日策略研发工作推进情况报告如下: + +## 一、基本情况 + +本日围绕v2.2d策略开展了基线确认、回测验证、文档编撰、实盘环境搭建等系列工作,阶段性成果显著。核心进展如下: + +| 工作事项 | 完成情况 | 备注 | +|:---|:---|:---| +| v2.2d全周期回测 | 已完成 | 2021.01-2026.06,2057倍收益 | +| v2.2d逐年回测 | 已完成 | 按年独立测算,5年正收益 | +| v2.2d策略说明书 | 已完成 | A4优化版PDF,32页 | +| BinanceAPI部署 | 已完成 | 交易权限+I锁定东京 | +| Dashboard升级 | 已完成 | 实时价格+逐年数据 | +| 博客哲学分析 | 已完成 | 10章深度点评 | +| 非入场诊断 | 已完成 | resistance_alive到期 | + +## 二、主要做法 + +### (一)策略基线更替——v2.2d确立为新最优 + +1. **问题溯源**。v2.2c冷却期逻辑存在缺陷:`short_base.rolling(6).max()==0`基于条件满足而非实际入场计时,市场持续满足条件时可永久阻止下单。 + +2. **修复方案**。将冷却期改为`_apply_cooldown`基于实际入场事件触发,彻底消除自锁死风险。 + +3. **回测验证**。全周期回测(2021.01.01—2026.06.01)结果如下: + +| 指标 | v2.2c(旧基线) | v2.2d(新基线) | 变化 | +|:---|:---|:---|:---| +| 最终资金 | $11,983,254.68 | $20,578,435.93 | +71.7% | +| 收益率 | +119,732.55% | +205,684.36% | — | +| 交易笔数 | 1,056 | 1,375 | +30.2% | +| 胜率 | 29.7% | 28.9% | — | +| CAGR | 270.15% | 309.01% | +14.4% | +| Sharpe | 0.82 | 1.03 | +25.6% | +| 利润因子 | 1.97 | 1.92 | — | +| 最大回撤 | 17.96% | 20.58% | — | + +4. **结论**。v2.2d在交易频率、最终收益、夏普比率三项核心指标上全面优于v2.2c,冷却期修复逻辑自洽。即日起v2.2d为新最优基线,此前所有引用以v2.2d为准。 + +### (二)逐年回测验证 + +对v2.2d进行逐年独立回测(每年$10,000起算),结果如下: + +| 年份 | 交易数 | 收益率 | 终值 | 同期市场 | 胜率 | 最大回撤 | +|:---|:---|:---|:---|:---|:---|:---| +| 2021 | 172 | +251.16% | $35,116 | +407% | 27.3% | 11.28% | +| 2022 | 204 | +110.91% | $21,091 | -68% | 30.9% | 11.69% | +| 2023 | 182 | +49.35% | $14,935 | +92% | 26.9% | 10.04% | +| 2024 | 232 | +185.84% | $28,584 | +46% | 28.4% | 6.87% | +| 2025 | 221 | +608.24% | $70,824 | -11% | 27.6% | 13.92% | +| 2026 | 54 | -11.87% | $8,813 | -45% | 22.2% | 14.89% | + +主要发现:一是策略在熊市和震荡市中表现突出(2022市场-68%时策略+111%),牛市相对逊色但保持正收益。二是胜率稳定在22%—31%区间,回撤控制在7%—15%范围,逐年表现一致性较好。 + +### (三)策略说明书编撰 + +完成v2.2d策略说明书编撰及PDF转换,共12章、32页。内容覆盖策略逻辑、参数说明、风险管理、部署运维等全部环节。PDF经A4尺寸优化排版,作者署名FXY,可直接打印使用。 + +### (四)Binance API部署及实盘环境就绪 + +1. **密钥安全管理**。新旧密钥已完成更替,新密钥仅保留Futures + Trade权限,未开通提币,IP锁定东京服务器(43.163.225.30)。密钥存储路径:`~/freqtrade/.keys/binance_readonly`(chmod 600)。 + +2. **Freqtrade桥接**。将密钥转换为JSON配置(`user_data/secrets.json`,chmod 600),通过docker-compose配置链`config.json → config.pairlist.json → secrets.json`自动加载覆盖。 + +3. **连通验证**。三项测试全部通过:服务器时间正常、账户状态可交易(canTrade=True)、合约下单接口可达(返回价格过低提示,非权限拒绝)。 + +4. **结论**。实盘环境已具备部署条件,无需额外配置或重新上传密钥。 + +### (五)非入场原因诊断 + +用户发现14:00(北京时间)应有交易信号但未触发。诊断确认原因为`resistance_alive`到期:11:00的1661阻力位于三根K线后(14:00)失效,策略正确拒绝了在已过期阻力位上做空。经评估,当前3根K线有效期设置合理,维持不变。 + +## 三、存在的问题 + +(一)**冷却期逻辑的隐患**。v2.2c的冷却期缺陷虽然已在v2.2d修复,但`_apply_cooldown`新逻辑仍需在实盘环境中持续观察,确保不存在新的边界条件问题。 + +(二)**牛市相对表现偏弱**。逐年数据表明策略在趋势性牛市中跑输市场(如2021年+251% vs 市场+407%),这是价格行为学策略的固有特征,暂时不作为缺陷对待,但需关注。 + +(三)**2026年当前负收益**。今年前半年策略-11.87%(市场-45%),绝对收益为负。虽然相对表现尚可,但提醒策略在极端行情下仍有持续亏损周期可能。 + +(四)**夏普比率仍属中等偏优**。1.03的夏普比率在加密货币策略中属"良好偏优",距离优秀(1.5+)仍有提升空间。 + +## 四、下一步工作打算 + +(一)**启动v2.2d实盘(dry-run)**。当前部署条件已全部就绪,建议择机启动dry-run,以真实市场环境检验策略执行稳定性。 + +(二)**策略说明书完善**。根据实际运行反馈,补充实盘操作章节和常见问题排查手册。 + +(三)**波段策略研发**。v3.1在熊市/震荡市表现优异(2025年+65.47%,70%胜率),继续探索与趋势策略v2.2d的互补机制,考虑多策略并行架构。 + +(四)**监控日报自动化**。现有daily_brief.py已运行稳定,后续可增强为异常行情自动预警。 + +特此报告。 + +FXY +2026年6月11日 diff --git a/docs/v2.2d_strategy_report.docx b/docs/v2.2d_strategy_report.docx new file mode 100644 index 0000000..c5fcb7c Binary files /dev/null and b/docs/v2.2d_strategy_report.docx differ diff --git a/docs/v2_2d_strategy_manual.html b/docs/v2_2d_strategy_manual.html new file mode 100644 index 0000000..bf70ffe --- /dev/null +++ b/docs/v2_2d_strategy_manual.html @@ -0,0 +1,1549 @@ + + +
+ + +Structure Flow Strategy v2.2d 是一套基于纯价格行为学(Price Action)的 ETH/USDT 永续合约中低频趋势跟踪策略。策略运行于 1 小时时间框架,辅以 4 小时和日线级别的宏观结构分析,日均交易 0.7 笔,持仓周期约 21.5 小时。
+ +v2.2d 不依赖任何传统技术指标——没有 EMA、没有 MACD、没有 RSI、没有布林带。策略的"眼睛"只有三个东西:
+ +v2.2d 的逻辑可以拆解为四个第一性原理:
+ +| 原理 | 表述 | 在策略中的映射 |
|---|---|---|
| 顺势而为 | +趋势是你的朋友。反转大部分失败,顺势交易的概率优势是压倒性的。 | +D1 趋势向上才做多,D1 趋势向下才做空。4H 趋势强度确认。 | +
| S/R 位入场 | +支撑和阻力是市场记忆的锚点。价格在这些位置的反应提供了低风险的入场时机。 | +供需区域(Demand/Supply Zone)+ 活支撑/阻力(Alive S/R)双重过滤。 | +
| 让利润奔跑 | +交易的利润不来自胜率,而来自少数大赢家。截断亏损容易,让利润奔跑难。 | +动态追踪止损(Trailing Stop Loss)。亏损单平均持仓 9 小时,盈利单平均持仓 2 天 3 小时。 | +
| 纪律优于预测 | +不要试图预测下一根 K 线。策略的工作是"如果 A 则 B",不是"我认为会涨"。 | +6 项入场条件全部为布尔值,无模糊判断。冷却期防止情绪化追单。 | +
v2.2d 采用三层时间框架结构,自上而下形成"宏观定方向 → 中观定趋势 → 微观定入场"的决策链条:
+ +D1(日线):使用 @informative("1d") 装饰器,在日线级别检测 Swing Point 并判断趋势方向(trend_up / trend_down)。这是策略的"宪法"——D1 趋势决定允许做多还是做空。
4H(四小时):使用 @informative("4h") 装饰器。不仅判断趋势方向,还计算趋势强度。趋势强度的算法是:最近两个 Swing High 的间距变化率 + 最近两个 Swing Low 的间距变化率。强度 > trend_strength_min(默认 -0.20,即 -20%)则标记为强势趋势。
1H(一小时):主时间框架。在此层级完成所有核心计算:Swing Point 检测、S/R 结构分析、供需区域划分、K 线形态识别、活支撑/阻力判定、入场信号生成和冷却期应用。
+ +| 参数名 | 默认值 | 可调范围 | 说明 |
|---|---|---|---|
swing_lookback_d1 | 10 | 8 ~ 14 | D1 Swing Point 检测窗口。越大越滞后,越小越敏感。 |
swing_lookback_h4 | 8 | 5 ~ 10 | 4H Swing Point 检测窗口。用于趋势强度计算。 |
swing_lookback_1h | 5 | 3 ~ 7 | 1H Swing Point 检测窗口。直接决定 S/R 位置。 |
pin_bar_wick_ratio | 60% | 50 ~ 70% | Pin Bar 识别阈值。影线占比需 > 此值。 |
max_stop_dist | 50% | 20 ~ 50% | 入场时价格与 S/R 的最大距离(%)。限制止损成本。 |
cooldown_bars | 6 | 3 ~ 12 | 入场后冷却 K 线数。防止连续追单。 |
trend_strength_min | -20% | -50 ~ +20% | 4H 趋势强度最低阈值。负值=允许弱趋势入场。 |
trend_strength_min 设为 -20% 意味着策略在非常宽松的条件下也允许入场——历史回测表明,过度收紧此参数会误杀大量盈利交易。
+ Swing Point 是价格行为学的基石。一个 Swing High 被定义为:某个 K 线的高点,比它左右各 N 根 K 线的高点都高。Swing Low 同理。
+ +def _detect_swing_points(high, low, window=5):
+ n = len(high)
+ sh = pd.Series(np.nan, index=high.index)
+ sl = pd.Series(np.nan, index=low.index)
+
+ for i in range(window, n - window):
+ # Swing High: 当前高点 > 左 window 根和右 window 根的所有高点
+ if (high.iloc[i] > high.iloc[i-window:i].max() and
+ high.iloc[i] > high.iloc[i+1:i+window+1].max()):
+ sh.iloc[i] = high.iloc[i]
+
+ # Swing Low: 当前低点 < 左 window 根和右 window 根的所有低点
+ if (low.iloc[i] < low.iloc[i-window:i].min() and
+ low.iloc[i] < low.iloc[i+1:i+window+1].min()):
+ sl.iloc[i] = low.iloc[i]
+
+ return sh, sl
+
+ pd.notna() 判断。
+ _build_structure() 是策略最核心的函数。它逐 K 线遍历,维护最近 4 个 Swing High 和 Swing Low 的列表,并实时判断:
这是策略中最精妙的条件之一。仅仅"存在"支撑/阻力是不够的——策略要求这个 S/R 是活的:它在最近的 3 根 K 线内被测试过,并且守住了。
+ +# 活支撑:价格触及支撑(±0.5%)且收盘在支撑上方
+touched_support = (
+ (low <= support * 1.005) & (low >= support * 0.995)
+)
+held_support = close > support
+support_tested_and_held = touched_support & held_support
+support_alive = support_tested_and_held.rolling(3, min_periods=1).max() > 0
+
+ resistance_alive 从 True 变 False,策略正确拒单。说明这个条件在实战中确实在履行"最后一道关"的职责。
+ Pin Bar(也称为锤子线/流星线/十字星)是价格行为学中最重要的单 K 线反转信号。其核心特征是:影线(wick)极长,实体(body)极短。
+ +body = abs(close - open)
+total_range = (high - low).replace(0, 0.0001)
+
+upper_wick = high - max(open, close)
+lower_wick = min(open, close) - low
+
+# Pin Bar 条件:影线占总范围的 60% 以上
+is_pin = (upper_wick + lower_wick) / total_range > 0.6
+
+# 看涨 Pin Bar:阳线 + 下影线 > 上影线(买方在低位强力反击)
+bullish_pin = is_pin & (close > open) & (lower_wick > upper_wick)
+
+# 看跌 Pin Bar:阴线 + 上影线 > 下影线(卖方在高位强力压制)
+bearish_pin = is_pin & (close < open) & (upper_wick > lower_wick)
+
+ 吞没形态(Engulfing)是两K线组合形态,也是价格行为学中可信度最高的反转信号之一。
+ +prev_open = open.shift(1)
+prev_close = close.shift(1)
+
+# 看涨吞没:当前阳线完全吞没前一根阴线
+bullish_engulf = (
+ (close > prev_open) & (open < prev_close) & (close > open)
+)
+
+# 看跌吞没:当前阴线完全吞没前一根阳线
+bearish_engulf = (
+ (close < prev_open) & (open > prev_close) & (close < open)
+)
+
+ 在 v2.2d 中,K 线形态虽然在代码中被计算(bullish_pinbar、bearish_pinbar、bullish_engulfing、bearish_engulfing),但在当前的入场条件中并未被直接使用。策略选择用供需区域 + 活 S/R 替代了 K 线形态确认。
plot_config 可视化,方便实盘监控时观察。
+ 所有 6 项条件必须同时满足,策略才会发出做多信号:
+ +| # | 条件 | 代码变量 | 逻辑 |
|---|---|---|---|
| 1 | D1 上升趋势 | trend_up_1d |
+ 日线级别 Swing High 和 Swing Low 依次抬高。这是"顺势"的根保证。 | +
| 2 | 价格处于需求区 | in_demand |
+ 当前收盘价在支撑-阻力区间的下 35% 内。确保入场位置有足够的上涨空间。 | +
| 3 | 止损距离合理 | long_stop_dist <= max_stop_dist |
+ 入场价距支撑位不超过 50%(默认),且必须 > 0.3%。防止止损太远或太近。 | +
| 4 | 支撑位有效 | support_alive |
+ 最近 3 根 K 线内价格曾测试支撑并收盘在其上方。证明市场"记得"这个位置。 | +
| 5 | 4H 强势上升 | strong_uptrend_4h |
+ 4H 级别趋势强度 > -20%。中观级别确认趋势有效性,过滤假突破。 | +
| 6 | 冷却期已过 | _apply_cooldown() |
+ 距离上次入场已超过 6 根 K 线(默认)。防止连续追单和过度交易。 | +
| # | 条件 | 代码变量 | 逻辑 |
|---|---|---|---|
| 1 | D1 下降趋势 | trend_down_1d |
+ 日线级别 Swing High 和 Swing Low 依次降低。 | +
| 2 | 价格处于供给区 | in_supply |
+ 当前收盘价在支撑-阻力区间的上 35%(即 65%~100%)。 | +
| 3 | 止损距离合理 | short_stop_dist <= max_stop_dist |
+ 阻力位距入场价不超过 50%,且必须 > 0.3%。 | +
| 4 | 阻力位有效 | resistance_alive |
+ 最近 3 根 K 线内价格曾测试阻力并收盘在其下方。 | +
| 5 | 4H 强势下降 | strong_downtrend_4h |
+ 4H 级别下降趋势强度 > -20%。 | +
| 6 | 冷却期已过 | _apply_cooldown() |
+ 距离上次入场已超过 6 根 K 线。 | +
v2.2c 使用了一个看似巧妙但实际有致命缺陷的冷却期实现:
+ +# v2.2c 的 bug 实现
+long_base = (...) # 6项条件,布尔 Series
+long_entries = long_base & (long_base.rolling(cooldown).max().shift(1) == 0)
+
+ Bug 的逻辑:rolling(cooldown).max() 检测的是"过去 6 根 K 线中是否有任何一根满足条件"——而不是"过去 6 根 K 线中是否实际入场了"。
rolling(6).max() 永远为 True,冷却期永远不解除。v2.2d 引入了一个全新的 _apply_cooldown() 方法,基于实际入场事件而非条件满足:
def _apply_cooldown(self, signal: pd.Series, cooldown_bars: int) -> pd.Series:
+ """
+ 正确应用冷却期:入场后才冷却,而非条件满足就冷却。
+ """
+ n = len(signal)
+ result = [False] * n
+ last_entry = -99999 # 上次入场的 bar 索引
+
+ values = signal.values
+ for i in range(n):
+ if values[i] and (i - last_entry) > cooldown_bars:
+ result[i] = True
+ last_entry = i
+
+ return pd.Series(result, index=signal.index)
+
+ cooldown_bars → 允许入场。last_entry,接下来 cooldown_bars 根 K 线内即使条件满足也不会再次入场。| 指标 | v2.2c (Bug) | v2.2d (修复) | 变化 |
|---|---|---|---|
| 交易笔数 | 1,056 | 1,375 | +319 (+30%) |
| 最终资金 | $11,983,254 | $20,578,435 | +71.7% |
| CAGR | 270.15% | 309.01% | +38.86pp |
| Sharpe | 0.82 | 1.03 | +0.21 |
| 最大回撤 | 17.96% | 20.58% | +2.62pp |
| 利润因子 | 1.97 | 1.92 | -0.05 |
| 胜率 | 29.7% | 28.9% | -0.8pp |
v2.2d 使用 D1 级别的趋势反转作为结构出场信号:
+ +# 做多出场:D1 不再上升
+exit_long = ~dataframe["trend_up_1d"].fillna(True)
+
+# 做空出场:D1 转为上升
+exit_short = dataframe["trend_up_1d"].fillna(False)
+
+ 逻辑非常简洁:D1 结构破坏 = 离场。做多时如果日线趋势从上升转为非上升,立即出场。做空时如果日线趋势转为上升,立即出场。
+ +exit_signal 出场(88.9% 胜率),说明绝大多数交易是被动态止损管理而非 D1 结构出场信号终止的。
+ 这是策略真正的核心出场机制。止损位置动态绑定到 1H 级别的 S/R 位:
+ +def custom_stoploss(self, pair, trade, current_time, current_rate,
+ current_profit, after_fill, **kwargs):
+ dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
+ last = dataframe.iloc[-1]
+
+ if not trade.is_short:
+ # 做多:止损 = 支撑位 × 0.999(支撑下方 0.1%)
+ support = last.get("support", np.nan)
+ sl_price = support * 0.999
+ sl_ratio = (sl_price / current_rate) - 1.0
+ return max(sl_ratio, -0.15) # 硬上限 15%
+ else:
+ # 做空:止损 = 阻力位 × 1.001(阻力上方 0.1%)
+ resistance = last.get("resistance", np.nan)
+ sl_price = resistance * 1.001
+ sl_ratio = 1.0 - (sl_price / current_rate)
+ return min(sl_ratio, 0.15) # 硬上限 15%
+
+ 每根 1H K 线收盘时,策略按以下优先级检查出场:
+ +出场逻辑的核心统计数据:
+trailing_stop_loss 出场,胜率 66.2%,贡献 +383,557% 的利润stop_loss 出场,胜率 0%,亏损 -181,597%exit_signal 出场,胜率 88.9%策略设置了 stoploss = -0.15(15%)作为全局硬止损。但在实际运行中,这个硬止损几乎不会被触发,因为 custom_stoploss 的动态 S/R 止损通常在较小的亏损幅度就已经激活。硬止损的存在是安全网——防止 custom_stoploss 在极端行情下返回异常值。
| 参数 | 值 | 含义 |
|---|---|---|
max_open_trades | 1 | 同一时间最多持有 1 笔仓位 |
stake_amount | unlimited | 每笔交易使用全部可用资金(全仓) |
| 杠杆 | 1x | 不使用杠杆 |
| 保证金模式 | Cross(全仓) | 所有仓位共享保证金池 |
回测显示的最大回撤为 20.58%(约 $2,200,994),发生在 2026-05-05 至 2026-05-23,持续 17 天 15 小时。回撤起点资金 $22,490,086,终点 $20,279,092。
+ +需要注意:
+| 指标 | 数值 | 评级 |
|---|---|---|
| 回测区间 | 2021-01-01 → 2026-06-01(1,977 天) | 覆盖完整牛熊周期 ✅ |
| 交易模式 | Cross Futures(合约) | — |
| 交易笔数 | 1,375(日均 0.7 笔) | 中低频 ✅ |
| 初始资金 | $10,000 | — |
| 最终资金 | $20,578,435.93 | — |
| 总回报率 | +205,684.36%(2057倍) | 🏆 卓越 |
| CAGR | 309.01% | 🏆 卓越 |
| Sharpe 比率 | 1.03 | 良好(>1.0) |
| Sortino 比率 | 3.88 | 优秀(下行风险控制好) |
| Calmar 比率 | 20,310.16 | 极高(收益远超回撤) |
| 利润因子 | 1.92 | 良好(>1.5) |
| SQN | 2.88 | 良好(>2.0) |
| 胜率 | 28.9%(398 胜 / 977 负) | 偏低但可控 |
| 最大回撤 | 20.58%($2,200,994) | 可控 |
| Expectancy | $14,959 (Ratio: 0.65) | 正期望 ✅ |
| 出场原因 | 笔数 | 占比 | 胜率 | 总盈亏 USDT | 平均持仓 |
|---|---|---|---|---|---|
trailing_stop_loss |
+ 588 | 42.8% | 66.2% | ++38,355,746 | +1天 17:47 | +
stop_loss |
+ 777 | 56.5% | 0% | +-18,159,746 | +6:13 | +
exit_signal |
+ 9 | 0.7% | 88.9% | ++317,061 | +11:20 | +
force_exit |
+ 1 | 0.1% | 100% | ++55,374 | +4:00 | +
| 指标 | 做多 (Long) | 做空 (Short) |
|---|---|---|
| 交易笔数 | 748 | 627 |
| 总利润 USDT | +5,103,388 | +15,465,047 |
| 总利润 % | +51,034% | +154,650% |
| 指标 | 数值 |
|---|---|
| 最佳单笔交易 | +36.09% |
| 最差单笔交易 | -5.41% |
| 最佳交易日 | +$4,499,935.76 |
| 最差交易日 | -$530,721.16 |
| 最大连续盈利 | 6 笔 |
| 最大连续亏损 | 24 笔 |
| 盈利日 / 持平日 / 亏损日 | 370 / 841 / 635 |
| 盈利交易平均持仓 | 2 天 3 小时 9 分 |
| 亏损交易平均持仓 | 9 小时 22 分 |
| 最长盈利持仓 | 9 天 15 小时 |
| 最长亏损持仓 | 2 天 14 小时 |
以下是两个版本在完全相同的回测条件下(2021-01-01 → 2026-06-01, max_open_trades=1, wallet=10000)的表现对比:
+ +| 指标 | v2.2c | v2.2d | 变化 |
|---|---|---|---|
| 交易笔数 | 1,056 | 1,375 | +30.2% |
| 最终资金 | $11,983,254 | $20,578,435 | +71.7% |
| 总回报 | +119,732% | +205,684% | +85,952pp |
| CAGR | 270.15% | 309.01% | +38.86pp |
| Sharpe | 0.82 | 1.03 | +0.21 |
| 利润因子 | 1.97 | 1.92 | -0.05 |
| 最大回撤 | 17.96% | 20.58% | +2.62pp |
| 胜率 | 29.7% | 28.9% | -0.8pp |
| 做多/做空 | 585 / 471 | 748 / 627 | +163 / +156 |
| 版本 | 核心改动 | 结果 | 教训 |
|---|---|---|---|
| v0.x | EMA/ATR 等传统指标 | 已弃用 | 用户要求纯价格行为学 |
| v1.0 | 5M TF, Spot | 噪音太多,持仓 12min | 时间框架太短 |
| v1.1 | 1H TF, Futures | +61.52% | 硬止损亏损太大 |
| v1.2 | Entry Candle 止损 | Bug → 50笔全亏 | return None 回退 25% 止损 |
| v1.3 | ATR 三阶段止损 | -63.72% | ATR 不适合价格行为策略 |
| v1.4 | 纯价格结构止损 | +140.71%, PF=3.78 | 方向正确 ✅ |
| v1.5 | 参数调优 | +140.83% | 持平,参数不敏感 |
| v1.6 | 冷却期 + 活 S/R | 旧最优基线 | 入场质量 > 止损优化 |
| v1.7~v1.9 | 止损优化尝试 | 全部失败 | 任何过滤止损的方法都会误杀盈利 |
| 版本 | 核心改动 | 结果 | 意义 |
|---|---|---|---|
| v2.0 | B1 入场延迟确认 | 方向正确但降频严重 | Trailing 胜率最高 91.7% |
| v2.1 | D1 趋势强度过滤 | ETH 4366% vs v1.6 3659% | 首次全面超越 v1.6 ✅ |
| v2.2b | 参数精调 | 回测 4673% | 部署至服务器 dry-run |
| v2.2c | 1H S/R 替代 4H S/R | 全周期 119,733% | 1H S/R 方向正确,但有冷却期 bug |
| v2.2d | 冷却期修复 | 全周期 205,684% | 🔥 当前最优基线 |
| # | 风险 | 严重度 | 详情 |
|---|---|---|---|
| 1 | +低胜率心理压力 | +🔴 高 | +28.9% 胜率意味着每 3-4 笔就有 2-3 笔止损。最大连续亏损 24 笔。实盘中连续亏损时人性会本能地想要干预——这恰恰会破坏策略的数学优势。 | +
| 2 | +过拟合风险 | +🟡 中 | +策略在 2021-2026 同一样本上迭代了 20+ 个版本。虽然有完整的牛熊覆盖和清晰的逻辑链,但无法排除一定程度的样本内过拟合。 | +
| 3 | +S/R 位移滞后 | +🟡 中 | +动态止损跟随最新 Swing Point 移动,但在快速趋势中,Swing Point 的形成有滞后。可能在 S/R 已经"过期"时仍在使用旧止损位。 | +
| 4 | +震荡市低效 | +🟡 中 | +策略是趋势跟踪策略,在长时间窄幅震荡中交易机会减少,且假突破增多。v3.x 波段策略正在开发中以覆盖这一场景。 | +
| 5 | +活 S/R 窗口敏感 | +🟢 低 | +3 根 1H K 线的活 S/R 窗口对市场节奏敏感。快节奏市场中,S/R 可能在窗口过期前就被突破;慢节奏中,窗口可能太短。但 2026-06-11 14:00 的实盘验证表明当前设置是合理的。 | +
| # | 风险 | 严重度 | 详情 |
|---|---|---|---|
| 1 | +滑点导致回测低估 | +🟡 中 | +回测假设 0.05% 手续费,但未考虑市价单滑点。在 1H 级别中低频策略中滑点影响相对可控,但大资金阶段(>100万)的流动性约束可能显著放大滑点。 | +
| 2 | +服务器故障 | +🟡 中 | +东京服务器(2 vCPU, 2GB RAM, 40GB SSD)运行 freqtrade + Dashboard + Halo + Shadowsocks 等多个服务,资源有限。CPU/内存峰值可能导致策略执行延迟。 | +
| 3 | +API 限流 | +🟢 低 | +Binance API 的 weight 限制(1200/min)。策略日均 0.7 笔交易,API 调用极低频,几乎不可能触及限流。 | +
| # | 方向 | 优先级 | 说明 |
|---|---|---|---|
| 1 | +Out-of-Sample 验证 | +P0 | +使用 2025-2026 年 dry-run 数据(未在优化中使用)验证策略的样本外表现。如果显著差于回测 → 过拟合证据。 | +
| 2 | +实盘滑点数据收集 | +P1 | +记录 dry-run 中每笔订单的实际成交价与信号价的偏差,量化真实滑点成本,修正回测收益预估。 | +
| 3 | +每日监控自动化 | +P1 | +完善 daily_brief.py,增加异常检测(连续亏损超阈值、长期无信号、S/R 异常跳动等),微信主动推送。 | +
| 4 | +多品种验证(BTC) | +P2 | +在 BTC/USDT 上回测 v2.2d,评估策略的跨品种通用性。如果 BTC 表现差 → 可能是 ETH 特有的过拟合。 | +
| # | 方向 | 说明 |
|---|---|---|
| 1 | +市场环境自适应 | +根据当前市场波动率/趋势强度自动调整参数(如 cooling_bars、trend_strength_min),而非使用固定值。牛市放宽冷却期,熊市收紧。 | +
| 2 | +止损结构确认 | +在 custom_stoploss 中增加"结构破坏检测"——不只在 S/R 位止损,还检测 S/R 是否已被有效突破(收盘价穿透 + 下一根确认),提高止损的精准度。 | +
| 3 | +波段策略完善(v3.x) | +完成《区间》阅读后,继续优化 v3.1 波段策略,覆盖趋势策略在震荡市中的交易空白,实现策略组合互补。 | +
| 4 | +多因子评分替代二元过滤 | +将当前的 6 项布尔 AND 条件改为加权评分机制。某些条件在特定市场环境下权重更高,而非一刀切的"全部满足才入场"。 | +
| 参数 | 类型 | 默认值 | 范围 | 空间 |
|---|---|---|---|---|
| swing_lookback_d1 | IntParameter | 10 | 8 ~ 14 | buy |
| swing_lookback_h4 | IntParameter | 8 | 5 ~ 10 | buy |
| swing_lookback_1h | IntParameter | 5 | 3 ~ 7 | buy |
| pin_bar_wick_ratio | IntParameter | 60 | 50 ~ 70 | buy |
| max_stop_dist | IntParameter | 50 | 20 ~ 50 | buy |
| cooldown_bars | IntParameter | 6 | 3 ~ 12 | buy |
| trend_strength_min | IntParameter | -20 | -50 ~ 20 | buy |
{
+ "max_open_trades": 1,
+ "dry_run_wallet": 10000,
+ "stake_amount": "unlimited",
+ "trading_mode": "futures",
+ "margin_mode": "cross",
+ "exchange": "binance",
+ "pair_whitelist": ["ETH/USDT:USDT"],
+ "timeframe": "1h",
+ "timerange": "20210101-20260601",
+ "fee": 0.0005
+}
+
+ 策略源码文件(452 行 Python)位于:
+structure_flow_strategy_v2_2d_local.py~/freqtrade/user_data/strategies/structure_flow_strategy_v2_2d.py源码结构:
+_detect_swing_points() — Swing Point 检测(行 42-57)_build_structure() — 结构分析:趋势 + S/R + 供需区域(行 63-126)_detect_candle_patterns() — K线形态识别(行 132-155)_apply_cooldown() — 冷却期(行 161-184)populate_indicators_1d() — D1 指标(行 190-204)populate_indicators_4h() — 4H 指标(行 210-252)populate_indicators() — 1H 主指标(行 258-324)populate_entry_trend() — 入场信号(行 330-378)populate_exit_trend() — 出场信号(行 384-391)custom_stoploss() — 动态止损(行 397-426)plot_config() — 可视化配置(行 432-451)| 术语 | 英文 | 解释 |
|---|---|---|
| Swing Point | Swing Point | 摆动点:局部价格极值。Swing High = 比左右各 N 根 K 线都高的高点;Swing Low 同理。 |
| S/R | Support / Resistance | 支撑/阻力:最近一个 Swing Low 为支撑,最近一个 Swing High 为阻力。 |
| Demand Zone | Demand Zone | 需求区:价格在 S/R 区间的下 35% 区域,买方力量聚集。 |
| Supply Zone | Supply Zone | 供给区:价格在 S/R 区间的上 35%(即 65%~100%),卖方力量聚集。 |
| 活 S/R | Alive S/R | 在最近 3 根 K 线内被测试过并且守住的支撑/阻力。3 根窗口基于 rolling(3).max()。 |
| Pin Bar | Pin Bar | 影线极长、实体极短的单 K 线形态。影线占比 > 60% 阈值。 |
| 吞没形态 | Engulfing | 当前 K 线完全吞没前一根 K 线的两 K 线组合反转信号。 |
| 冷却期 | Cooldown | 入场后禁止再次入场的 K 线数量。v2.2d 基于实际入场事件实现。 |
| 趋势强度 | Trend Strength | 4H 级别最近两个 Swing Point 的间距变化率之和,衡量趋势的"力道"。 |
| 追踪止损 | Trailing Stop Loss | 随 1H S/R 位动态移动的止损。支撑上移 → 做多止损上移,实现利润保护。 |
| CAGR | Compound Annual Growth Rate | 年化复合增长率。v2.2d 为 309.01%。 |
| Sharpe 比率 | Sharpe Ratio | 风险调整后收益。>1.0 为良好,v2.2d 为 1.03。 |
| SQN | System Quality Number | 系统质量指数。>2.0 为良好,v2.2d 为 2.88。 |
| Expectancy | Expectancy | 每笔交易的期望利润。v2.2d 为 $14,959(Ratio 0.65)。 |
— Structure Flow Strategy v2.2d 完整说明书 · 终 —
+2026年6月11日 · FXY · 东京服务器 dry-run 运行中
+