Diese Strategie verwendet kurzfristige und langfristige Hull- gleitende Durchschnitte, um Handelssignale zu generieren und zu filtern. Der kurzfristige Hull-gleitende Durchschnitt wird zur Generierung von Signalen verwendet, während der langfristige Hull-gleitende Durchschnitt zum Filtern von Signalen verwendet wird. Trades werden nur getätigt, wenn der kurzfristige Hull-gleitende Durchschnitt die Richtung ändert und der langfristige Hull-gleitende Durchschnitt sich in der gleichen Gesamtrichtung bewegt.
Die Strategie verwendet auch den ATR-Indikator, um beim Eintritt in Trades dynamisch Stop Loss- und Gewinnniveaus festzulegen.
Der kurzfristige gleitende Durchschnitt von Hull erfasst kurzfristige Kursentwicklungen und Wendepunkte.
Der langfristige gleitende Durchschnitt von Hull bestimmt die allgemeine Preisentwicklung.
Der Handel erfolgt nur, wenn sich der kurzfristige gleitende Durchschnitt umdreht und seine neue Richtung mit der Richtung des langfristigen gleitenden Durchschnitts abgestimmt.
Nach dem Eintreten von Positionen werden Stop-Loss- und Take-Profit-Levels auf der Grundlage des ATR-Indikatorwerts festgelegt. Der ATR spiegelt die Volatilität des Marktes und die Risikoniveaus wider. Der Stop-Loss wird unter den Preistiefpunkten platziert, während die Take-Profit-Zielwerte die Preishochpunkte erreichen, wobei die Bereiche an die aktuelle ATR-Lese gebunden sind.
Durch die Kombination von kurzfristigen Signalen und langfristigen Filtern werden mittelfristige Trends und Wendepunkte effektiv ermittelt und falsche Signale aus Marktlärm vermieden.
Dynamische Stop-Loss- und Take-Profit-Regelungen auf der Grundlage von ATR setzen angemessene Bereiche auf der Grundlage der aktuellen Volatilität, des Ausgleichs von Profittaking und der Verhinderung von Verlusten fest.
Der gleitende Durchschnitt von Hull hat gegenüber den gängigen gleitenden Durchschnitten Flexibilität und Genauigkeit und eine bessere Trendverfolgung.
Die Strategie beruht auf Kreuzungen zwischen den gleitenden Durchschnitten von Hull, um Signale zu erzeugen.
In einer Bandbreite können sich unruhige Märkte mit Preisschwankungen in einer Handelsspanne, Signalfehler und unnötige Trades ansammeln. Dies kann vermieden werden, indem Signale mit breiteren Bedingungen während solcher Märkte gefiltert werden.
Die Abhängigkeit von ATR bedeutet, dass ungenaue Volatilitätswerte zu einer schlechten Platzierung führen.
Zusätzliche kurzfristige Indikatoren wie der RSI können die Signalgenauigkeit durch Konvergenz verbessern.
Die Filterlogik zwischen den gleitenden Durchschnitten des Hulls kann verbessert werden, um strengere Eintrittsanforderungen zu haben und falsche Signale zu vermeiden.
Die Parameter-Tuning-Forschung kann Stabilitäts- und Rentabilitätsverbesserungen durch Änderungen der gleitenden Durchschnittslängen, der ATR-Perioden usw. aufdecken.
Diese Strategie kombiniert kurzfristige Signalgenerierung, langfristige Signalfilterung und ATR-basierte Stop-Loss/Take-Profit in einem robusten mittelfristigen Trend-Folge-Framework.
/*backtest start: 2023-12-04 00:00:00 end: 2024-01-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0) // Parameters for Hull Moving Averages src = input(close, title="Source") signal_period = input(50, title="Period of signal HMA") filter_period = input(200, title="Period of filter HMA") strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"]) // Set allowed trading directions strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all strategy.risk.allow_entry_in(strat_dir_value) // stop loss and take profit sl_factor = input(2,title="Stop Loss Factor") tp_factor = input(3,title="Take Profit Factor") atr_period = input(14, title="ATR Period (SL/TP)") // Testing Start dates testStartYear = input(2010, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) //Stop date if you want to use a specific range of dates testStopYear = input(2030, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // ----------------------------------------------------------------------------- // Global variables // ----------------------------------------------------------------------------- var float tp = na var float sl = na var float position = na // ----------------------------------------------------------------------------- // Functions // ----------------------------------------------------------------------------- testWindow() => time >= testPeriodStart and time <= testPeriodStop ? true : false // ----------------------------------------------------------------------------- // The engine // ----------------------------------------------------------------------------- hma_signal = hma(src, signal_period) hma_filter = hma(src, filter_period) // Used to determine exits and stop losses atr_e = atr(atr_period) // if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0 trend = hma_filter > hma_filter[1] ? 1 : hma_filter < hma_filter[1] ? -1 : 0 signal = hma_signal > hma_signal[1] ? 1 : hma_signal < hma_signal[1] ? -1 : 0 // ----------------------------------------------------------------------------- // signals // ----------------------------------------------------------------------------- if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow() sl := close - sl_factor*atr_e tp := close + tp_factor*atr_e strategy.entry("HMA_LNG", strategy.long) strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e) if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow() sl := close + sl_factor*atr_e tp := close - tp_factor*atr_e strategy.entry("HMA_SHRT", strategy.short) strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e) if strategy.position_size != 0 sl := sl[1] tp := tp[1] // ----------------------------------------------------------------------------- // PLOT // ----------------------------------------------------------------------------- hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red) hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red) plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1) plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)