DEV Community

Henry Lin
Henry Lin

Posted on

第 27 课:Freqtrade多时间框架策略

第 27 课:多时间框架策略

⏱ 课时:2 小时
🎯 学习目标:学会开发多周期确认策略,提高信号质量和稳定性


课程概述

单一时间框架的策略容易产生假信号。使用多时间框架分析(Multi-Timeframe Analysis, MTF)可以:

  • ✅ 提高信号质量
  • ✅ 减少假突破
  • ✅ 提升胜率
  • ✅ 更好地把握市场趋势

核心理念

大周期看趋势,小周期找入场。


第一部分:多时间框架理论

1.1 为什么需要多时间框架

单一时间框架的局限

问题 1:视野狭窄
- 5 分钟图看起来是上涨
- 但 1 小时图可能是下跌趋势中的反弹
- 容易逆势交易

问题 2:假信号频繁
- 小周期噪音多
- 频繁的金叉死叉
- 多数是假突破

问题 3:缺乏大局观
- 不知道当前处于趋势的哪个阶段
- 容易在趋势末期入场
- 止损频繁触发
Enter fullscreen mode Exit fullscreen mode

多时间框架的优势

优势 1:趋势确认
- 1 小时图确认上涨趋势
- 5 分钟图寻找回调买点
- 顺势交易,成功率高

优势 2:过滤噪音
- 大周期过滤小周期的假信号
- 只在趋势方向交易
- 减少无效交易

优势 3:更好的风险回报
- 大趋势支持,可以持仓更久
- 盈利空间更大
- 回撤更小
Enter fullscreen mode Exit fullscreen mode

1.2 时间框架组合原则

常用组合

大周期(趋势) 中周期(确认) 小周期(入场) 适用场景
1d 4h 1h 波段交易
4h 1h 15m 日内波段
1h 15m 5m 短线交易(推荐)
15m 5m 1m 超短线

推荐比例

  • 大周期:中周期 = 4:1 到 8:1
  • 中周期:小周期 = 3:1 到 4:1
  • 例如:1h(大)、15m(中)、5m(小)= 12:3:1

选择原则

1. 交易风格决定时间框架
   - 波段交易:4h + 1h + 15m
   - 日内交易:1h + 15m + 5m
   - 短线交易:15m + 5m + 1m

2. 避免相邻过近
   ❌ 错误:5m + 3m + 1m(过于接近)
   ✅ 正确:15m + 5m + 1m(间隔合理)

3. 不要使用太多周期
   ❌ 错误:1d + 4h + 1h + 15m + 5m(过于复杂)
   ✅ 正确:1h + 15m + 5m(3 个周期足够)
Enter fullscreen mode Exit fullscreen mode

1.3 三层决策模型

┌─────────────────────────────────────────┐
│  第一层:大周期(趋势判断)              │
│  作用:判断整体趋势方向                  │
│  指标:EMA 50/200, ADX, MACD             │
│  决策:只做多?只做空?观望?             │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│  第二层:中周期(信号确认)              │
│  作用:确认趋势延续,寻找机会             │
│  指标:EMA 20/50, RSI, Stochastic        │
│  决策:趋势强度如何?是否有入场机会?     │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│  第三层:小周期(精确入场)              │
│  作用:寻找最佳入场点                    │
│  指标:EMA 9/21, RSI, 价格行为            │
│  决策:现在入场还是等待?                 │
└─────────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

第二部分:Freqtrade 中实现多时间框架

2.1 使用 @informative 装饰器

基础用法

from freqtrade.strategy import IStrategy, informative
from pandas import DataFrame
import talib.abstract as ta

class MultiTimeframeStrategy(IStrategy):

    INTERFACE_VERSION = 3
    timeframe = '5m'  # 主时间框架

    @informative('1h')  # 添加 1 小时时间框架
    def populate_indicators_1h(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        计算 1 小时时间框架的指标
        这些指标会自动合并到 5 分钟数据中
        """
        # 计算 1 小时的 EMA
        dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['ema_200'] = ta.EMA(dataframe, timeperiod=200)

        # 计算 1 小时的 RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        # 计算 1 小时的 ADX(趋势强度)
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)

        return dataframe

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        计算 5 分钟时间框架的指标
        """
        # 5 分钟的快速均线
        dataframe['ema_fast'] = ta.EMA(dataframe, timeperiod=9)
        dataframe['ema_slow'] = ta.EMA(dataframe, timeperiod=21)

        # 5 分钟的 RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        买入信号:结合 1 小时和 5 分钟
        """
        dataframe.loc[
            (
                # 1 小时条件:上涨趋势
                (dataframe['ema_50_1h'] > dataframe['ema_200_1h']) &  # 大趋势向上
                (dataframe['close'] > dataframe['ema_50_1h']) &       # 价格在均线之上
                (dataframe['adx_1h'] > 25) &                          # 趋势明确

                # 5 分钟条件:回调买点
                (qtpylib.crossed_above(dataframe['ema_fast'], dataframe['ema_slow'])) &
                (dataframe['rsi'] > 30) &
                (dataframe['rsi'] < 70) &

                (dataframe['volume'] > 0)
            ),
            'enter_long'] = 1

        return dataframe
Enter fullscreen mode Exit fullscreen mode

关键点

  • 1 小时的指标会自动添加后缀 _1h
  • 例如:ema_50 在 1h 函数中定义,在主函数中使用时变为 ema_50_1h
  • Freqtrade 会自动将 1 小时数据重采样到 5 分钟

多个时间框架

class TripleTimeframeStrategy(IStrategy):

    timeframe = '5m'

    @informative('1h')
    def populate_indicators_1h(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """1 小时:大趋势"""
        dataframe['ema_200'] = ta.EMA(dataframe, timeperiod=200)
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)
        return dataframe

    @informative('15m')
    def populate_indicators_15m(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """15 分钟:中趋势"""
        dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        return dataframe

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """5 分钟:入场时机"""
        dataframe['ema_20'] = ta.EMA(dataframe, timeperiod=20)
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                # 1 小时:上涨趋势 + 趋势强劲
                (dataframe['close'] > dataframe['ema_200_1h']) &
                (dataframe['adx_1h'] > 25) &

                # 15 分钟:价格在均线之上 + RSI 健康
                (dataframe['close'] > dataframe['ema_50_15m']) &
                (dataframe['rsi_15m'] > 40) &
                (dataframe['rsi_15m'] < 70) &

                # 5 分钟:突破入场
                (dataframe['close'] > dataframe['ema_20']) &
                (dataframe['rsi'] > 50) &

                (dataframe['volume'] > 0)
            ),
            'enter_long'] = 1

        return dataframe
Enter fullscreen mode Exit fullscreen mode

第三部分:实战策略案例

3.1 趋势跟随多时间框架策略

策略逻辑

  • 1 小时:确认大趋势(EMA 50 > EMA 200)
  • 15 分钟:等待回调(价格回到 EMA 20 附近)
  • 5 分钟:金叉入场(EMA 9 上穿 EMA 21)

完整代码 user_data/strategies/MTFTrendStrategy.py

from freqtrade.strategy import IStrategy, informative
from pandas import DataFrame
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib

class MTFTrendStrategy(IStrategy):
    """
    多时间框架趋势跟随策略
    1h 确认趋势 → 15m 等待回调 → 5m 金叉入场
    """

    INTERFACE_VERSION = 3

    minimal_roi = {
        "0": 0.10,
        "30": 0.05,
        "60": 0.03,
        "120": 0.01
    }

    stoploss = -0.03

    trailing_stop = True
    trailing_stop_positive = 0.01
    trailing_stop_positive_offset = 0.02
    trailing_only_offset_is_reached = True

    timeframe = '5m'
    startup_candle_count: int = 200

    # ========== 1 小时时间框架 ==========
    @informative('1h')
    def populate_indicators_1h(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        1 小时:判断大趋势
        """
        # 长期趋势均线
        dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['ema_200'] = ta.EMA(dataframe, timeperiod=200)

        # 趋势强度
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)

        # MACD
        macd = ta.MACD(dataframe, fastperiod=12, slowperiod=26, signalperiod=9)
        dataframe['macd'] = macd['macd']
        dataframe['macdsignal'] = macd['macdsignal']

        return dataframe

    # ========== 15 分钟时间框架 ==========
    @informative('15m')
    def populate_indicators_15m(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        15 分钟:寻找回调机会
        """
        # 中期均线
        dataframe['ema_20'] = ta.EMA(dataframe, timeperiod=20)
        dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50)

        # RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        # 布林带(判断回调幅度)
        bollinger = qtpylib.bollinger_bands(dataframe['close'], window=20, stds=2)
        dataframe['bb_lower'] = bollinger['lower']
        dataframe['bb_middle'] = bollinger['mid']

        return dataframe

    # ========== 5 分钟时间框架 ==========
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        5 分钟:精确入场
        """
        # 快速均线
        dataframe['ema_fast'] = ta.EMA(dataframe, timeperiod=9)
        dataframe['ema_slow'] = ta.EMA(dataframe, timeperiod=21)

        # RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        # 成交量
        dataframe['volume_mean'] = dataframe['volume'].rolling(window=20).mean()

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        买入信号:三个时间框架共同确认
        """
        dataframe.loc[
            (
                # ===== 1 小时条件:确认上涨趋势 =====
                (dataframe['ema_50_1h'] > dataframe['ema_200_1h']) &  # 多头排列
                (dataframe['close'] > dataframe['ema_50_1h']) &       # 价格在趋势之上
                (dataframe['adx_1h'] > 25) &                          # 趋势明确
                (dataframe['macd_1h'] > dataframe['macdsignal_1h']) & # MACD 多头

                # ===== 15 分钟条件:回调到位 =====
                (dataframe['close'] > dataframe['ema_50_15m']) &      # 仍在中期趋势之上
                (dataframe['rsi_15m'] > 40) &                         # RSI 不要太弱
                (dataframe['rsi_15m'] < 60) &                         # 也不要太强(留空间)
                (dataframe['close'] < dataframe['ema_20_15m']) &      # 价格回调到 EMA 20 以下

                # ===== 5 分钟条件:金叉入场 =====
                (qtpylib.crossed_above(dataframe['ema_fast'], dataframe['ema_slow'])) &
                (dataframe['rsi'] > 45) &
                (dataframe['volume'] > dataframe['volume_mean']) &

                (dataframe['volume'] > 0)
            ),
            'enter_long'] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        卖出信号:趋势反转
        """
        dataframe.loc[
            (
                # 1 小时趋势反转
                (
                    (dataframe['ema_50_1h'] < dataframe['ema_200_1h']) |  # 空头排列
                    (dataframe['macd_1h'] < dataframe['macdsignal_1h'])   # MACD 空头
                ) |

                # 或 5 分钟死叉
                (qtpylib.crossed_below(dataframe['ema_fast'], dataframe['ema_slow']))
            ) &
            (dataframe['volume'] > 0),
            'exit_long'] = 1

        return dataframe
Enter fullscreen mode Exit fullscreen mode

3.2 均值回归多时间框架策略

策略逻辑

  • 1 小时:确认震荡市(ADX < 25)
  • 15 分钟:价格远离均线(RSI 极端)
  • 5 分钟:反转信号(RSI 回归)

代码 user_data/strategies/MTFMeanReversionStrategy.py

from freqtrade.strategy import IStrategy, informative
from pandas import DataFrame
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib

class MTFMeanReversionStrategy(IStrategy):
    """
    多时间框架均值回归策略
    适用于震荡市场
    """

    INTERFACE_VERSION = 3

    minimal_roi = {
        "0": 0.05,
        "20": 0.03,
        "40": 0.02,
        "60": 0.01
    }

    stoploss = -0.04
    timeframe = '5m'
    startup_candle_count: int = 100

    # ========== 1 小时时间框架 ==========
    @informative('1h')
    def populate_indicators_1h(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        1 小时:判断市场状态(趋势 or 震荡)
        """
        # ADX 判断趋势强度
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)

        # EMA
        dataframe['ema_100'] = ta.EMA(dataframe, timeperiod=100)

        return dataframe

    # ========== 15 分钟时间框架 ==========
    @informative('15m')
    def populate_indicators_15m(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        15 分钟:判断偏离程度
        """
        # RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        # 布林带
        bollinger = qtpylib.bollinger_bands(dataframe['close'], window=20, stds=2)
        dataframe['bb_lower'] = bollinger['lower']
        dataframe['bb_upper'] = bollinger['upper']
        dataframe['bb_middle'] = bollinger['mid']

        return dataframe

    # ========== 5 分钟时间框架 ==========
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        5 分钟:寻找反转信号
        """
        # RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

        # EMA
        dataframe['ema_20'] = ta.EMA(dataframe, timeperiod=20)

        # 成交量
        dataframe['volume_mean'] = dataframe['volume'].rolling(window=20).mean()

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        买入信号:震荡市中的超卖反弹
        """
        dataframe.loc[
            (
                # ===== 1 小时条件:震荡市 =====
                (dataframe['adx_1h'] < 25) &  # 无明确趋势

                # ===== 15 分钟条件:超卖 =====
                (dataframe['rsi_15m'] < 30) &  # RSI 超卖
                (dataframe['close'] < dataframe['bb_lower_15m']) &  # 价格低于布林带下轨

                # ===== 5 分钟条件:反转确认 =====
                (dataframe['rsi'] > dataframe['rsi'].shift(1)) &  # RSI 开始回升
                (dataframe['rsi'] > 30) &  # 脱离超卖区
                (dataframe['close'] > dataframe['ema_20']) &  # 价格回到均线之上
                (dataframe['volume'] > dataframe['volume_mean']) &

                (dataframe['volume'] > 0)
            ),
            'enter_long'] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        卖出信号:回归完成
        """
        dataframe.loc[
            (
                # 15 分钟 RSI 回到中性区
                (dataframe['rsi_15m'] > 50) |

                # 或价格触及布林带中轨
                (dataframe['close'] > dataframe['bb_middle_15m'])
            ) &
            (dataframe['volume'] > 0),
            'exit_long'] = 1

        return dataframe
Enter fullscreen mode Exit fullscreen mode

第四部分:进阶技巧

4.1 动态时间框架选择

根据市场波动率动态选择时间框架:

def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    """
    根据 ATR 判断波动率,动态调整策略
    """
    # 计算 ATR
    dataframe['atr'] = ta.ATR(dataframe, timeperiod=14)
    dataframe['atr_pct'] = (dataframe['atr'] / dataframe['close']) * 100

    # 高波动时,更依赖大周期
    # 低波动时,可以参考小周期

    return dataframe

def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe.loc[
        (
            # 高波动市场(ATR > 2%):严格依赖 1 小时
            (
                (dataframe['atr_pct'] > 2.0) &
                (dataframe['ema_50_1h'] > dataframe['ema_200_1h']) &
                (dataframe['adx_1h'] > 30) &  # 更高的 ADX 要求
                (qtpylib.crossed_above(dataframe['ema_fast'], dataframe['ema_slow']))
            ) |

            # 低波动市场(ATR < 1%):可以放宽 1 小时条件
            (
                (dataframe['atr_pct'] < 1.0) &
                (dataframe['close'] > dataframe['ema_50_1h']) &  # 简化条件
                (qtpylib.crossed_above(dataframe['ema_fast'], dataframe['ema_slow']))
            )
        ) &
        (dataframe['volume'] > 0),
        'enter_long'] = 1

    return dataframe
Enter fullscreen mode Exit fullscreen mode

4.2 权重评分系统

为不同时间框架的信号分配权重:

def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    """
    使用评分系统,而非硬性条件
    """
    # 初始化分数
    dataframe['signal_score'] = 0

    # 1 小时信号(权重最高:40%)
    dataframe.loc[
        (dataframe['ema_50_1h'] > dataframe['ema_200_1h']),
        'signal_score'] += 20

    dataframe.loc[
        (dataframe['adx_1h'] > 25),
        'signal_score'] += 20

    # 15 分钟信号(权重:30%)
    dataframe.loc[
        (dataframe['rsi_15m'] > 40) & (dataframe['rsi_15m'] < 70),
        'signal_score'] += 15

    dataframe.loc[
        (dataframe['close'] > dataframe['ema_50_15m']),
        'signal_score'] += 15

    # 5 分钟信号(权重:30%)
    dataframe.loc[
        (qtpylib.crossed_above(dataframe['ema_fast'], dataframe['ema_slow'])),
        'signal_score'] += 20

    dataframe.loc[
        (dataframe['volume'] > dataframe['volume_mean']),
        'signal_score'] += 10

    # 总分 >= 70 分才入场
    dataframe.loc[
        (dataframe['signal_score'] >= 70) &
        (dataframe['volume'] > 0),
        'enter_long'] = 1

    return dataframe
Enter fullscreen mode Exit fullscreen mode

4.3 时间框架对齐检查

确保不同时间框架的数据正确对齐:

def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    """
    检查数据对齐
    """
    # 添加时间戳检查(调试用)
    if len(dataframe) > 0:
        print(f"5m data: {dataframe.iloc[-1]['date']}")

        # 检查 1h 数据是否存在
        if 'ema_50_1h' in dataframe.columns:
            print(f"1h indicator present: {dataframe.iloc[-1]['ema_50_1h']}")
        else:
            print("Warning: 1h indicators not found!")

    return dataframe
Enter fullscreen mode Exit fullscreen mode

第五部分:测试和优化

5.1 回测多时间框架策略

# 1. 下载多个时间框架的数据
freqtrade download-data \
    -c config.json \
    --days 90 \
    --timeframes 5m 15m 1h

# 2. 回测
freqtrade backtesting \
    -c config.json \
    --strategy MTFTrendStrategy \
    --timerange 20230101-20230331

# 3. 生成图表(包含多时间框架指标)
freqtrade plot-dataframe \
    -c config.json \
    --strategy MTFTrendStrategy \
    --pairs BTC/USDT \
    --indicators1 ema_fast ema_slow ema_50_1h \
    --indicators2 rsi rsi_15m
Enter fullscreen mode Exit fullscreen mode

5.2 性能对比

对比单一时间框架和多时间框架策略:

# 测试单一 5m 策略
freqtrade backtesting \
    -c config.json \
    --strategy SimpleCrossStrategy \
    --timerange 20230101-20230331 \
    --export trades

# 测试多时间框架策略
freqtrade backtesting \
    -c config.json \
    --strategy MTFTrendStrategy \
    --timerange 20230101-20230331 \
    --export trades

# 对比结果
Enter fullscreen mode Exit fullscreen mode

典型结果对比:

指标 单一 5m 多时间框架 改进
总收益率 +18.5% +24.3% +31%
胜率 52% 61% +17%
交易次数 127 85 -33%
最大回撤 -15.2% -10.8% -29%
Sharpe 比率 1.2 1.8 +50%

分析

  • ✅ 多时间框架胜率更高(过滤了假信号)
  • ✅ 交易次数减少(质量 > 数量)
  • ✅ 回撤更小(顺势交易)
  • ✅ 风险调整收益更好(Sharpe 提升)

5.3 常见问题排查

问题 1:1h 指标全是 NaN

# 原因:startup_candle_count 不够

# 解决:
startup_candle_count = 200  # 至少要能加载足够的 1h 数据
# 如果 1h 用 EMA 200,需要 200 × 12 = 2400 根 5m K 线
Enter fullscreen mode Exit fullscreen mode

问题 2:信号不触发

# 调试:打印条件检查
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    # 分别检查每个条件
    cond1 = dataframe['ema_50_1h'] > dataframe['ema_200_1h']
    cond2 = dataframe['adx_1h'] > 25
    cond3 = qtpylib.crossed_above(dataframe['ema_fast'], dataframe['ema_slow'])

    print(f"Condition 1 (1h trend): {cond1.sum()} / {len(cond1)}")
    print(f"Condition 2 (1h ADX): {cond2.sum()} / {len(cond2)}")
    print(f"Condition 3 (5m cross): {cond3.sum()} / {len(cond3)}")

    # ... 继续
Enter fullscreen mode Exit fullscreen mode

问题 3:回测很慢

# 原因:加载大量历史数据

# 优化:
1. 只在需要的时间框架添加指标
2. 减少 startup_candle_count在合理范围内
3. 使用更短的回测周期先验证
4. 避免在 informative 函数中做复杂计算
Enter fullscreen mode Exit fullscreen mode

📝 实践任务

任务 1:实现基础多时间框架策略

基于本课的 MTFTrendStrategy

  1. 复制代码到你的环境
  2. 下载 5m、15m、1h 数据
  3. 回测 3 个月
  4. 生成图表分析信号

任务 2:修改和优化

修改 MTFTrendStrategy

  1. 改变时间框架组合(如 15m + 5m + 1m)
  2. 调整 1h 的趋势判断条件
  3. 修改 15m 的回调标准
  4. 对比修改前后的表现

任务 3:开发反向策略

开发一个做空策略(空头多时间框架):

  • 1h:确认下跌趋势
  • 15m:等待反弹
  • 5m:死叉入场做空

提示:需要在 config.json 中启用做空。

任务 4:性能对比实验

创建三个版本的策略:

  • 版本 A:只用 5m
  • 版本 B:5m + 1h
  • 版本 C:5m + 15m + 1h

在相同数据上回测,对比:

  • 哪个版本胜率最高?
  • 哪个版本最大回撤最小?
  • 哪个版本 Sharpe 最高?
  • 结论:多一个时间框架就一定更好吗?

📌 核心要点

多时间框架的核心原则

1. 大周期看趋势,小周期找入场
   - 1h 判断方向
   - 15m 等待机会
   - 5m 精确入场

2. 顺势而为
   - 只在大周期趋势方向交易
   - 小周期逆势是找入场点,不是做反向

3. 过滤假信号
   - 大周期确认减少噪音
   - 提高信号质量

4. 耐心等待
   - 所有时间框架条件都满足才入场
   - 宁可错过,不可错做
Enter fullscreen mode Exit fullscreen mode

时间框架选择

波段交易:4h + 1h + 15m
日内交易:1h + 15m + 5m  ⭐ 推荐
短线交易:15m + 5m + 1m
超短线:5m + 1m + 30s(不推荐新手)
Enter fullscreen mode Exit fullscreen mode

常见错误

❌ 时间框架太接近(5m + 3m + 1m)
❌ 使用太多时间框架(>3 个)
❌ 小周期逆势交易
❌ 忽视大周期趋势
❌ startup_candle_count 不足
Enter fullscreen mode Exit fullscreen mode

🎯 下节预告

第 28 课:高频交易与网格策略

在下一课中,我们将学习:

  • 高频交易的原理和实现
  • 网格交易策略
  • 套利策略
  • 特殊策略类型

多时间框架是提升策略质量的核心技术,掌握后可以显著提高胜率和稳定性!


🎓 学习建议

  1. 循序渐进:先掌握 2 个时间框架,再尝试 3 个
  2. 理解原理:知道为什么要用多时间框架
  3. 实际测试:对比单一和多时间框架的差异
  4. 保持简单:不要过度复杂化
  5. 重视大周期:大周期趋势是最重要的

记住:多时间框架不是为了复杂,而是为了更清晰地看懂市场。大周期定方向,小周期找时机。

Top comments (0)