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

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

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 采用三层时间框架结构,自上而下形成"宏观定方向 → 中观定趋势 → 微观定入场"的决策链条:

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. 支撑/阻力位:最近一个 Swing Low 的价格 = 支撑位(Support),最近一个 Swing High 的价格 = 阻力位(Resistance)。
  3. 供需区域:在支撑和阻力之间,计算当前价格的位置百分比。百分比 < 35% 为需求区(Demand Zone),百分比 > 65% 为供给区(Supply Zone)。
趋势继承原则:当 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_4h 4H 级别趋势强度 > -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_4h 4H 级别下降趋势强度 > -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. 动态止损:当前价格触及 S/R 外侧 0.1% 缓冲 → 触发止损
  3. 硬止损:亏损达到 15% → 无条件离场(极少触发,因为动态止损通常在更早位置就已经激活)
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_loss 58842.8%66.2% +38,355,746 1天 17:47
stop_loss 77756.5%0% -18,159,746 6:13
exit_signal 90.7%88.9% +317,061 11:20
force_exit 10.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)
交易笔数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. 入场质量 > 止损优化: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 外部不可控风险

第十二章下一步优化方向

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

⚠️ 优化铁律: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 运行中