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.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. Support / Resistance（支撑 / 阻力）——最近的有效 Swing Point，买卖双方曾在此达成共识的位置
3. Candle Patterns（K 线形态）——Pin Bar（锤子线/流星线）和 Engulfing（吞没形态），当前博弈的实时裁判

为什么纯价格行为学？
所有技术指标都是价格的衍生品。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 采用三层时间框架结构，自上而下形成"宏观定方向 → 中观定趋势 → 微观定入场"的决策链条：

图 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 数据处理流程

图 2-2：v2.2d 数据处理流程。D1 和 4H 作为信息时间框架并行计算，1H 主框架汇总后生成信号。

### 2.3 参数一览

参数名 | 默认值 | 可调范围 | 说明
--- | --- | --- | ---
`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 趋势强度最低阈值。负值=允许弱趋势入场。

参数设计原则：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()` 判断。
图 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. 支撑/阻力位：最近一个 Swing Low 的价格 = 支撑位（Support），最近一个 Swing High 的价格 = 阻力位（Resistance）。
3. 供需区域：在支撑和阻力之间，计算当前价格的位置百分比。百分比 < 35% 为需求区（Demand Zone），百分比 > 65% 为供给区（Supply Zone）。

趋势继承原则：当 Swing Point 不足时（比如策略启动初期或长时间无新高/新低），趋势判断不会变成"无趋势"或"未知"——它会继承上一根 K 线的判断。这确保了策略不会在数据不足时"失明"，而是保守地保持上一状态。

### 3.3 供需区域划分

图 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)

图 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_pinbar`、`bearish_pinbar`、`bullish_engulfing`、`bearish_engulfing`），但在当前的入场条件中并未被直接使用。策略选择用供需区域 + 活 S/R 替代了 K 线形态确认。

为什么没用到？ 在 v2.2c → v2.2d 的演进中，入场条件经历了多次精简。K 线形态曾在前代版本中被使用，但回测发现：供需区域这个条件本身就足够强大——当价格已经处于需求区且支撑位是活的时，额外的形态过滤只会降低入场频率而不显著提升胜率。
形态检测代码保留在策略中用于 `plot_config` 可视化，方便实盘监控时观察。

## 第五章入场条件详解

### 5.1 做多入场（6项条件）

所有 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 线（默认）。防止连续追单和过度交易。

### 5.2 做空入场（6项条件）

# | 条件 | 代码变量 | 逻辑
--- | --- | --- | ---
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 线。

止损距离下限 0.3%：这个微小的门槛有一个重要功能——防止在 S/R 位"紧贴"价格时入场。如果入场价距离支撑/阻力只有 0.3% 以内，说明价格几乎就在 S/R 位上，一根正常的 K 线波动就能穿透它。这个门槛确保了每笔交易都有"呼吸空间"。

### 5.3 入场决策流程图

图 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,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

关键洞察：修复冷却期后，策略多了 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. 动态止损：当前价格触及 S/R 外侧 0.1% 缓冲 → 触发止损
3. 硬止损：亏损达到 15% → 无条件离场（极少触发，因为动态止损通常在更早位置就已经激活）

588
追踪止损出场
777
止损出场
9
结构出场
66.2%
追踪止损胜率
0%
止损胜率
88.9%
结构出场胜率

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

- 588 笔通过 `trailing_stop_loss` 出场，胜率 66.2%，贡献 +383,557% 的利润
- 777 笔通过 `stop_loss` 出场，胜率 0%，亏损 -181,597%
- 9 笔通过 `exit_signal` 出场，胜率 88.9%
- 盈利交易平均持仓 2 天 3 小时，亏损交易平均持仓 9 小时 22 分

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

## 第八章风险管理

### 8.1 硬止损上限

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

### 8.2 仓位控制

参数 | 值 | 含义
--- | --- | ---
`max_open_trades` | 1 | 同一时间最多持有 1 笔仓位
`stake_amount` | unlimited | 每笔交易使用全部可用资金（全仓）
杠杆 | 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。

需要注意：

- 回撤绝对值巨大（$2.2M）：这是复利效应的另一面——本金大了之后，同样的百分比回撤对应更大的绝对金额
- 连续亏损记录：最大连续亏损为 24 笔。在 28.9% 胜率下，连续 24 笔亏损在统计上是必然会发生的事件
- 心理考验：实盘中经历连续 24 笔亏损而不干预策略，是对交易者纪律性的终极考验

⚠️ 实盘回撤可能更大：回测中的最大回撤 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倍） | 🏆 卓越
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) | 正期望 ✅

### 9.2 出场原因分布

出场原因 | 笔数 | 占比 | 胜率 | 总盈亏 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

关键解读：
• 56.5% 的交易以止损结束——这是 28.9% 胜率的另一面
• 但 42.8% 的追踪止损出场贡献了 正 3836 万 的利润，远超止损的 1816 万亏损
• 追踪止损出场的平均利润为 +2.6%，止损出场的平均亏损为 -0.89%，盈亏比约 2.92:1

### 9.3 多空表现对比

指标 | 做多 (Long) | 做空 (Short)
--- | --- | ---
交易笔数 | 748 | 627
总利润 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.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

结论：v2.2d 在所有关键指标上全面优于 v2.2c。唯一增加的代价是回撤从 17.96% 升至 20.58%（+2.62pp），这是交易频率增加后的自然结果。Sharpe 比率突破 1.0 是策略成熟度的重要里程碑。

## 第十章策略演进史

### 10.1 v1.x 时代：试错与奠基

版本 | 核心改动 | 结果 | 教训
--- | --- | --- | ---
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 | 止损优化尝试 | 全部失败 | 任何过滤止损的方法都会误杀盈利

### 10.2 v2.x 时代：突破与优化

版本 | 核心改动 | 结果 | 意义
--- | --- | --- | ---
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% | 🔥 当前最优基线

### 10.3 关键教训总结

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

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

### 11.1 策略层面风险

# | 风险 | 严重度 | 详情
--- | --- | --- | ---
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 的实盘验证表明当前设置是合理的。

### 11.2 执行层面风险

# | 风险 | 严重度 | 详情
--- | --- | --- | ---
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 调用极低频，几乎不可能触及限流。

### 11.3 外部不可控风险

- 交易所风险：Binance 被监管关闭或限制提币（低概率，高影响）
- 极端黑天鹅：类似 2020-03-12（ETH 单日 -50%）的极端行情，策略的 15% 硬止损可能来不及执行
- 市场结构剧变：ETH 从 PoW 转 PoS 后市场微观结构可能变化，价格行为学模式的有效性需要持续监控

## 第十二章下一步优化方向

### 12.1 短期优化（1-3个月）

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

### 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 长期愿景

- 多品种多策略组合：趋势（v2.2d）+ 波段（v3.x）+ 剥头皮（待突破），ETH + BTC + 其他主流币，不同策略覆盖不同市场环境
- 家庭电脑远程回测：通过 frp/Tailscale 将家里高性能电脑作为回测/机器学习工作站，东京服务器仅负责实时交易执行
- 策略"黑箱"监控面板：完整的策略健康度仪表盘——回撤预警、胜率漂移检测、信号质量评分、参数稳定性监控
- 实盘小资金验证：dry-run 稳定 3-6 个月后，用小资金（如 $1,000）实盘验证 3 个月，确认回测到实盘的折损率

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

## 附录

### 附录A：完整参数表

参数 | 类型 | 默认值 | 范围 | 空间
--- | --- | --- | --- | ---
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

### 附录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）位于：

- 本地副本：`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）

### 附录D：术语表

术语 | 英文 | 解释
--- | --- | ---
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 运行中