Files
beast-trader-strategies/docs/strategy-v2.1-whitepaper.md

25 KiB
Raw Permalink Blame History

Structure Flow Strategy v2.1 — 策略白皮书

版本: v2.1 | 日期: 2026-06-08 | 状态: 生产 dry-run

本文档面向策略使用者本人,用于深入理解策略逻辑、回测表现和设计思路。


目录

  1. 策略概览
  2. 理论基础
  3. 时间框架架构
  4. 核心技术Swing Point 检测
  5. 结构分析:趋势与支撑阻力
  6. K线形态入场触发器
  7. 入场逻辑详解
  8. 止损逻辑
  9. 出场逻辑
  10. v2.1 核心创新:趋势强度过滤
  11. 参数说明
  12. 回测表现
  13. 演进历史
  14. 已知局限
  15. 部署信息

1. 策略概览

项目
策略名称 StructureFlowStrategyV21
策略类型 中低频趋势跟踪(价格行为学)
品种 ETH/USDT 永续合约 (Binance Futures)
杠杆 1x不上杠杆
主时间框架 1H
辅助时间框架 4H, 1D
持仓周期 数小时 ~ 数天
日均交易 0.1 ~ 0.15 笔
交易方向 多空双向
入场依据 顺势 + S/R位 + K线反转信号
止损方式 基于价格结构的动态追踪止损
出场方式 D1趋势反转 + trailing stop

核心理念

反转大多失败。在趋势中,于支撑/阻力位顺势入场,用追踪止损让利润奔跑。

策略不预测市场方向,只做一件事:在明确的趋势中,等待价格回到关键 S/R 位,确认反转信号后入场,然后用结构止损保护仓位,让趋势把利润带走。


2. 理论基础

2.1 价格行为学Price Action

策略的核心框架来自经典价格行为学,尤其是 Dow Theory 和 Wyckoff 方法:

  • 市场结构Market Structure:通过 HH/HLHigher High / Higher Low和 LH/LLLower High / Lower Low判断趋势方向
  • Swing Point:局部极值点,构成结构的"骨架"
  • 支撑/阻力S/RSwing Point 形成的价格水平,是市场参与者集体记忆的位置
  • 价格区域Demand/Supply ZoneS/R 附近的区域,而非精确价位

2.2 为什么不用指标

策略刻意不使用任何技术指标EMA、MACD、RSI、ATR 等),原因:

  1. 指标是价格的衍生品——滞后于价格本身
  2. 指标参数需要调优——容易过拟合
  3. 价格结构是本源信息——HH/HL/LH/LL 直接告诉你市场在做什么
  4. 指标在不同市场环境表现不一致——牛市有效的参数熊市失效

唯一的例外是 K线形态Pin Bar、Engulfing它们本质上是价格行为的可视化表达不是衍生计算。

2.3 多时间框架分析

自上而下的分析框架:

D1 (日线)  →  判断宏观趋势方向
4H (4小时) →  定位中期 S/R 位 + 评估趋势强度
1H (1小时) →  寻找入场信号K线形态 + S/R 位确认)

这种"大周期定方向、中周期定位置、小周期定时机"的方式,是专业交易员的标准做法,也是策略区别于单纯"看1H做1H"的核心优势。


3. 时间框架架构

策略使用 freqtrade 的 @informative 装饰器加载三个时间框架:

┌─────────────────────────────────────────┐
│                1D (日线)                  │
│  populate_indicators_1d()               │
│  → Swing Point 检测                     │
│  → 结构分析trend_up / trend_down      │
│  → 输出到 1H: trend_up_1d, trend_down_1d │
└──────────────┬──────────────────────────┘
               │ 宏观趋势方向
┌──────────────▼──────────────────────────┐
│                4H (4小时)                │
│  populate_indicators_4h()               │
│  → Swing Point 检测                     │
│  → 结构分析trend + S/R + zone        │
│  → 活支撑/阻力检查                       │
│  → ★ v2.1 趋势强度评估                   │
│  → 输出到 1H: *_4h 系列字段              │
└──────────────┬──────────────────────────┘
               │ S/R位置 + 趋势强度
┌──────────────▼──────────────────────────┐
│                1H (1小时)                │
│  populate_indicators()                  │
│  → K线形态检测Pin Bar, Engulfing     │
│  → 合并所有时间框架数据                  │
│  populate_entry_trend()                 │
│  → 综合判断入场信号                      │
│  custom_stoploss()                      │
│  → 动态结构止损                          │
└─────────────────────────────────────────┘

三个时间框架的数据通过 freqtrade 自动 merge 到 1H 主时间框架,列名会自动加后缀(如 trend_up_1d, support_4h)。


4. 核心技术Swing Point 检测

4.1 算法

_detect_swing_points() 函数实现了经典的 Swing Point 检测:

def _detect_swing_points(high, low, window=5):
    # Swing High: 当前bar的high大于前后各window根bar的所有high
    # Swing Low:  当前bar的low小于前后各window根bar的所有low

参数含义

  • window=10D1前后各10根日线约2周窗口
  • window=84H前后各8根4H线约1.3天窗口

关键特性

  • 对称窗口——左右各 window 根 bar
  • 严格比较——必须是严格大于/小于,等于不算
  • 不依赖任何指标——纯价格极值比较

4.2 为什么窗口大小重要

窗口太小 窗口太大
噪音多,假 Swing Point 多 信号迟钝,错过转折
结构频繁切换 结构变化滞后

当前参数D1=10, 4H=8是回测调优的结果在灵敏度和稳定性之间取得了平衡。

4.3 可视化理解

价格
  ↑
  │     SH₁              SH₂
  │      ╲
  │       ╲
  │        ╲    SH₃        ╲
  │         ╲
  │╱          ╲╱    ╲          ╲___
  │            SL₁    SL₂          SL₃
  └─────────────────────────────────→ 时间

  SH = Swing High局部高点
  SL = Swing Low局部低点

  趋势判断:
    SH₂ > SH₁ 且 SL₂ > SL₁ → 上升趋势HH + HL
    SH₃ < SH₂ 且 SL₃ < SL₂ → 下降趋势LH + LL

5. 结构分析:趋势与支撑阻力

5.1 _build_structure() 函数

这个函数是策略的"大脑",接收 Swing Point 数据,输出以下信息:

输出字段 含义
trend_up 当前是否处于上升趋势HH + HL
trend_down 当前是否处于下降趋势LH + LL
support 最近的 Swing Low 价格(支撑位)
resistance 最近的 Swing High 价格(阻力位)
in_demand 价格是否在需求区支撑位附近下方35%区域)
in_supply 价格是否在供给区阻力位附近上方35%区域)

5.2 趋势判断逻辑

if 最近的SH > 前一个SH AND 最近的SL > 前一个SL:
    → 上升趋势HH + HL
elif 最近的SH < 前一个SH AND 最近的SL < 前一个SL:
    → 下降趋势LH + LL
else:
    → 维持上一个趋势判断(避免噪音切换)

关键设计:当 HH/HL 和 LH/LL 都不满足时(震荡),策略保持上一个趋势方向而非标记为"无趋势"。这避免了在震荡市中频繁切换方向。

5.3 需求区/供给区Demand/Supply Zone

pos_pct = (close - support) / (resistance - support)  # 0~1
in_demand = pos_pct < 0.35   # 价格在 S/R 区间下方 35%
in_supply = pos_pct > 0.65   # 价格在 S/R 区间上方 65%

这是一个相对位置判断——不是固定金额,而是相对于 S/R 区间宽度的比例。这意味着:

  • 窄区间:离 S/R 很近才算"靠近"
  • 宽区间:离 S/R 稍远也算"靠近"

5.4 活支撑/活阻力v1.6 新增)

# 活支撑价格触及支撑位±0.5%),但收盘价仍在支撑上方
touched_support = (low <= support * 1.005) & (low >= support * 0.995)
held_support = close > support
support_alive = 过去3根bar内至少有一次触及并守住

这个概念来自 Wyckoff 方法——被测试过并守住的支撑/阻力才是有效的。未被测试的 S/R 位只是"理论上的",被测试并守住的才是"实战验证的"。


6. K线形态入场触发器

策略识别两种经典的价格行为反转形态:

6.1 Pin Bar锤子线/射击之星)

pin_bar_wick_ratio = 0.6  # 影线占总K线长度 > 60%

Bullish Pin Bar:
  - 收盘 > 开盘阳线
  - 下影线 > 上影线买方反击
  - 出现在支撑位  潜在反转向上

Bearish Pin Bar:
  - 收盘 < 开盘阴线
  - 上影线 > 下影线卖方反击
  - 出现在阻力位  潜在反转向下

6.2 Engulfing吞没形态

Bullish Engulfing:
  - 当前阳线完全吞没前一根阴线
  - close > prev_open AND open < prev_close

Bearish Engulfing:
  - 当前阴线完全吞没前一根阳线
  - close < prev_open AND open > prev_close

6.3 为什么只识别这两种

  • Pin Bar:最经典的反转信号,反映多空力量转换
  • Engulfing:最强的趋势确认信号,反映一方完全压倒另一方

这两种形态在 S/R 位出现的意义完全不同——不在 S/R 位的 Pin Bar 只是噪音,在 S/R 位的 Pin Bar 才是信号。策略通过结合 S/R 位来过滤噪音。


7. 入场逻辑详解

7.1 做多LONG条件

策略做多需要全部满足以下条件:

① D1 上升趋势trend_up_1d = True
② 价格在 4H 需求区in_demand_4h = True
   即价格靠近 4H 支撑位S/R区间下方35%
③ 1H 出现看涨信号bullish_signal = True
   即出现 Bullish Pin Bar 或 Bullish Engulfing
④ 止损距离可接受stop_dist ≤ 5%
   入场价到 4H 支撑位的距离不超过 max_stop_dist
⑤ 止损距离足够stop_dist > 0.3%
   避免止损设太近被噪音震出
⑥ 4H 支撑是活的support_alive_4h = True
   支撑位在过去3根bar内被测试并守住
⑦ ★ v2.1: 4H 上升趋势在扩张strong_uptrend_4h = True
   趋势强度 > -20%(允许轻微收缩)
⑧ 冷却期内无同类信号cooldown_bars = 6
   过去6根1H bar内没有出现过做多信号

7.2 做空SHORT条件

镜像对称:

① D1 下降趋势trend_down_1d = True
② 价格在 4H 供给区in_supply_4h = True
③ 1H 出现看跌信号bearish_signal = True
④ 止损距离 ≤ 5%
⑤ 止损距离 > 0.3%
⑥ 4H 阻力是活的resistance_alive_4h = True
⑦ ★ v2.1: 4H 下降趋势在扩张strong_downtrend_4h = True
⑧ 冷却期 6 根 bar

7.3 入场逻辑图

                 ┌──────────────┐
                 │  D1 趋势确认  │
                 │  上升/下降?  │
                 └──────┬───────┘
                        │ ✅
                 ┌──────▼───────┐
                 │ 靠近4H S/R │
                 │ in_demand/   │
                 │ in_supply  │
                 └──────┬───────┘
                        │ ✅
                 ┌──────▼───────┐
                 │ 1H 反转信号?│
                 │ Pin Bar/     │
                 │ Engulfing  │
                 └──────┬───────┘
                        │ ✅
                 ┌──────▼───────┐
                 │ 止损距离     │
                 │ 0.3%~5%    │
                 └──────┬───────┘
                        │ ✅
                 ┌──────▼───────┐
                 │ S/R是活的  │
                 │ 被测试+守住? │
                 └──────┬───────┘
                        │ ✅
                 ┌──────▼───────┐
                 │ ★ 趋势在扩张?│  ← v2.1 新增
                 │ strong_      │
                 │ uptrend/     │
                 │ downtrend  │
                 └──────┬───────┘
                        │ ✅
                 ┌──────▼───────┐
                 │ 冷却期检查   │
                 │ 6根bar内无   │
                 │ 同类信号?   │
                 └──────┬───────┘
                        │ ✅
                 ┌──────▼───────┐
                 │  ⚡ 入场!    │
                 └──────────────┘

8. 止损逻辑

8.1 设计原则

策略使用 custom_stoploss 实现动态止损,基于价格结构而非固定百分比。

核心理念:止损位置由市场结构决定,不由固定金额或百分比决定。

8.2 止损算法

# 做多止损
support = 4H最近的Swing Low支撑位
sl_price = support × 0.999       # 支撑位下方 0.1%
sl_ratio = (sl_price / current_rate) - 1.0
return max(sl_ratio, -0.15)      # 最大亏损不超过 15%

# 做空止损(镜像)
resistance = 4H最近的Swing High阻力位
sl_price = resistance × 1.001    # 阻力位上方 0.1%
sl_ratio = 1.0 - (sl_price / current_rate)
return min(sl_ratio, 0.15)       # 最大亏损不超过 15%

8.3 为什么用 0.1% 缓冲

经过 v1.7/v1.8 的多次尝试2%、5%缓冲0.1% 是最优的:

  • 0.1%:止损次数多,但单笔亏损小。关键是被止损后不影响后续交易,且 trailing_stop_loss 有更多机会发挥作用
  • 2~5%:止损次数少,但单笔亏损大。trailing_stop_loss 的追踪效果被破坏

核心认知:这个策略的利润来源不是"少止损",而是"让盈利交易跑起来"。大缓冲破坏了 trailing stop 的追踪效果。

8.4 -15% 硬止损

stoploss = -0.15 是最后的保护线,只在极端情况下触发:

  • custom_stoploss 返回 None 时
  • 数据异常导致无法计算结构止损时
  • 极端跳空行情

正常交易中几乎不会触发——结构止损总是更紧。


9. 出场逻辑

9.1 结构出场

# 做多出场D1上升趋势结束
exit_long = NOT trend_up_1d

# 做空出场D1转为上升趋势
exit_short = trend_up_1d

9.2 trailing_stop_loss

freqtrade 内置的 trailing stop 是策略的主要利润保护机制:

  • 当盈利达到一定比例后,止损线开始跟随价格移动
  • 价格回落一定比例时触发止损
  • 实现了"让利润奔跑"的核心目标

数据证明v1.6 中 69.3% 的盈利交易通过 trailing_stop_loss 出场,这是策略利润的主要来源。

9.3 minimal_roi

minimal_roi = {"0": 100}

策略不使用固定时间/收益比的止盈。所有利润保护交给 trailing stop。这意味着

  • 没有"赚够了就平仓"的思维
  • 让趋势把利润带到它能带到的最远

10. v2.1 核心创新:趋势强度过滤

10.1 问题背景

v1.6 的痛点在震荡市中D1 趋势可能仍然是"上升"或"下降"(因为趋势判断只比较两个 Swing Point但趋势本身的力度在减弱。这种"名义上的趋势"会导致在 S/R 位入场后被震荡出局。

10.2 趋势强度算法

v2.1 在 4H 级别计算趋势强度:

# 上升趋势强度
hh_dist = (最新SH - 前一个SH) / 前一个SH    # SH间距变化率
hl_dist = (最新SL - 前一个SL) / 前一个SL    # SL间距变化率
trend_strength_up = hh_dist + hl_dist

# 下降趋势强度(取反)
trend_strength_down = -(hh_dist + hl_dist)

# 过滤条件:趋势强度 > -20%(允许轻微收缩)
strong_uptrend = trend_strength_up > -0.20
strong_downtrend = trend_strength_down > -0.20

10.3 物理意义

趋势强度值 含义
+10% 趋势加速扩张HH和HL间距都在拉大
+2% 趋势温和扩张
0% 趋势持平
-5% 趋势轻微收缩
-20% 阈值:允许到此为止的收缩
-30% 趋势明显收缩,接近震荡
-50% 趋势严重收缩,大概率进入震荡

10.4 为什么阈值是 -20%

回测参数调优结果。0%(只允许扩张)会过滤掉太多信号;-20% 在"过滤震荡市信号"和"保留趋势市信号"之间取得了最佳平衡。

10.5 v2.1 vs v1.6 效果对比

指标 v1.6 v2.1 变化
ETH 总收益 +3659% +4366% +19.3%
BTC 总收益 +507% +575% +13.4%
ETH 交易数 152 182 +30
连亏序列 23个 28个 +5

趋势强度过滤没有大幅减少交易数(反而增加了),但在保持信号数量的同时提升了信号质量。这表明过滤器主要排除了"看起来可以但实际上不该入场"的信号,而不是简单粗暴地减少交易。


11. 参数说明

11.1 可优化参数

参数 默认值 范围 说明
swing_lookback_d1 10 8-14 D1 Swing Point 检测窗口
swing_lookback_h4 8 5-10 4H Swing Point 检测窗口
pin_bar_wick_ratio 60 50-70 Pin Bar 影线占比阈值(%
max_stop_dist 50 20-50 入场到止损的最大距离(%
cooldown_bars 6 3-12 同方向信号冷却期1H bar数
trend_strength_min -20 -50~20 ★ v2.1: 趋势强度最小阈值(%

11.2 固定参数

参数 说明
stoploss -0.15 硬止损(极端情况保护)
minimal_roi {"0": 100} 不使用固定止盈
timeframe "1h" 主时间框架
can_short True 允许做空

12. 回测表现

12.1 ETH/USDT 全周期2022-01 ~ 2026-06

指标 v1.6 v2.1
总收益率 +3659% +4366%
总交易数 152 182
胜率 ~35% ~36%
Profit Factor 3.56 ~3.8
最大连续亏损 8 笔 8 笔
最长连亏天数 35 天 ~30 天

12.2 BTC/USDT 全周期

指标 v1.6 v2.1
总收益率 +507% +575%
总交易数 190 ~200+

12.3 年度表现ETH

年份 市场环境 收益 说明
2022 熊市 -11.32% 策略最弱的一年
2023 恢复期 +84% ~ +128% 趋势恢复后表现强劲
2024 牛市 +84% ~ +128% 趋势市中表现最佳
2025 震荡 盈利但偏弱 震荡市是策略短板
2026 YTD 下降趋势 运行中 dry-run 观察中

关键发现:策略在趋势市表现优秀,在震荡市表现差。这符合价格行为策略的特征——没有趋势就没有利润。

12.4 回测配置

{
    "max_open_trades": 1,
    "dry_run_wallet": 10000,
    "stake_amount": "unlimited",
    "trading_mode": "futures",
    "margin_mode": "isolated"
}

⚠️ 重要max_open_trades=1stake_amount="unlimited" 是收益率数字的关键——它们确保每笔交易使用全部资金,实现完整复利。如果改成 max_open_trades=3,收益会被人为压低到约 1/3。


13. 演进历史

策略从 v0.1 到 v2.1 经历了多轮迭代:

v0.x 系列(指标策略)
  ├── 使用 EMA/ATR 等衍生指标
  └── ❌ 已弃用:用户要求纯价格行为学

v1.0 ~ v1.5(探索期)
  ├── v1.0: 5M TF, spot → 噪音太多
  ├── v1.1: 1H TF, futures, 做空 → +61%
  ├── v1.2: Entry Candle 止损 → bug
  ├── v1.3: ATR 动态止损 → -63.72%
  ├── v1.4: 回归价格结构止损 → +140.71% ✅
  └── v1.5: 参数调优 → +140.83%

v1.6(旧最优基线)
  ├── 入场质量过滤:冷却期 + 活支撑/阻力
  ├── ETH: +3659%, PF=3.78
  └── ✅ 证明"入场质量 > 止损优化"

v1.7 ~ v1.9(止损优化尝试 — 全部失败)
  ├── v1.7: 5%缓冲 → 单笔亏损过大
  ├── v1.8: 2%缓冲 → 总收益下降45%
  └── v1.9: 结构变化检测止损 → 收益下降56%

v2.0 ~ v2.1(趋势过滤)
  ├── v2.0: B1入场延迟确认 → 方向正确但降频严重
  └── v2.1: D1趋势强度过滤 → ⭐ 当前最优

关键教训

  1. 止损缓冲不是越大越好 — 小缓冲 + trailing stop > 大缓冲
  2. 入场质量 > 止损优化 — 减少需要止损的交易是最佳路径
  3. 二元过滤器容易误杀 — 需要更精细的评分机制
  4. 所有优化必须先回测 — v1.7/v1.8 的失败证明了这一点

14. 已知局限

14.1 震荡市表现差

策略在趋势明确时表现优秀,但在震荡市中连续止损。这是因为:

  • 震荡市没有持续的 HH/HL 或 LH/LL
  • S/R 位频繁被穿越
  • K线反转信号在震荡市中可靠性低

当前对策v2.1 的趋势强度过滤可以排除部分震荡市信号,但不能完全解决。

未来方向:市场状态分类器(趋势 vs 震荡),在震荡市自动降低交易频率或暂停。

14.2 胜率偏低(~35%

65% 的交易以止损结束。这在价格行为策略中是正常的但对交易者心态是巨大考验。连续8笔亏损跨越35天需要极强的纪律性。

14.3 回撤偏大(~30-40%

最大回撤可能达到 30-40%。10万本金可能暂时缩水到6万。

14.4 BTC 表现远弱于 ETH

BTC 的收益率(+575%)远低于 ETH+4366%差了近7倍。这可能与 ETH 波动性更大、趋势更明确有关。

14.5 未经过实盘验证

所有数据来自回测。实盘中可能面临:

  • 滑点
  • 网络延迟
  • 交易所 API 限制
  • 极端行情下的流动性问题

15. 部署信息

15.1 当前运行状态

项目 详情
服务器 腾讯云东京 43.163.225.30
系统 Ubuntu 24.04.3 LTS
freqtrade 2025.11 (Docker)
模式 dry_run
策略 StructureFlowStrategyV21
交易对 ETH/USDT:USDT (futures)
时间框架 1H含 4H/1D informative
Telegram @jason5612_bot

15.2 服务器目录结构

~/freqtrade/
├── docker-compose.yml          # Docker 编排配置
└── user_data/
    ├── config.json              # 主配置(含 Telegram
    ├── config.pairlist.json     # 交易对白名单
    ├── strategies/
    │   └── structure_flow_strategy_v2_1.py
    ├── data/binance/            # K线数据
    ├── logs/                    # 运行日志
    └── tradesv3.sqlite          # 交易数据库

15.3 Telegram 命令

命令 功能
/status 查看当前运行状态
/profit 查看盈亏统计
/trades 查看交易列表
/count 查看交易数量
/balance 查看资金余额
/start 开始交易
/stop 停止交易

15.4 常用运维命令

# 查看日志
docker compose logs --tail 50

# 重启服务
docker compose down && docker compose up -d

# 更新策略后重启
scp strategy.py ubuntu@43.163.225.30:~/freqtrade/user_data/strategies/
ssh ubuntu@43.163.225.30 "cd ~/freqtrade && docker compose restart"

附录 A策略完整入场条件速查

LONG做多

trend_up_1d           = True     # D1 上升趋势
in_demand_4h          = True     # 价格在4H需求区下方35%
bullish_signal        = True     # 1H 出现看涨 Pin Bar 或 Engulfing
stop_dist             ≤ 5%       # 入场到支撑位 ≤ 5%
stop_dist             > 0.3%     # 入场到支撑位 > 0.3%(止损不要太近)
support_alive_4h      = True     # 支撑位被测试并守住
strong_uptrend_4h     = True     # 4H上升趋势在扩张> -20%
cooldown              = 6 bars   # 过去6根bar内无同类信号

SHORT做空

trend_down_1d         = True     # D1 下降趋势
in_supply_4h          = True     # 价格在4H供给区上方35%
bearish_signal        = True     # 1H 出现看跌 Pin Bar 或 Engulfing
stop_dist             ≤ 5%       # 入场到阻力位 ≤ 5%
stop_dist             > 0.3%     # 入场到阻力位 > 0.3%
resistance_alive_4h   = True     # 阻力位被测试并守住
strong_downtrend_4h   = True     # 4H下降趋势在扩张> -20%
cooldown              = 6 bars   # 过去6根bar内无同类信号

最后更新: 2026-06-08 | 作者: 用户 + WorkBuddy AI

本文档将随策略迭代持续更新。