Anpassungsfähige Handelsstrategie für gleitende Durchschnitte

Schriftsteller:ChaoZhang, Datum: 2024-02-22 17:09:39
Tags:

img

Übersicht

Diese Strategie ist eine Trendfolgestrategie, die auf adaptiven gleitenden Durchschnitten basiert. Sie verwendet zwei DEMA-gleitende Durchschnitte mit verschiedenen Perioden, um Handelssignale zu generieren. Die Strategie passt den Zeitrahmen für die Analyse automatisch an den aktuellen Zeitraum an und ermöglicht die Nachverfolgung von mehreren Zeitrahmen.

Strategie Logik

Die Strategie verwendet eine schnelle DEMA-Linie und eine langsame DEMA-Linie, um Handelssignale zu konstruieren. Die schnelle Linie hat eine Periode von tf und die langsame Linie hat eine Periode von tf*2. Ein Kaufsignal wird erzeugt, wenn die schnelle Linie über die langsame Linie überschreitet. Ein Verkaufssignal wird erzeugt, wenn die schnelle Linie unter die langsame Linie überschreitet. Dies ermöglicht es der Strategie, mittelfristige bis langfristige Trends zu verfolgen. Darüber hinaus verwendet die Strategie auch einen Hull-Doppel- gleitenden Durchschnittsfilter, um laute Trades zu reduzieren.

Analyse der Vorteile

Der größte Vorteil dieser Strategie ist, dass sie sich automatisch an verschiedene Zeiträume anpassen kann. Sie wählt den Analysezeitrahmen von täglich bis wöchentlich basierend auf dem aktuellen Zeitraum. Dies macht die Strategie für eine Vielzahl von Marktumgebungen geeignet. Darüber hinaus kann die doppelte gleitende Durchschnittsstruktur Trends effektiv verfolgen, und der doppelte Filter erhöht die Signalqualität. Infolgedessen ist diese Strategie sehr geeignet für die Verfolgung von mittelfristigen bis langfristigen Trends.

Risikoanalyse

Das Hauptrisiko dieser Strategie ist die Trendumkehrung. Wenn der Markt von einem Bullenmarkt zu einem Bärenmarkt übergeht, können sich die schnellen und langsamen Linien stark nach unten kreuzen, was zu riesigen schwimmenden Verlusten führt. Darüber hinaus kann der Linienfilter auch einige profitable Möglichkeiten verpassen. Wenn der Filter mit der Kursrichtung nicht übereinstimmt, werden diese ansonsten profitablen Signale übersprungen. Infolgedessen zielt diese Strategie hauptsächlich auf stabile mittel- bis langfristige Trendmärkte ab.

Optimierungsrichtlinien

Die Strategie kann optimiert werden, indem die Filterparameter angepasst oder andere Indikatoren als Ersatz verwendet werden. Zum Beispiel kann MACD anstelle von HullMA getestet werden, oder die HullMA-Periodenparameter können angepasst werden. Verschiedene Parameterkombinationen können auch getestet werden, um besser geeignete Handelsregeln zu finden. Darüber hinaus können Volatilitätsindikatoren auch integriert werden, um die Positionsgröße zu kontrollieren.

Schlussfolgerung

Dies ist eine sehr praktische anpassungsfähige Trendfolgestrategie. Sie kann den Analysezeitrahmen für verschiedene Zeiträume automatisch anpassen und eignet sich für den Handel über verschiedene Zeithorizonte hinweg. Die doppelte gleitende Durchschnittsstruktur kann Trends stetig verfolgen und der Filter verbessert auch die Signalqualität. Insgesamt eignet sie sich für Anleger, die nach stabilen mittelfristigen bis langfristigen Renditen suchen.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 23:59:59
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

//
//---------------------------------------------
//* Author - PPSingnal
//* http://ppsignal.com
//---------------------------------------------
//
//

strategy (title="PPSignal V4 (Auto Adaptive Times)", shorttitle="PPSignal V4", overlay=true)
delayOffset = input(defval = 0, title = "Delay Open/Close MA (Forces Non-Repainting)", minval = 0, step = 1)

//----------------------------------------    INICIO PPI     ----------------------------------------

// - PARÁMETROS DE ENTRADA
// SE DEFINE LA RESOLUCIÓN
useRes1 = true
setRes1 = true


tf = timeframe.period == "60" ? 4 : timeframe.period == "240" ? 4 : timeframe.period == "D" ? 4 : timeframe.period == "W" ?4 : 4


// PRIMER DEMA
type   = "DEMA"
src   = close
len    = tf
off   = 0
lsma   = 0
// SEGUNDA DEMA
type2   = "DEMA"
src2    = open
len2    = tf
off2    = 0
lsma2   = 0

// - INPUTS END

//----------------------------------------    INICIO FUNCIONES     ----------------------------------------

// RETORNA UNA MEDIA MOVIL (TYPE=TIPO / SRC = TIPO DE PRECIO / LEN=LONGITUD / LSMA=0)
variant(type, src, len, lsma) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, lsma)                                         // Least Squares
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : v1

// SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414*3.14159 / len)
    b1 = 2*a1*cos(1.414*3.14159 / len)
    c2 = b1
    c3 = (-a1)*a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1*(src + nz(src[1])) / 2 + c2*nz(v12[1]) + c3*nz(v12[2])
   

// RETORNA LA RESOLUCIÓN SETEADA Y SINO LA DEFAULT
// 3H:      1min - 3min - 5min - 15min
// DIARIO:  30 - 45 - 60
// SEMANAL: 120 - 180 - 240 - D


reso(exp, use, res) => use ? request.security(syminfo.tickerid, timeframe.period=="1" ? "D" : timeframe.period=="3" ? "D" : timeframe.period=="5" ? "D" : timeframe.period=="15" ? "D" : timeframe.period=="30" ? "D" : timeframe.period=="45" ? "W" : timeframe.period=="60" ? "W" : timeframe.period=="120" ? "W" : timeframe.period=="180" ? "W" : timeframe.period=="240" ? "W" : timeframe.period=="D" ? "W" : "W", exp) : exp




//----------------------------------------    FIN FUNCIONES     ----------------------------------------

//----------------------------------------    INICIO VARIABLES     ----------------------------------------

// DEMAS
ma_short    = reso(variant(type, src[off], len, lsma), useRes1, setRes1)
ma_long     = reso(variant(type2, src2[off2], len2, lsma2), useRes1, setRes1)


//----------------------------------------    FIN VARIABLES     ----------------------------------------


//----------------------------------------    FIN PPI     ----------------------------------------

//----------------------------------------    PRIMER FILTRO      ----------------------------------------
// Double HullMA
scolor      = false

n=1
n2ma=2*wma(close,round(n/2))
nma=wma(close,n)
diff=n2ma-nma
sqn=round(sqrt(n))

n2ma1=2*wma(close[1],round(n/2))
nma1=wma(close[1],n)
diff1=n2ma1-nma1
sqn1=round(sqrt(n))

n1=wma(diff,sqn)
n2=wma(diff1,sqn)

//----------------------------------------    FIN PRIMER FILTRO     ----------------------------------------

//----------------------------------------    INICIO CONDICIONES      ----------------------------------------

// CONDICION CON FILTRO
cruce= (ma_short > ma_long) and n1>n2 ? true : ma_short < ma_long ? false : cruce[1]
// Condition

// FONDO DE COLOR
bground = cruce ? white : red
bgcolor(bground, transp=90)


// BARRAS COLOREADAS
barcol = cruce ? yellow : red 
barcolor(barcol, transp=0)

closePlot   = plot(ma_short, title = "Zone 1", color = gray, circles = 0, style = circles, transp = 100)
openPlot   = plot(ma_long, title = "Zone 2", color = green, circles = 0, style = circles, transp = 100)
trendState  = ma_short > ma_long ? true : ma_short < ma_long ? false : trendState[1]

// channel fill
closePlotU  = plot(trendState ? ma_short : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? ma_long : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : ma_short, transp = 100, editable = false)
openPlotD   = plot(trendState ? na : ma_long, transp = 100, editable = false)

fill(openPlotU, closePlotU, title = "Up Trend Fill", color = yellow, transp = 70)
fill(openPlotD, closePlotD, title = "Down Trend Fill", color = red, transp = 70)




//----------------------------------------    FIN CONDICIONES     ----------------------------------------

//----------------------------------------    INICIO ESTRATEGIA      ----------------------------------------

//CONDICION COMPRA
longCond    = (ma_short > ma_long) and n1>=n2

//CONDICION VENTA

shortCond    = (ma_short < ma_long)

//ABRO COMPRA A
strategy.entry("Bull Trend", strategy.long, when = longCond)

//ABRO VENTA A
strategy.entry("Bearish Trend", strategy.short, when = shortCond)

//CIERRO VENTA A
strategy.exit("Exit Short", from_entry = "Bull Trend", when = shortCond)

//CIERRO COMPRA A
strategy.exit("Exit Long", from_entry = "Bearish Trend", when = longCond)

//----------------------------------------    FIN ESTRATEGIA     ----------------------------------------





Mehr