1818 字
9 分钟
核心概念理解
交易策略是什么?
策略的定义
交易策略是一套明确的规则体系,用于决定:
- 何时买入(入场时机)
- 何时卖出(出场时机)
- 如何控制风险(止损止盈)
在 Freqtrade 中,策略是一个 Python 类,继承自 IStrategy 基类。
策略的三要素
1. 入场规则(Entry Logic)
定义什么条件下应该开仓买入。例如:
- 短期均线上穿长期均线(金叉)
- RSI 指标从超卖区域反弹
- 价格突破前期高点
2. 出场规则(Exit Logic)
定义什么条件下应该平仓卖出。例如:
- 短期均线下穿长期均线(死叉)
- RSI 指标进入超买区域
- 达到预设的止盈/止损目标
3. 风险管理(Risk Management)
控制每笔交易的风险暴露:
- 仓位大小:每笔交易投入多少资金
- 止损设置:最大可接受的亏损
- 止盈设置:分阶段获利退出
- 最大持仓数:同时持有多少个交易对
策略的类型
| 策略类型 | 特点 | 适用市场 | 代表策略 |
|---|---|---|---|
| 趋势跟踪 | 追随市场方向 | 趋势明显的牛市/熊市 | MovingAverageCrossStrategy |
| 均值回归 | 价格回归均值 | 震荡市、箱体整理 | MeanReversionStrategy |
| 突破策略 | 价格突破关键位 | 区间突破后的趋势 | BreakoutTrendStrategy |
| 动量策略 | 强者恒强 | 单边快速行情 | MomentumTrendStrategy |
策略生命周期
设计 → 编码 → 回测 → 优化 → 模拟 → 实盘 → 监控 → 调整 ↑ ↓ └───────────────── 循环迭代 ─────────────────────┘技术指标入门
技术指标是通过数学计算从价格、成交量等数据中提取的辅助信息,用于判断市场趋势和时机。
1. 移动平均线(Moving Average)
EMA - 指数移动平均线
给予近期价格更高权重的平均值。
计算方式:
EMA_today = (Price_today × K) + (EMA_yesterday × (1 - K))其中 K = 2 / (N + 1),N 为周期应用场景:
- EMA20 上穿 EMA50:金叉(Golden Cross),看涨信号
- EMA20 下穿 EMA50:死叉(Death Cross),看跌信号
- 价格在 EMA 上方:趋势向上
- 价格在 EMA 下方:趋势向下
代码示例:
# 计算 EMA20 和 EMA50dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20)dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)
# 判断金叉golden_cross = qtpylib.crossed_above(dataframe['ema20'], dataframe['ema50'])SMA - 简单移动平均线
所有价格权重相同的平均值。
特点:
- 对价格变化反应较慢
- 更平滑,噪音更少
- 适合长周期趋势判断
2. 相对强弱指标(RSI)
定义:衡量价格上涨动能与下跌动能的比率,范围 0-100。
计算方式:
RSI = 100 - [100 / (1 + RS)]其中 RS = 平均上涨幅度 / 平均下跌幅度标准解读:
- RSI > 70:超买区域,可能回调
- RSI < 30:超卖区域,可能反弹
- RSI 50:中性位置
高级用法:
- RSI 背离:价格创新高但 RSI 未创新高,趋势可能反转
- RSI 突破 50:从下向上突破 50,确认上涨趋势
代码示例:
# 计算 RSIdataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
# 超卖反弹信号oversold_bounce = (dataframe['rsi'] < 30) & (dataframe['rsi'].shift(1) < dataframe['rsi'])3. 布林带(Bollinger Bands)
定义:由中轨(均线)和上下轨(±2倍标准差)组成的通道指标。
组成部分:
- 中轨:20 日 SMA
- 上轨:中轨 + 2 × 标准差
- 下轨:中轨 - 2 × 标准差
交易信号:
- 价格触及下轨:可能反弹(均值回归)
- 价格触及上轨:可能回调
- 布林带收窄:波动率降低,酝酿突破
- 布林带扩张:波动率增加,趋势确立
代码示例:
# 计算布林带bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2)dataframe['bb_lowerband'] = bollinger['lower']dataframe['bb_middleband'] = bollinger['mid']dataframe['bb_upperband'] = bollinger['upper']
# 价格触及下轨touch_lower = dataframe['close'] <= dataframe['bb_lowerband']4. MACD(Moving Average Convergence Divergence)
定义:通过快速和慢速 EMA 的差值判断趋势动能。
组成部分:
- MACD 线:EMA12 - EMA26
- 信号线:MACD 的 9 日 EMA
- 柱状图:MACD - 信号线
交易信号:
- MACD 上穿信号线:买入信号
- MACD 下穿信号线:卖出信号
- MACD 为正:短期趋势强于长期
- MACD 柱状图放大:趋势加速
代码示例:
# 计算 MACDmacd = ta.MACD(dataframe)dataframe['macd'] = macd['macd']dataframe['macdsignal'] = macd['macdsignal']dataframe['macdhist'] = macd['macdhist']
# MACD 金叉macd_cross = qtpylib.crossed_above(dataframe['macd'], dataframe['macdsignal'])买入/卖出信号原理
信号生成逻辑
在 Freqtrade 中,信号通过在 DataFrame 中设置标志位生成:
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( # 条件1 (dataframe['ema20'] > dataframe['ema50']) & # 条件2 (dataframe['rsi'] > 30) & # 条件3 (dataframe['volume'] > 0) ), 'enter_long'] = 1 # 标记买入信号
return dataframe多条件组合
与逻辑(AND)
所有条件都必须满足:
# 金叉 AND RSI 超卖 AND 成交量放大(golden_cross) & (dataframe['rsi'] < 30) & (dataframe['volume'] > volume_mean)或逻辑(OR)
任意条件满足即可:
# RSI 超卖 OR 布林带下轨(dataframe['rsi'] < 30) | (dataframe['close'] <= dataframe['bb_lowerband'])信号确认
为避免假信号,通常需要多重确认:
示例:趋势确认 + 动能确认
dataframe.loc[ ( # 趋势确认:价格在 EMA20 上方 (dataframe['close'] > dataframe['ema20']) & # 动能确认:MACD 为正 (dataframe['macd'] > 0) & # 超卖反弹:RSI 从 30 以下回升 (dataframe['rsi'] > 30) & (dataframe['rsi'].shift(1) <= 30) ), 'enter_long'] = 1Strategy001 信号解析
买入逻辑
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( # 条件1: EMA20 上穿 EMA50(金叉) qtpylib.crossed_above(dataframe['ema20'], dataframe['ema50']) & # 条件2: Heikin-Ashi 收盘价大于 EMA20 (dataframe['ha_close'] > dataframe['ema20']) & # 条件3: Heikin-Ashi 开盘价小于 Heikin-Ashi 收盘价(绿色 K 线) (dataframe['ha_open'] < dataframe['ha_close']) ), 'enter_long'] = 1
return dataframe卖出逻辑
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( # 条件1: EMA50 上穿 EMA100(金叉) qtpylib.crossed_above(dataframe['ema50'], dataframe['ema100']) & # 条件2: Heikin-Ashi 收盘价小于 EMA20 (dataframe['ha_close'] < dataframe['ema20']) & # 条件3: Heikin-Ashi 开盘价大于 Heikin-Ashi 收盘价(红色 K 线) (dataframe['ha_open'] > dataframe['ha_close']) ), 'exit_long'] = 1 return dataframe止损和止盈设置
固定止损(Stop Loss)
在策略类中设置固定百分比:
stoploss = -0.05 # 5% 止损优点:
- 简单明确
- 风险可控
缺点:
- 不考虑市场波动
- 可能被正常波动止损
动态止损(Trailing Stop)
随价格上涨而上移的止损:
trailing_stop = Truetrailing_stop_positive = 0.01 # 盈利 1% 后启用trailing_stop_positive_offset = 0.02 # 启用时,止损距当前价格 2%trailing_only_offset_is_reached = True工作原理:
买入价格:$100盈利 1% 后($101)启用跟踪止损当前价格 $105,止损设在 $105 - 2% = $102.90价格上涨到 $110,止损上移到 $110 - 2% = $107.80价格回落到 $107.79,触发止损,锁定 7.79% 利润ROI 梯度止盈
通过时间梯度设置不同的止盈目标:
minimal_roi = { "0": 0.10, # 立即达到 10% 利润就退出 "30": 0.05, # 30 分钟后,5% 利润退出 "60": 0.02, # 60 分钟后,2% 利润退出 "120": 0.01 # 120 分钟后,1% 利润退出}逻辑示例:
- 买入后 5 分钟内涨到 10%:立即卖出
- 持有 40 分钟,涨到 6%:卖出(触发 30 分钟的 5% 目标)
- 持有 90 分钟,涨到 3%:卖出(触发 60 分钟的 2% 目标)
自定义退出信号
除了 ROI 和止损,还可以通过信号主动退出:
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( # 死叉:EMA20 下穿 EMA50 qtpylib.crossed_below(dataframe['ema20'], dataframe['ema50']) | # RSI 超买 (dataframe['rsi'] > 70) ), 'exit_long'] = 1
return dataframe止损止盈组合策略
激进型:
stoploss = -0.03 # 3% 止损trailing_stop = Truetrailing_stop_positive = 0.005 # 0.5% 后启用minimal_roi = { "0": 0.08, "20": 0.04, "40": 0.02}保守型:
stoploss = -0.10 # 10% 止损trailing_stop = Falseminimal_roi = { "0": 0.15, "60": 0.08, "120": 0.05, "240": 0.02}支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
最后更新于 2026-01-03,距今已过 46 天
部分内容可能已过时