第 27 课:多时间框架策略
⏱ 课时:2 小时
🎯 学习目标:学会开发多周期确认策略,提高信号质量和稳定性
课程概述
单一时间框架的策略容易产生假信号。使用多时间框架分析(Multi-Timeframe Analysis, MTF)可以:
- ✅ 提高信号质量
- ✅ 减少假突破
- ✅ 提升胜率
- ✅ 更好地把握市场趋势
核心理念:
大周期看趋势,小周期找入场。
第一部分:多时间框架理论
1.1 为什么需要多时间框架
单一时间框架的局限
问题 1:视野狭窄
- 5 分钟图看起来是上涨
- 但 1 小时图可能是下跌趋势中的反弹
- 容易逆势交易
问题 2:假信号频繁
- 小周期噪音多
- 频繁的金叉死叉
- 多数是假突破
问题 3:缺乏大局观
- 不知道当前处于趋势的哪个阶段
- 容易在趋势末期入场
- 止损频繁触发
多时间框架的优势
优势 1:趋势确认
- 1 小时图确认上涨趋势
- 5 分钟图寻找回调买点
- 顺势交易,成功率高
优势 2:过滤噪音
- 大周期过滤小周期的假信号
- 只在趋势方向交易
- 减少无效交易
优势 3:更好的风险回报
- 大趋势支持,可以持仓更久
- 盈利空间更大
- 回撤更小
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 个周期足够)
1.3 三层决策模型
┌─────────────────────────────────────────┐
│ 第一层:大周期(趋势判断) │
│ 作用:判断整体趋势方向 │
│ 指标:EMA 50/200, ADX, MACD │
│ 决策:只做多?只做空?观望? │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 第二层:中周期(信号确认) │
│ 作用:确认趋势延续,寻找机会 │
│ 指标:EMA 20/50, RSI, Stochastic │
│ 决策:趋势强度如何?是否有入场机会? │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 第三层:小周期(精确入场) │
│ 作用:寻找最佳入场点 │
│ 指标:EMA 9/21, RSI, 价格行为 │
│ 决策:现在入场还是等待? │
└─────────────────────────────────────────┘
第二部分: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
关键点:
- 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
第三部分:实战策略案例
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
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
第四部分:进阶技巧
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
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
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
第五部分:测试和优化
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
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
# 对比结果
典型结果对比:
| 指标 | 单一 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 线
问题 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)}")
# ... 继续
问题 3:回测很慢
# 原因:加载大量历史数据
# 优化:
1. 只在需要的时间框架添加指标
2. 减少 startup_candle_count(在合理范围内)
3. 使用更短的回测周期先验证
4. 避免在 informative 函数中做复杂计算
📝 实践任务
任务 1:实现基础多时间框架策略
基于本课的 MTFTrendStrategy:
- 复制代码到你的环境
- 下载 5m、15m、1h 数据
- 回测 3 个月
- 生成图表分析信号
任务 2:修改和优化
修改 MTFTrendStrategy:
- 改变时间框架组合(如 15m + 5m + 1m)
- 调整 1h 的趋势判断条件
- 修改 15m 的回调标准
- 对比修改前后的表现
任务 3:开发反向策略
开发一个做空策略(空头多时间框架):
- 1h:确认下跌趋势
- 15m:等待反弹
- 5m:死叉入场做空
提示:需要在 config.json 中启用做空。
任务 4:性能对比实验
创建三个版本的策略:
- 版本 A:只用 5m
- 版本 B:5m + 1h
- 版本 C:5m + 15m + 1h
在相同数据上回测,对比:
- 哪个版本胜率最高?
- 哪个版本最大回撤最小?
- 哪个版本 Sharpe 最高?
- 结论:多一个时间框架就一定更好吗?
📌 核心要点
多时间框架的核心原则
1. 大周期看趋势,小周期找入场
- 1h 判断方向
- 15m 等待机会
- 5m 精确入场
2. 顺势而为
- 只在大周期趋势方向交易
- 小周期逆势是找入场点,不是做反向
3. 过滤假信号
- 大周期确认减少噪音
- 提高信号质量
4. 耐心等待
- 所有时间框架条件都满足才入场
- 宁可错过,不可错做
时间框架选择
波段交易:4h + 1h + 15m
日内交易:1h + 15m + 5m ⭐ 推荐
短线交易:15m + 5m + 1m
超短线:5m + 1m + 30s(不推荐新手)
常见错误
❌ 时间框架太接近(5m + 3m + 1m)
❌ 使用太多时间框架(>3 个)
❌ 小周期逆势交易
❌ 忽视大周期趋势
❌ startup_candle_count 不足
🎯 下节预告
第 28 课:高频交易与网格策略
在下一课中,我们将学习:
- 高频交易的原理和实现
- 网格交易策略
- 套利策略
- 特殊策略类型
多时间框架是提升策略质量的核心技术,掌握后可以显著提高胜率和稳定性!
🎓 学习建议:
- 循序渐进:先掌握 2 个时间框架,再尝试 3 个
- 理解原理:知道为什么要用多时间框架
- 实际测试:对比单一和多时间框架的差异
- 保持简单:不要过度复杂化
- 重视大周期:大周期趋势是最重要的
记住:多时间框架不是为了复杂,而是为了更清晰地看懂市场。大周期定方向,小周期找时机。
Top comments (0)