1818 字
9 分钟

核心概念理解

交易策略是什么?#

策略的定义#

交易策略是一套明确的规则体系,用于决定:

  • 何时买入(入场时机)
  • 何时卖出(出场时机)
  • 如何控制风险(止损止盈)

在 Freqtrade 中,策略是一个 Python 类,继承自 IStrategy 基类。

策略的三要素#

1. 入场规则(Entry Logic)#

定义什么条件下应该开仓买入。例如:

  • 短期均线上穿长期均线(金叉)
  • RSI 指标从超卖区域反弹
  • 价格突破前期高点

2. 出场规则(Exit Logic)#

定义什么条件下应该平仓卖出。例如:

  • 短期均线下穿长期均线(死叉)
  • RSI 指标进入超买区域
  • 达到预设的止盈/止损目标

3. 风险管理(Risk Management)#

控制每笔交易的风险暴露:

  • 仓位大小:每笔交易投入多少资金
  • 止损设置:最大可接受的亏损
  • 止盈设置:分阶段获利退出
  • 最大持仓数:同时持有多少个交易对

策略的类型#

策略类型特点适用市场代表策略
趋势跟踪追随市场方向趋势明显的牛市/熊市MovingAverageCrossStrategy
均值回归价格回归均值震荡市、箱体整理MeanReversionStrategy
突破策略价格突破关键位区间突破后的趋势BreakoutTrendStrategy
动量策略强者恒强单边快速行情MomentumTrendStrategy

策略生命周期#

Terminal window
设计 编码 回测 优化 模拟 实盘 监控 调整
└───────────────── 循环迭代 ─────────────────────┘

技术指标入门#

技术指标是通过数学计算从价格、成交量等数据中提取的辅助信息,用于判断市场趋势和时机。

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 和 EMA50
dataframe['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,确认上涨趋势

代码示例

# 计算 RSI
dataframe['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 柱状图放大:趋势加速

代码示例

# 计算 MACD
macd = 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'] = 1

Strategy001 信号解析#

买入逻辑

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 = True
trailing_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 = True
trailing_stop_positive = 0.005 # 0.5% 后启用
minimal_roi = {
"0": 0.08,
"20": 0.04,
"40": 0.02
}

保守型

stoploss = -0.10 # 10% 止损
trailing_stop = False
minimal_roi = {
"0": 0.15,
"60": 0.08,
"120": 0.05,
"240": 0.02
}

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
核心概念理解
https://blog.smyb.fun/posts/aitrade/03_核心概念理解/
作者
三木羽冰
发布于
2026-01-03
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-01-03,距今已过 46 天

部分内容可能已过时

Profile Image of the Author
三木羽冰
嵌言片语
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
21
分类
3
标签
6
总字数
24,212
运行时长
0
最后活动
0 天前

目录