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 — 完整策略说明书 + + + + + + + +
+
+
STRATEGY MANUAL
+

Structure Flow Strategy
v2.2d

+

ETH/USDT 永续合约 · 中低频价格行为趋势跟踪

+
+
+ 作者:FXY
+ 版本:v2.2d(冷却期修复版)
+ 日期:2026年6月11日
+ 引擎:Freqtrade 2026.2 + Binance Futures
+ 品种:ETH/USDT:USDT · 时间框架:1H · 杠杆:1x +
+
+
+ + + + +
+

目 录

+
    +
  1. 策略总览与设计哲学
  2. +
  3. 1.1 策略定位
  4. +
  5. 1.2 设计哲学:纯价格行为学
  6. +
  7. 1.3 第一性原理
  8. +
  9. 系统架构与数据流
  10. +
  11. 2.1 多时间框架架构
  12. +
  13. 2.2 数据处理流程
  14. +
  15. 2.3 参数一览
  16. +
  17. 核心组件:价格结构识别
  18. +
  19. 3.1 Swing Point 检测算法
  20. +
  21. 3.2 结构分析:趋势判断与 S/R 定位
  22. +
  23. 3.3 供需区域划分
  24. +
  25. 核心组件:K线形态识别
  26. +
  27. 4.1 Pin Bar 检测
  28. +
  29. 4.2 吞没形态检测
  30. +
  31. 4.3 形态在策略中的角色
  32. +
  33. 入场条件详解
  34. +
  35. 5.1 做多入场(6项条件)
  36. +
  37. 5.2 做空入场(6项条件)
  38. +
  39. 5.3 入场决策流程图
  40. +
  41. 冷却期机制:v2.2c → v2.2d 关键修复
  42. +
  43. 6.1 v2.2c 的致命 Bug
  44. +
  45. 6.2 v2.2d 修复方案
  46. +
  47. 6.3 修复效果对比
  48. +
  49. 出场逻辑
  50. +
  51. 7.1 结构出场信号
  52. +
  53. 7.2 动态止损(Custom Stoploss)
  54. +
  55. 7.3 出场逻辑完整流程
  56. +
  57. 风险管理
  58. +
  59. 8.1 硬止损上限
  60. +
  61. 8.2 仓位控制
  62. +
  63. 8.3 最大回撤分析
  64. +
  65. 回测结果完整分析
  66. +
  67. 9.1 核心指标摘要
  68. +
  69. 9.2 出场原因分布
  70. +
  71. 9.3 多空表现对比
  72. +
  73. 9.4 盈亏分布特征
  74. +
  75. 9.5 v2.2c vs v2.2d 对比
  76. +
  77. 策略演进史
  78. +
  79. 10.1 v1.x 时代:试错与奠基
  80. +
  81. 10.2 v2.x 时代:突破与优化
  82. +
  83. 10.3 关键教训总结
  84. +
  85. 十一 已知隐患与风险评估
  86. +
  87. 11.1 策略层面风险
  88. +
  89. 11.2 执行层面风险
  90. +
  91. 11.3 外部不可控风险
  92. +
  93. 十二 下一步优化方向
  94. +
  95. 12.1 短期优化(1-3个月)
  96. +
  97. 12.2 中期优化(3-12个月)
  98. +
  99. 12.3 长期愿景
  100. +
  101. 附录
  102. +
  103. 附录A:完整参数表
  104. +
  105. 附录B:回测环境配置
  106. +
  107. 附录C:策略完整源码
  108. +
  109. 附录D:术语表
  110. +
+
+ + + + +
+

第一章策略总览与设计哲学

+ +

1.1 策略定位

+ +

Structure Flow Strategy v2.2d 是一套基于纯价格行为学(Price Action)的 ETH/USDT 永续合约中低频趋势跟踪策略。策略运行于 1 小时时间框架,辅以 4 小时和日线级别的宏观结构分析,日均交易 0.7 笔,持仓周期约 21.5 小时。

+ +
+
2057x
总回报倍数
+
309%
年化 CAGR
+
1.03
Sharpe 比率
+
1,375
总交易笔数
+
28.9%
胜率
+
20.58%
最大回撤
+
+
回测区间:2021-01-01 至 2026-06-01(约5.5年)· 初始资金 $10,000 · 最终资金 $20,578,435
+ +
+ 核心定位一句话:在日线趋势方向上的 1H 支撑/阻力位,等待价格结构确认后入场,通过动态追踪止损让利润奔跑,同时在结构破坏时果断止损。 +
+ +

1.2 设计哲学:纯价格行为学

+ +

v2.2d 不依赖任何传统技术指标——没有 EMA、没有 MACD、没有 RSI、没有布林带。策略的"眼睛"只有三个东西:

+ +
    +
  1. Swing Points(摆动高低点)——市场留下的足迹,多空博弈的历史胜负记录
  2. +
  3. Support / Resistance(支撑 / 阻力)——最近的有效 Swing Point,买卖双方曾在此达成共识的位置
  4. +
  5. Candle Patterns(K 线形态)——Pin Bar(锤子线/流星线)和 Engulfing(吞没形态),当前博弈的实时裁判
  6. +
+ +
+ 为什么纯价格行为学?

+ 所有技术指标都是价格的衍生品。EMA 是价格的滞后平均,RSI 是价格的归一化处理。当市场微观结构发生变化——波动率变了、流动性结构变了、参与者构成变了——EMA 和 RSI 的最佳参数也跟着变了。但一根 Pin Bar 还是一根 Pin Bar,一个假突破还是一个假突破。

+ 因为底层是人性的贪婪和恐惧,而人性在可预见的未来不会改变。 +
+ +

1.3 第一性原理

+ +

v2.2d 的逻辑可以拆解为四个第一性原理:

+ + + + + + + + + + + + + + + + + + + + + + + +
原理表述在策略中的映射
顺势而为趋势是你的朋友。反转大部分失败,顺势交易的概率优势是压倒性的。D1 趋势向上才做多,D1 趋势向下才做空。4H 趋势强度确认。
S/R 位入场支撑和阻力是市场记忆的锚点。价格在这些位置的反应提供了低风险的入场时机。供需区域(Demand/Supply Zone)+ 活支撑/阻力(Alive S/R)双重过滤。
让利润奔跑交易的利润不来自胜率,而来自少数大赢家。截断亏损容易,让利润奔跑难。动态追踪止损(Trailing Stop Loss)。亏损单平均持仓 9 小时,盈利单平均持仓 2 天 3 小时。
纪律优于预测不要试图预测下一根 K 线。策略的工作是"如果 A 则 B",不是"我认为会涨"。6 项入场条件全部为布尔值,无模糊判断。冷却期防止情绪化追单。
+
+ + + + +
+

第二章系统架构与数据流

+ +

2.1 多时间框架架构

+ +

v2.2d 采用三层时间框架结构,自上而下形成"宏观定方向 → 中观定趋势 → 微观定入场"的决策链条:

+ +
+ + + + + + + + + D1 日线 + Swing Point 检测(lookback=10)→ 趋势方向判定(trend_up / trend_down) + @informative("1d") + + + + + + + + 4H 四小时 + Swing Point 检测(lookback=8)→ 趋势强度 quantile → strong_uptrend / strong_downtrend + @informative("4h") + + + + + + + 1H 一小时 · 主时间框架 + Swing Point(lookback=5)→ S/R 结构 + 供需区域 + K线形态 + 活S/R + 入场信号生成 + populate_indicators() + +
图 2-1:v2.2d 三层时间框架架构。D1 定方向,4H 算强度,1H 做执行。
+
+ +

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 线形态识别、活支撑/阻力判定、入场信号生成和冷却期应用。

+ +

2.2 数据处理流程

+ +
+ + + 原始 OHLCV + + + + + + populate_indicators_1d + Swing + 趋势方向 + + + populate_indicators_4h + Swing + 趋势强度 + + + + + + + + populate_indicators (1H 主框架) + Swing(1H) → S/R结构 → 供需区域 → K线形态 → 活S/R + + + + + populate_entry_trend + 6项条件 + 冷却期 + + + populate_exit_trend + D1结构出场 + + + + + + Freqtrade 回测/实盘引擎 + 订单执行 · custom_stoploss · 资金管理 + + + + + 交易执行 & 盈亏记录 + +
图 2-2:v2.2d 数据处理流程。D1 和 4H 作为信息时间框架并行计算,1H 主框架汇总后生成信号。
+
+ +

2.3 参数一览

+ + + + + + + + + + +
参数名默认值可调范围说明
swing_lookback_d1108 ~ 14D1 Swing Point 检测窗口。越大越滞后,越小越敏感。
swing_lookback_h485 ~ 104H Swing Point 检测窗口。用于趋势强度计算。
swing_lookback_1h53 ~ 71H Swing Point 检测窗口。直接决定 S/R 位置。
pin_bar_wick_ratio60%50 ~ 70%Pin Bar 识别阈值。影线占比需 > 此值。
max_stop_dist50%20 ~ 50%入场时价格与 S/R 的最大距离(%)。限制止损成本。
cooldown_bars63 ~ 12入场后冷却 K 线数。防止连续追单。
trend_strength_min-20%-50 ~ +20%4H 趋势强度最低阈值。负值=允许弱趋势入场。
+ +
+ 参数设计原则:7 个可调参数全部是 IntParameter(整数),在回测中可通过 Hyperopt 自动优化。trend_strength_min 设为 -20% 意味着策略在非常宽松的条件下也允许入场——历史回测表明,过度收紧此参数会误杀大量盈利交易。 +
+
+ + + + +
+

第三章核心组件:价格结构识别

+ +

3.1 Swing Point 检测算法

+ +

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
+ +
+ 算法特性:
+ ① 使用 严格大于/小于,不包含等于——只有真正的极值点才会被标记。
+ ② 左右对称窗口——确保了"现在"不会偏见地偏向任何一侧。
+ ③ 非 Swing Point 位置填 NaN——后续结构分析中逐 K 线遍历时通过 pd.notna() 判断。 +
+ +
+ + + + + + SH + + SH + + + SL + + SL + + SL + + + window=5 检测窗口 + + + +
图 3-1:Swing Point 检测示意。红色圆= Swing High,绿色圆= Swing Low。虚线框为 window=5 的检测范围。
+
+ +

3.2 结构分析:趋势判断与 S/R 定位

+ +

_build_structure() 是策略最核心的函数。它逐 K 线遍历,维护最近 4 个 Swing High 和 Swing Low 的列表,并实时判断:

+ +
    +
  1. 趋势方向(Trend Up / Trend Down):如果最近两个 Swing High 依次抬高 最近两个 Swing Low 依次抬高 → 上升趋势。反之则下降趋势。两者都不满足时,继承上一根 K 线的趋势判断。
  2. +
  3. 支撑/阻力位:最近一个 Swing Low 的价格 = 支撑位(Support),最近一个 Swing High 的价格 = 阻力位(Resistance)。
  4. +
  5. 供需区域:在支撑和阻力之间,计算当前价格的位置百分比。百分比 < 35% 为需求区(Demand Zone),百分比 > 65% 为供给区(Supply Zone)。
  6. +
+ +
+ 趋势继承原则:当 Swing Point 不足时(比如策略启动初期或长时间无新高/新低),趋势判断不会变成"无趋势"或"未知"——它会继承上一根 K 线的判断。这确保了策略不会在数据不足时"失明",而是保守地保持上一状态。 +
+ +

3.3 供需区域划分

+ +
+ + + + + + + Resistance = 最近 SH + + + + 供给区 Supply Zone (65%~100%) + 做空入场区域 + + + + 中间区域 (35%~65%) — 不交易 + + + + 需求区 Demand Zone (0%~35%) + 做多入场区域 + + + + Support = 最近 SL + + + 价格 + + +
图 3-2:供需区域划分。当价格处于最近支撑和阻力之间的下 35% 区域时触发做多条件,上 35%(即 65%~100%)时触发做空条件。中间区域不交易。
+
+ +

3.4 活支撑/阻力(Support/Resistance Alive)

+ +

这是策略中最精妙的条件之一。仅仅"存在"支撑/阻力是不够的——策略要求这个 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
+ +
+ 为什么需要这个条件? 一个 50 根 K 线前形成的支撑位,市场可能已经完全忘记它了。但如果价格在最近 3 小时内刚刚测试过这个位置并守住了——那它是"活的",市场参与者确实在参考它。

+ 2026-06-11 14:00 实盘验证:1H Swing High 在 1661(11:00 K线),之后价格接近但未重新测试。到 14:00 时窗口过期(3根K线),resistance_alive 从 True 变 False,策略正确拒单。说明这个条件在实战中确实在履行"最后一道关"的职责。 +
+
+ + + + +
+

第四章核心组件:K线形态识别

+ +

4.1 Pin Bar 检测

+ +

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)
+ +
+ + + 看涨 Pin Bar + + + 影线 70% + + + 看跌 Pin Bar + + + 影线 70% + +
图 4-1:Pin Bar 形态示意。左为看涨(长下影+阳线),右为看跌(长上影+阴线)。
+
+ +

4.2 吞没形态检测

+ +

吞没形态(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)
+)
+ +

4.3 形态在策略中的角色

+ +

在 v2.2d 中,K 线形态虽然在代码中被计算(bullish_pinbarbearish_pinbarbullish_engulfingbearish_engulfing),但在当前的入场条件中并未被直接使用。策略选择用供需区域 + 活 S/R 替代了 K 线形态确认。

+ +
+ 为什么没用到? 在 v2.2c → v2.2d 的演进中,入场条件经历了多次精简。K 线形态曾在前代版本中被使用,但回测发现:供需区域这个条件本身就足够强大——当价格已经处于需求区且支撑位是活的时,额外的形态过滤只会降低入场频率而不显著提升胜率。

+ 形态检测代码保留在策略中用于 plot_config 可视化,方便实盘监控时观察。 +
+
+ + + + +
+

第五章入场条件详解

+ +

5.1 做多入场(6项条件)

+ +

所有 6 项条件必须同时满足,策略才会发出做多信号:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
#条件代码变量逻辑
1D1 上升趋势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 线内价格曾测试支撑并收盘在其上方。证明市场"记得"这个位置。
54H 强势上升strong_uptrend_4h4H 级别趋势强度 > -20%。中观级别确认趋势有效性,过滤假突破。
6冷却期已过_apply_cooldown()距离上次入场已超过 6 根 K 线(默认)。防止连续追单和过度交易。
+ +

5.2 做空入场(6项条件)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
#条件代码变量逻辑
1D1 下降趋势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 线内价格曾测试阻力并收盘在其下方。
54H 强势下降strong_downtrend_4h4H 级别下降趋势强度 > -20%。
6冷却期已过_apply_cooldown()距离上次入场已超过 6 根 K 线。
+ +
+ 止损距离下限 0.3%:这个微小的门槛有一个重要功能——防止在 S/R 位"紧贴"价格时入场。如果入场价距离支撑/阻力只有 0.3% 以内,说明价格几乎就在 S/R 位上,一根正常的 K 线波动就能穿透它。这个门槛确保了每笔交易都有"呼吸空间"。 +
+ +

5.3 入场决策流程图

+ +
+ + + 每根 1H K 线 + + + + + + + D1趋势方向? + + + 上升 + + + + 做多路径 + + + + + in_demand ? + + + Y + + + stop_dist OK? + + + + + support_alive? + + + + + 4H strong? + + + + + 冷却期已过? + + + + + ✅ ENTER LONG + + + + 下降 + + + 做空路径 + + ... 对称的 6 项检查 + + + + + ✅ ENTER SHORT + + + + 无/震荡 + + 空仓等待 + +
图 5-1:入场决策流程。D1 趋势方向决定做多/做空路径,随后依次检查 6 项条件。任何一项不满足即空仓。
+
+
+ + + + +
+

第六章冷却期机制:v2.2c → v2.2d 关键修复

+ +

6.1 v2.2c 的致命 Bug

+ +

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 线中是否实际入场了"。

+ +
+ 致命场景:市场持续满足入场条件(例如 ETH 在强下降趋势中持续位于供给区,阻力位反复测试有效),那么 rolling(6).max() 永远为 True,冷却期永远不解除。

+ 结果:策略在应该连续入场(每 6 根 K 线一次)的市场中完全停止交易。这在回测中表现为交易次数偏少(1056 vs 1375,少了 30%)。 +
+ +

6.2 v2.2d 修复方案

+ +

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)
+ +
+ 修复逻辑:
+ ① 逐 K 线遍历,模拟"入场 → 冷却"过程。
+ ② 当条件满足 距离上次入场 > cooldown_bars → 允许入场。
+ ③ 入场后更新 last_entry,接下来 cooldown_bars 根 K 线内即使条件满足也不会再次入场。
+ ④ 条件不满足的 K 线不消耗冷却期——冷却期只在入场后有效。

+ 时间复杂度 O(n),对 ~47,000 根 1H K 线约几毫秒,不影响回测性能。 +
+ +

6.3 修复效果对比

+ + + + + + + + + + +
指标v2.2c (Bug)v2.2d (修复)变化
交易笔数1,0561,375+319 (+30%)
最终资金$11,983,254$20,578,435+71.7%
CAGR270.15%309.01%+38.86pp
Sharpe0.821.03+0.21
最大回撤17.96%20.58%+2.62pp
利润因子1.971.92-0.05
胜率29.7%28.9%-0.8pp
+ +
+ 关键洞察:修复冷却期后,策略多了 319 笔交易,胜率微降 0.8pp,但最终资金增加了 71.7%。这说明 v2.2c 被冷却期 bug 阻止的那 319 笔交易中,包含了大量盈利机会。冷却期修复让策略"该赚的钱都赚到了",Sharpe 从 0.82 跃升至 1.03——首次突破 1.0 门槛。 +
+
+ + + + +
+

第七章出场逻辑

+ +

7.1 结构出场信号

+ +

v2.2d 使用 D1 级别的趋势反转作为结构出场信号:

+ +
# 做多出场:D1 不再上升
+exit_long = ~dataframe["trend_up_1d"].fillna(True)
+
+# 做空出场:D1 转为上升
+exit_short = dataframe["trend_up_1d"].fillna(False)
+ +

逻辑非常简洁:D1 结构破坏 = 离场。做多时如果日线趋势从上升转为非上升,立即出场。做空时如果日线趋势转为上升,立即出场。

+ +
+ 回测数据:在 1375 笔交易中,仅有 9 笔通过 exit_signal 出场(88.9% 胜率),说明绝大多数交易是被动态止损管理而非 D1 结构出场信号终止的。 +
+ +

7.2 动态止损(Custom Stoploss)

+ +

这是策略真正的核心出场机制。止损位置动态绑定到 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%
+ +
+ 动态止损的三重智慧:
+ ① S/R 绑定:止损不固定在入场价的某个百分比,而是跟随 1H 级别的支撑/阻力位。当新的 Swing Low 形成时,支撑位上移,止损自动收紧——这就是策略的"移动止损"能力。
+ ② 0.1% 缓冲:止损设在支撑下方 0.1%(阻力上方 0.1%),给价格一个"假突破"的容忍空间。
+ ③ ±15% 硬上限:防止极端行情下止损距离失控。在最坏情况下,单笔亏损不超过 15%。 +
+ +

7.3 出场逻辑完整流程

+ +

每根 1H K 线收盘时,策略按以下优先级检查出场:

+ +
    +
  1. D1 结构出场:D1 趋势方向反转 → 无条件离场
  2. +
  3. 动态止损:当前价格触及 S/R 外侧 0.1% 缓冲 → 触发止损
  4. +
  5. 硬止损:亏损达到 15% → 无条件离场(极少触发,因为动态止损通常在更早位置就已经激活)
  6. +
+ +
+
588
追踪止损出场
+
777
止损出场
+
9
结构出场
+
66.2%
追踪止损胜率
+
0%
止损胜率
+
88.9%
结构出场胜率
+
+ +

出场逻辑的核心统计数据:

+ + +
+ "让利润奔跑"的数学证据:盈利交易的平均持仓是亏损交易的 5.4 倍。这正是策略的核心竞争力——不是预测对的多,而是在对的时候拿得住。 +
+
+ + + + +
+

第八章风险管理

+ +

8.1 硬止损上限

+ +

策略设置了 stoploss = -0.15(15%)作为全局硬止损。但在实际运行中,这个硬止损几乎不会被触发,因为 custom_stoploss 的动态 S/R 止损通常在较小的亏损幅度就已经激活。硬止损的存在是安全网——防止 custom_stoploss 在极端行情下返回异常值。

+ +

8.2 仓位控制

+ + + + + + + +
参数含义
max_open_trades1同一时间最多持有 1 笔仓位
stake_amountunlimited每笔交易使用全部可用资金(全仓)
杠杆1x不使用杠杆
保证金模式Cross(全仓)所有仓位共享保证金池
+ +
+ 1x 杠杆 + 全仓 = 无爆仓风险。这不仅是一个仓位决策,更是一个哲学选择——"为而不恃"(不依赖外部力量放大结果)。回测已经证明,在 1x 杠杆下策略可以实现 2057 倍回报。杠杆不是必需品,而是资金利用效率工具。在当前阶段,无杠杆运行消除了最致命的风险源。 +
+ +

8.3 最大回撤分析

+ +

回测显示的最大回撤为 20.58%(约 $2,200,994),发生在 2026-05-05 至 2026-05-23,持续 17 天 15 小时。回撤起点资金 $22,490,086,终点 $20,279,092。

+ +

需要注意:

+ + +
+ ⚠️ 实盘回撤可能更大:回测中的最大回撤 20.58% 是在完美执行下的结果。实盘中滑点、执行延迟、心理干扰等因素可能将回撤放大至 30-40%。策略使用者必须做好在某个阶段看到账户缩水 30%+ 的心理准备。 +
+
+ + + + +
+

第九章回测结果完整分析

+ +

9.1 核心指标摘要

+ + + + + + + + + + + + + + + + + + +
指标数值评级
回测区间2021-01-01 → 2026-06-01(1,977 天)覆盖完整牛熊周期 ✅
交易模式Cross Futures(合约)
交易笔数1,375(日均 0.7 笔)中低频 ✅
初始资金$10,000
最终资金$20,578,435.93
总回报率+205,684.36%(2057倍)🏆 卓越
CAGR309.01%🏆 卓越
Sharpe 比率1.03良好(>1.0)
Sortino 比率3.88优秀(下行风险控制好)
Calmar 比率20,310.16极高(收益远超回撤)
利润因子1.92良好(>1.5)
SQN2.88良好(>2.0)
胜率28.9%(398 胜 / 977 负)偏低但可控
最大回撤20.58%($2,200,994)可控
Expectancy$14,959 (Ratio: 0.65)正期望 ✅
+ +

9.2 出场原因分布

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
出场原因笔数占比胜率总盈亏 USDT平均持仓
trailing_stop_loss58842.8%66.2%+38,355,7461天 17:47
stop_loss77756.5%0%-18,159,7466:13
exit_signal90.7%88.9%+317,06111:20
force_exit10.1%100%+55,3744:00
+ +
+ 关键解读:
+ • 56.5% 的交易以止损结束——这是 28.9% 胜率的另一面
+ • 但 42.8% 的追踪止损出场贡献了 正 3836 万 的利润,远超止损的 1816 万亏损
+ • 追踪止损出场的平均利润为 +2.6%,止损出场的平均亏损为 -0.89%,盈亏比约 2.92:1 +
+ +

9.3 多空表现对比

+ + + + + + +
指标做多 (Long)做空 (Short)
交易笔数748627
总利润 USDT+5,103,388+15,465,047
总利润 %+51,034%+154,650%
+ +
+ 做空贡献了 75% 的总利润。这在直觉上可能令人意外(ETH 在 2021-2026 整体上涨 174%),但仔细分析就合理了:
+ ① 上涨趋势中间的回调做空 + 2022 年熊市做空 = 大量做空利润
+ ② 合约的双向交易能力让策略在下跌中也能大幅盈利
+ ③ 做空利润 15.4M vs 做多 5.1M,说明策略在下跌行情中尤其高效 +
+ +

9.4 盈亏分布特征

+ + + + + + + + + + + + + + +
指标数值
最佳单笔交易+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 小时
+ +

9.5 v2.2c vs v2.2d 对比

+ +

以下是两个版本在完全相同的回测条件下(2021-01-01 → 2026-06-01, max_open_trades=1, wallet=10000)的表现对比:

+ + + + + + + + + + + + +
指标v2.2cv2.2d变化
交易笔数1,0561,375+30.2%
最终资金$11,983,254$20,578,435+71.7%
总回报+119,732%+205,684%+85,952pp
CAGR270.15%309.01%+38.86pp
Sharpe0.821.03+0.21
利润因子1.971.92-0.05
最大回撤17.96%20.58%+2.62pp
胜率29.7%28.9%-0.8pp
做多/做空585 / 471748 / 627+163 / +156
+ +
+ 结论:v2.2d 在所有关键指标上全面优于 v2.2c。唯一增加的代价是回撤从 17.96% 升至 20.58%(+2.62pp),这是交易频率增加后的自然结果。Sharpe 比率突破 1.0 是策略成熟度的重要里程碑。 +
+
+ + + + +
+

第十章策略演进史

+ +

10.1 v1.x 时代:试错与奠基

+ + + + + + + + + + + + +
版本核心改动结果教训
v0.xEMA/ATR 等传统指标已弃用用户要求纯价格行为学
v1.05M TF, Spot噪音太多,持仓 12min时间框架太短
v1.11H TF, Futures+61.52%硬止损亏损太大
v1.2Entry Candle 止损Bug → 50笔全亏return None 回退 25% 止损
v1.3ATR 三阶段止损-63.72%ATR 不适合价格行为策略
v1.4纯价格结构止损+140.71%, PF=3.78方向正确 ✅
v1.5参数调优+140.83%持平,参数不敏感
v1.6冷却期 + 活 S/R旧最优基线入场质量 > 止损优化
v1.7~v1.9止损优化尝试全部失败任何过滤止损的方法都会误杀盈利
+ +

10.2 v2.x 时代:突破与优化

+ + + + + + + + +
版本核心改动结果意义
v2.0B1 入场延迟确认方向正确但降频严重Trailing 胜率最高 91.7%
v2.1D1 趋势强度过滤ETH 4366% vs v1.6 3659%首次全面超越 v1.6 ✅
v2.2b参数精调回测 4673%部署至服务器 dry-run
v2.2c1H S/R 替代 4H S/R全周期 119,733%1H S/R 方向正确,但有冷却期 bug
v2.2d冷却期修复全周期 205,684%🔥 当前最优基线
+ +

10.3 关键教训总结

+ +
    +
  1. 纯价格行为学 > 指标策略:v0.x 的全部弃用已经证明了这一点。价格结构是最简单、最可解释、最普适的信号源。
  2. +
  3. 入场质量 > 止损优化:v1.7~v1.9 连续三次止损优化全部失败。策略的核心竞争力不来自"亏得少",而来自"赚得多"。
  4. +
  5. 简单二元过滤器容易误杀:H4 趋势过滤器减 8 笔止损但误杀 23 笔盈利单。教训:不要在入场端叠加过多过滤器。
  6. +
  7. 冷却期必须基于实际入场:v2.2c 的 bug 是教科书级的反面案例——用条件满足来模拟入场事件,在市场持续满足条件时导致策略"假死"。
  8. +
  9. 回测是唯一真理:每个假设都必须在回测中验证。直觉再好,数据不支持的改动就是错的。
  10. +
+
+ + + + +
+

第十一章已知隐患与风险评估

+ +

11.1 策略层面风险

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#风险严重度详情
1低胜率心理压力🔴 高28.9% 胜率意味着每 3-4 笔就有 2-3 笔止损。最大连续亏损 24 笔。实盘中连续亏损时人性会本能地想要干预——这恰恰会破坏策略的数学优势。
2过拟合风险🟡 中策略在 2021-2026 同一样本上迭代了 20+ 个版本。虽然有完整的牛熊覆盖和清晰的逻辑链,但无法排除一定程度的样本内过拟合。
3S/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 的实盘验证表明当前设置是合理的。
+ +

11.2 执行层面风险

+ + + + + + + + + + + + + + + + + + + + + +
#风险严重度详情
1滑点导致回测低估🟡 中回测假设 0.05% 手续费,但未考虑市价单滑点。在 1H 级别中低频策略中滑点影响相对可控,但大资金阶段(>100万)的流动性约束可能显著放大滑点。
2服务器故障🟡 中东京服务器(2 vCPU, 2GB RAM, 40GB SSD)运行 freqtrade + Dashboard + Halo + Shadowsocks 等多个服务,资源有限。CPU/内存峰值可能导致策略执行延迟。
3API 限流🟢 低Binance API 的 weight 限制(1200/min)。策略日均 0.7 笔交易,API 调用极低频,几乎不可能触及限流。
+ +

11.3 外部不可控风险

+ + +
+ + + + +
+

第十二章下一步优化方向

+ +

12.1 短期优化(1-3个月)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
#方向优先级说明
1Out-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 特有的过拟合。
+ +

12.2 中期优化(3-12个月)

+ + + + + + + + + + + + + + + + + + + + + + + +
#方向说明
1市场环境自适应根据当前市场波动率/趋势强度自动调整参数(如 cooling_bars、trend_strength_min),而非使用固定值。牛市放宽冷却期,熊市收紧。
2止损结构确认在 custom_stoploss 中增加"结构破坏检测"——不只在 S/R 位止损,还检测 S/R 是否已被有效突破(收盘价穿透 + 下一根确认),提高止损的精准度。
3波段策略完善(v3.x)完成《区间》阅读后,继续优化 v3.1 波段策略,覆盖趋势策略在震荡市中的交易空白,实现策略组合互补。
4多因子评分替代二元过滤将当前的 6 项布尔 AND 条件改为加权评分机制。某些条件在特定市场环境下权重更高,而非一刀切的"全部满足才入场"。
+ +

12.3 长期愿景

+ + + +
+ ⚠️ 优化铁律:v3.2 的教训历历在目——多一层过滤就多一层误伤。所有优化必须经过严格的 A/B 回测对比,绝不做"我觉得这个方向应该有用"的改动。控制变量,一次只改一项,回测结果说话。 +
+
+ + + + +
+

附录

+ +

附录A:完整参数表

+ + + + + + + + + + +
参数类型默认值范围空间
swing_lookback_d1IntParameter108 ~ 14buy
swing_lookback_h4IntParameter85 ~ 10buy
swing_lookback_1hIntParameter53 ~ 7buy
pin_bar_wick_ratioIntParameter6050 ~ 70buy
max_stop_distIntParameter5020 ~ 50buy
cooldown_barsIntParameter63 ~ 12buy
trend_strength_minIntParameter-20-50 ~ 20buy
+ +

附录B:回测环境配置

+ +
{
+  "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
+}
+ +

附录C:策略完整源码

+ +

策略源码文件(452 行 Python)位于:

+ + +

源码结构:

+ + +

附录D:术语表

+ + + + + + + + + + + + + + + + + +
术语英文解释
Swing PointSwing Point摆动点:局部价格极值。Swing High = 比左右各 N 根 K 线都高的高点;Swing Low 同理。
S/RSupport / Resistance支撑/阻力:最近一个 Swing Low 为支撑,最近一个 Swing High 为阻力。
Demand ZoneDemand Zone需求区:价格在 S/R 区间的下 35% 区域,买方力量聚集。
Supply ZoneSupply Zone供给区:价格在 S/R 区间的上 35%(即 65%~100%),卖方力量聚集。
活 S/RAlive S/R在最近 3 根 K 线内被测试过并且守住的支撑/阻力。3 根窗口基于 rolling(3).max()。
Pin BarPin Bar影线极长、实体极短的单 K 线形态。影线占比 > 60% 阈值。
吞没形态Engulfing当前 K 线完全吞没前一根 K 线的两 K 线组合反转信号。
冷却期Cooldown入场后禁止再次入场的 K 线数量。v2.2d 基于实际入场事件实现。
趋势强度Trend Strength4H 级别最近两个 Swing Point 的间距变化率之和,衡量趋势的"力道"。
追踪止损Trailing Stop Loss随 1H S/R 位动态移动的止损。支撑上移 → 做多止损上移,实现利润保护。
CAGRCompound Annual Growth Rate年化复合增长率。v2.2d 为 309.01%。
Sharpe 比率Sharpe Ratio风险调整后收益。>1.0 为良好,v2.2d 为 1.03。
SQNSystem Quality Number系统质量指数。>2.0 为良好,v2.2d 为 2.88。
ExpectancyExpectancy每笔交易的期望利润。v2.2d 为 $14,959(Ratio 0.65)。
+ +
+ +
+

— Structure Flow Strategy v2.2d 完整说明书 · 终 —

+

2026年6月11日 · FXY · 东京服务器 dry-run 运行中

+
+
+ + + diff --git a/docs/v2_2d_strategy_manual.pdf b/docs/v2_2d_strategy_manual.pdf new file mode 100644 index 0000000..8ef8f76 Binary files /dev/null and b/docs/v2_2d_strategy_manual.pdf differ