
多时间框架波浪趋势跟踪器策略是一种基于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
策略在三个时间框架上应用WaveTrend指标:
入场条件:
止损和出场机制采用复合方式:
策略记录并追踪每笔交易的入场价格、入场柱号以及最大收益率,这些参数用于动态调整出场点位。
多时间框架协同:通过在不同时间框架上分析WaveTrend指标,策略能够更全面地把握市场趋势,减少假信号干扰,提高交易准确性。低时间框架提供精确入场点,高时间框架确保交易方向与主趋势一致。
动态止损机制:策略采用三重止损保护系统,包括固定百分比止损、基于盈利的追踪止损以及最大收益保护机制。这种复合止损策略能够在保护资金的同时,最大限度地捕获趋势中的收益。
视觉反馈系统:交易入场和出场点通过彩色标签(🟢🔴❅❄)直观地标记在图表上,并包含柱号信息,便于回测分析和交易复盘。
参数灵活可调:策略提供多个可自定义的参数,包括追踪止损触发百分比、追踪跟随百分比和最大允许回撤百分比,使用者可根据自身风险偏好和市场状况进行调整。
代码结构清晰:策略采用函数化设计,各部分逻辑分明,易于理解和维护,同时也便于进一步优化和扩展。
趋势转折反应滞后:作为一种趋势跟随策略,在趋势转折点可能会有滞后反应,导致在行情逆转时出现较大回撤。解决方法是调整追踪止损参数或增加额外的趋势转折指标作为辅助。
波动市场表现欠佳:在横盘整理或剧烈波动的市场环境中,策略可能会产生频繁的假信号和止损,导致连续亏损。建议在确认市场处于明显趋势中时才启用该策略。
参数敏感性:策略表现对WaveTrend的参数设置(n1=10, n2=21)以及止损参数相当敏感。过松的参数可能导致过晚止损,过紧的参数则可能过早退出有利趋势。需要通过历史回测来优化这些参数。
流动性风险:代码中默认使用相对资金量(10%)进行交易,但在低流动性市场中,这可能导致滑点增加或成交困难。应根据实际交易品种的流动性状况调整仓位大小。
请求外部数据依赖:策略使用request.security()函数获取更高时间框架数据,这在某些交易平台上可能存在延迟或数据不可用的风险。需确保交易环境支持多时间框架数据请求。
动态参数调整:当前策略使用固定的WaveTrend参数和止损比例,可考虑根据市场波动性(如ATR)动态调整这些参数。例如,在高波动环境中增加止损距离,在低波动环境中收紧止损,以适应不同市场条件。
增加趋势强度过滤:可以添加ADX或类似指标来衡量趋势强度,只在趋势强度超过特定阈值时才执行交易,避免在弱趋势或横盘市场中产生过多交易。
优化时间框架选择:当前策略使用15分钟、30分钟和60分钟时间框架,可以通过回测分析找出最优的时间框架组合,或者根据不同交易品种的特性调整时间框架。
加入交易量确认:将成交量指标整合到入场条件中,确保只在成交量支撑的趋势中入场,提高信号质量。
改进出场机制:当前的出场主要依赖止损触发,可以考虑添加利润目标或基于WaveTrend指标本身的反向信号作为主动出场条件,而不仅仅依赖被动止损。
增加仓位管理逻辑:目前策略使用固定百分比的资金管理,可以考虑基于波动性或信号强度动态调整仓位大小,在更有把握的交易中增加仓位,在不确定性较高的交易中减少风险敞口。
多时间框架波浪趋势跟踪器策略是一个设计精良的趋势跟踪系统,通过多时间框架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 := ""