多时间框架波浪趋势跟踪器策略

WT MTF WaveTrend ATR Trailing Stop TREND-FOLLOWING HLC3
创建日期: 2025-07-07 16:04:18 最后修改: 2025-07-07 16:04:18
复制: 0 点击次数: 233
avatar of ianzeng123 ianzeng123
2
关注
319
关注者

多时间框架波浪趋势跟踪器策略 多时间框架波浪趋势跟踪器策略

概述

多时间框架波浪趋势跟踪器策略是一种基于WaveTrend指标的多时间框架趋势跟踪交易系统。该策略特别针对15分钟时间框架进行了优化,采用三层时间框架对齐方法:240分钟WaveTrend作为宏观趋势过滤器,30分钟WaveTrend用于动量确认,而15分钟WaveTrend则负责信号生成。策略核心在于通过识别不同时间框架上的WaveTrend指标交叉来确定入场和出场点,同时结合先进的追踪止损机制,包括基于最大收益的跟踪逻辑和基于百分比的回撤容忍度,以最大化盈利并有效控制风险。

策略原理

该策略的核心原理是利用WaveTrend指标在多个时间框架上的协同作用来识别趋势方向和转折点。WaveTrend指标本身是通过计算价格与其指数移动平均线(EMA)之间的关系,再结合波动性因子来衡量价格超买超卖状态的技术指标。

策略实现过程如下: 1. 首先,定义WaveTrend函数,该函数计算两个主要值(wt1和wt2): - 计算价格(通常为HLC3)的EMA - 计算价格与EMA之间绝对差值的EMA,作为波动性衡量 - 构建归一化的相对价格偏离(ci) - 计算ci的EMA作为wt1,以及wt1的SMA作为wt2

  1. 策略在三个时间框架上应用WaveTrend指标:

    • 15分钟图表(当前时间框架)用于具体信号生成
    • 30分钟图表用于确认中期动量方向
    • 60分钟图表提供更长期的趋势背景
  2. 入场条件:

    • 做多:当15分钟图表上wt1向上穿越wt2,且wt1值大于-60,同时30分钟图表上趋势向上(wt1 > wt2)
    • 做空:当15分钟图表上wt1向下穿越wt2,且wt1值小于20,同时30分钟图表上趋势向下(wt1 < wt2)
  3. 止损和出场机制采用复合方式:

    • 固定百分比的边际止损(Marginal Stop)
    • 基于盈利触发的追踪止损(Trailing Stop)
    • 基于最大收益回撤的保护性止损(Maximum Drop Stop)
  4. 策略记录并追踪每笔交易的入场价格、入场柱号以及最大收益率,这些参数用于动态调整出场点位。

策略优势

  1. 多时间框架协同:通过在不同时间框架上分析WaveTrend指标,策略能够更全面地把握市场趋势,减少假信号干扰,提高交易准确性。低时间框架提供精确入场点,高时间框架确保交易方向与主趋势一致。

  2. 动态止损机制:策略采用三重止损保护系统,包括固定百分比止损、基于盈利的追踪止损以及最大收益保护机制。这种复合止损策略能够在保护资金的同时,最大限度地捕获趋势中的收益。

  3. 视觉反馈系统:交易入场和出场点通过彩色标签(🟢🔴❅❄)直观地标记在图表上,并包含柱号信息,便于回测分析和交易复盘。

  4. 参数灵活可调:策略提供多个可自定义的参数,包括追踪止损触发百分比、追踪跟随百分比和最大允许回撤百分比,使用者可根据自身风险偏好和市场状况进行调整。

  5. 代码结构清晰:策略采用函数化设计,各部分逻辑分明,易于理解和维护,同时也便于进一步优化和扩展。

策略风险

  1. 趋势转折反应滞后:作为一种趋势跟随策略,在趋势转折点可能会有滞后反应,导致在行情逆转时出现较大回撤。解决方法是调整追踪止损参数或增加额外的趋势转折指标作为辅助。

  2. 波动市场表现欠佳:在横盘整理或剧烈波动的市场环境中,策略可能会产生频繁的假信号和止损,导致连续亏损。建议在确认市场处于明显趋势中时才启用该策略。

  3. 参数敏感性:策略表现对WaveTrend的参数设置(n1=10, n2=21)以及止损参数相当敏感。过松的参数可能导致过晚止损,过紧的参数则可能过早退出有利趋势。需要通过历史回测来优化这些参数。

  4. 流动性风险:代码中默认使用相对资金量(10%)进行交易,但在低流动性市场中,这可能导致滑点增加或成交困难。应根据实际交易品种的流动性状况调整仓位大小。

  5. 请求外部数据依赖:策略使用request.security()函数获取更高时间框架数据,这在某些交易平台上可能存在延迟或数据不可用的风险。需确保交易环境支持多时间框架数据请求。

策略优化方向

  1. 动态参数调整:当前策略使用固定的WaveTrend参数和止损比例,可考虑根据市场波动性(如ATR)动态调整这些参数。例如,在高波动环境中增加止损距离,在低波动环境中收紧止损,以适应不同市场条件。

  2. 增加趋势强度过滤:可以添加ADX或类似指标来衡量趋势强度,只在趋势强度超过特定阈值时才执行交易,避免在弱趋势或横盘市场中产生过多交易。

  3. 优化时间框架选择:当前策略使用15分钟、30分钟和60分钟时间框架,可以通过回测分析找出最优的时间框架组合,或者根据不同交易品种的特性调整时间框架。

  4. 加入交易量确认:将成交量指标整合到入场条件中,确保只在成交量支撑的趋势中入场,提高信号质量。

  5. 改进出场机制:当前的出场主要依赖止损触发,可以考虑添加利润目标或基于WaveTrend指标本身的反向信号作为主动出场条件,而不仅仅依赖被动止损。

  6. 增加仓位管理逻辑:目前策略使用固定百分比的资金管理,可以考虑基于波动性或信号强度动态调整仓位大小,在更有把握的交易中增加仓位,在不确定性较高的交易中减少风险敞口。

总结

多时间框架波浪趋势跟踪器策略是一个设计精良的趋势跟踪系统,通过多时间框架WaveTrend指标的协同作用,结合灵活的追踪止损机制,有效地捕捉市场趋势并控制风险。该策略的主要优势在于其全面的市场视角和动态的风险管理方法,但在波动市场中可能面临挑战。通过进一步优化时间框架选择、动态参数调整以及增加额外的过滤条件,该策略有潜力成为一个更加稳健和适应性强的交易系统。对于专业交易者而言,这是一个值得深入研究和定制化开发的趋势跟踪框架。

策略源码
/*backtest
start: 2024-07-07 00:00:00
end: 2024-11-28 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("WT-FLOW: MTF WaveTrend Trend-Follower", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// === WaveTrend Fonksiyonu ===
waveTrend(_src, _n1, _n2) =>
    esa = ta.ema(_src, _n1)
    d = ta.ema(math.abs(_src - esa), _n1)
    ci = (_src - esa) / (0.015 * d)
    wt1 = ta.ema(ci, _n2)
    wt2 = ta.sma(wt1, 4)
    [wt1, wt2]

// === Giriş Fiyatı ve Maksimum Kazanç Değişkenleri ===
var float longEntryPrice = na
var float shortEntryPrice = na
var float maxGainLong = 0.0
var float maxGainShort = 0.0
var int longEntryBar = na
var int shortEntryBar = na
var string currentPosition = ""

// === WT Değerlerini Al (Farklı Zaman Dilimleri) ===
var int n1 = 10
var int n2 = 21
ap = hlc3
[wt1_15, wt2_15] = waveTrend(ap, n1, n2)
[wt1_30, wt2_30] = request.security(syminfo.tickerid, "30", waveTrend(ap, n1, n2))
[wt1_60, wt2_60] = request.security(syminfo.tickerid, "60", waveTrend(ap, n1, n2))

// === Kullanıcı Girdileri: Trailing Stop Parametreleri ===
marginStopPerc = input.float(2.0, "Marjinal Stop (%)")
trailTriggerPerc = input.float(1.5, "Trailing Tetikleyici (%)")
trailFollowPerc = input.float(0.8, "Trailing Takip (%)")
trailMaxDropPerc = input.float(3.0, "Maksimum Düşüş (%)")

// === ATR için tr hesaplaması ===
tr = ta.tr(true)

// === Sinyal Koşulları ===
trendUp = wt1_30 > wt2_30
trendDown = wt1_30 < wt2_30
entryLong = ta.crossover(wt1_15, wt2_15) and wt1_15 > -60 and trendUp
entryShort = ta.crossunder(wt1_15, wt2_15) and wt1_15 < 20 and trendDown

// === Pozisyon Girişleri ===
if entryLong and currentPosition != "Long"
    strategy.entry("Long", strategy.long)
    longEntryPrice := close
    maxGainLong := 0.0
    longEntryBar := bar_index
    currentPosition := "Long"
    label.new(bar_index, high + 2 * tr, "🟢 Giriş Long #" + str.tostring(bar_index), style=label.style_label_up, color=color.green, textcolor=color.white)

if entryShort and currentPosition != "Short"
    strategy.entry("Short", strategy.short)
    shortEntryPrice := close
    maxGainShort := 0.0
    shortEntryBar := bar_index
    currentPosition := "Short"
    label.new(bar_index, low - 2 * tr, "🔴 Giriş Short #" + str.tostring(bar_index), style=label.style_label_down, color=color.red, textcolor=color.white)

// === Trailing Stop ve Marjinal Stop Seviyeleri ===
if currentPosition == "Long" and not na(longEntryPrice)
    gainFromEntry = (close - longEntryPrice) / longEntryPrice * 100
    maxGainLong := math.max(maxGainLong, gainFromEntry)
    trailTriggerReached = gainFromEntry >= trailTriggerPerc
    trailStop = close * (1 - trailFollowPerc / 100)
    dropStop = longEntryPrice * (1 + (maxGainLong - trailMaxDropPerc) / 100)
    finalStop = trailTriggerReached ? math.max(trailStop, dropStop) : longEntryPrice * (1 - marginStopPerc / 100)
    if close <= finalStop
        strategy.close("Long")
        label.new(bar_index, low - 2 * tr, "❅ Çıkış Long #" + str.tostring(longEntryBar), style=label.style_label_down, color=color.red, textcolor=color.white)
        longEntryPrice := na
        longEntryBar := na
        currentPosition := ""

if currentPosition == "Short" and not na(shortEntryPrice)
    gainFromEntryShort = (shortEntryPrice - close) / shortEntryPrice * 100
    maxGainShort := math.max(maxGainShort, gainFromEntryShort)
    trailTriggerReachedShort = gainFromEntryShort >= trailTriggerPerc
    trailStopShort = close * (1 + trailFollowPerc / 100)
    dropStopShort = shortEntryPrice * (1 - (maxGainShort - trailMaxDropPerc) / 100)
    finalStopShort = trailTriggerReachedShort ? math.min(trailStopShort, dropStopShort) : shortEntryPrice * (1 + marginStopPerc / 100)
    if close >= finalStopShort
        strategy.close("Short")
        label.new(bar_index, high + 2 * tr, "❄ Çıkış Short #" + str.tostring(shortEntryBar), style=label.style_label_up, color=color.green, textcolor=color.white)
        shortEntryPrice := na
        shortEntryBar := na
        currentPosition := ""
相关推荐