资源加载中... loading...

基于突破和频率过滤的趋势跟踪策略(只做多)

Author: ChaoZhang, Date: 2024-05-28 14:00:24
Tags: EMAAO

 基于突破和频率过滤的趋势跟踪策略(只做多)

概述

该策略是一个基于突破和频率过滤的趋势跟踪策略,只进行多头交易。策略的主要思路是利用EMA指标判断当前趋势方向,在价格突破一定区间内的最高价时产生做多信号,同时使用频率过滤器来控制交易频率,避免过于频繁开仓。策略还设置了止损点来控制风险,并在趋势结束时平仓。

策略原理

  1. 计算EMA指标,用于判断当前趋势方向。当收盘价在EMA之上时,认为当前趋势是多头。
  2. 计算一定区间内的最高价,作为突破条件。当收盘价突破最短回溯期或最长回溯期内的最高价,并且当前趋势为多头时,产生做多信号。
  3. 引入频率过滤器,控制连续开仓的最小间隔时间,避免交易频率过高。
  4. 设置止损点,当价格跌破止损价时平仓,控制风险。
  5. 定义趋势结束信号,当收盘价跌破EMA时,认为趋势结束,此时如果持有多单则平仓。

策略优势

  1. 趋势跟踪:通过EMA指标判断趋势方向,顺应趋势交易,有助于提高策略收益。
  2. 突破确认:使用价格突破作为入场信号,能够在趋势初期就及时入场,捕捉更多的利润空间。
  3. 频率控制:引入频率过滤器,控制连续开仓的时间间隔,避免过于频繁交易,减少交易成本和风险。
  4. 止损保护:设置止损点,当价格反向波动达到一定幅度时及时止损,有效控制下行风险。
  5. 动态平仓:根据趋势结束信号动态平仓,能够及时锁定已有收益,避免趋势反转带来的损失。

策略风险

  1. 参数敏感:策略的表现对参数选择较为敏感,不同的参数设置可能导致策略表现差异较大。需要对参数进行充分的回测和优化。
  2. 突破失败:价格突破并不能保证趋势一定会延续,有可能出现突破失败的情况,导致策略出现连续亏损。
  3. 趋势识别:策略依赖EMA指标判断趋势,但EMA指标可能出现滞后或误判的情况,影响策略的准确性。
  4. 频繁交易:尽管策略引入了频率过滤器,但在市场波动较大时,仍可能出现频繁开仓平仓的情况,增加交易成本。
  5. 止损风险:止损点的设置可能无法完全避免策略的最大回撤,在极端行情下仍有可能出现较大亏损。

策略优化方向

  1. 参数优化:对策略的关键参数如EMA长度、回溯期长度、止损百分比等进行优化,寻找最佳参数组合,提高策略稳定性和收益性。
  2. 信号过滤:在突破信号产生后,可以引入其他技术指标或条件对信号进行二次确认,提高信号质量,减少误判和虚假信号。
  3. 趋势判断:可以尝试使用其他趋势判断指标如MACD、DMI等,或者结合多个指标共同判断趋势,提高趋势识别的准确性。
  4. 动态止损:根据市场波动情况动态调整止损点,例如使用ATR指标计算动态止损价,或者引入追踪止损策略,更好地控制风险。
  5. 头寸管理:优化头寸管理策略,根据市场波动和账户资金情况动态调整头寸大小,控制单笔交易风险敞口,提高资金利用效率。

总结

该策略是一个基于突破和频率过滤的趋势跟踪策略,通过EMA指标判断趋势方向,使用价格突破作为入场信号,同时引入频率过滤器控制交易频率,并设置止损点控制风险。策略的优势在于趋势跟踪、突破确认、频率控制、止损保护和动态平仓,但同时也存在参数敏感、突破失败、趋势识别、频繁交易和止损风险等潜在风险。为进一步优化策略,可以从参数优化、信号过滤、趋势判断、动态止损和头寸管理等方面入手,提高策略的稳定性和盈利能力。


/*backtest
start: 2023-05-22 00:00:00
end: 2024-05-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trend Following with Breakout and Frequency Filter (Long Only)", overlay=true)

// 输入参数
emaLength = input.int(50, title="EMA长度")
lookbackPeriodMin = input.int(80, title="最短回溯期")
lookbackPeriodMax = input.int(120, title="最长回溯期")
stopLossPct = input.float(2, title="止损百分比") / 100  // 止损百分比
minHoldBars = input.int(10, title="最小持仓K线数量")  // 最小持仓K线数量

// 计算EMA
ema = ta.ema(close, emaLength)

// 计算最高价和最低价
highestHigh = ta.highest(high, lookbackPeriodMax)
lowestLow = ta.lowest(low, lookbackPeriodMax)

// 定义趋势方向
isBullish = close > ema

// 定义突破信号
breakoutCondition = (ta.crossover(close, highestHigh[lookbackPeriodMin]) or ta.crossover(close, highestHigh[lookbackPeriodMax])) and isBullish

// 计算止损点
stopLossLevelLong = close * (1 - stopLossPct)

// 绘制EMA
plot(ema, title="EMA", color=color.blue)

// 记录上次开仓时间
var float lastEntryTime = na

// 策略执行并标注信号
if (breakoutCondition and (na(lastEntryTime) or (time - lastEntryTime) > minHoldBars * timeframe.multiplier))
    strategy.entry("做多", strategy.long)
    label.new(bar_index, high, text="买入", style=label.style_label_up, color=color.green, textcolor=color.white)
    strategy.exit("止损", from_entry="做多", stop=stopLossLevelLong)
    lastEntryTime := time

// 定义趋势结束信号
exitCondition = close < ema

if (exitCondition and (strategy.position_size > 0) and (time - lastEntryTime) > minHoldBars * timeframe.multiplier)
    strategy.close("做多")
    label.new(bar_index, low, text="卖出", style=label.style_label_down, color=color.red, textcolor=color.white)

相关内容

更多内容