Hullfilter-Strategie für den gleitenden Durchschnitt

Schriftsteller:ChaoZhang, Datum: 2024-01-04 15:16:34
Tags:

img

Übersicht

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.

Strategie Logik

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.

Analyse der Vorteile

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.

Risikoanalyse

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.

Optimierung

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.

Zusammenfassung

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)


Mehr