Momentum Breakout Optimierte Trendfolgestrategie


Erstellungsdatum: 2024-01-17 16:44:30 zuletzt geändert: 2024-01-17 16:44:30
Kopie: 0 Klicks: 622
1
konzentrieren Sie sich auf
1617
Anhänger

Momentum Breakout Optimierte Trendfolgestrategie

Überblick

Die Dynamic Breakthrough Optimization Strategie ist eine Trendverfolgungsstrategie, die auf der Grundlage von Dynamic Metrics für die Erzeugung von Handelssignalen und die Einstellung von Stop-Loss-Sets basiert. Die Strategie beurteilt die Richtung des Markttrends durch die Berechnung der Kreuzung von Preisen und Moving Averages in Verbindung mit ATR und LinReg-Kanälen, um eine dynamische Stop-Loss-Mechanismus zu erstellen. Die Strategie verwendet auch die CMO-Indikatoren, um Überkauf-Überverkauf zu identifizieren und eine bessere Eintrittsphase zu erzielen.

Strategieprinzip

  • 1. Berechnung des ZLEMA Moving Averages als technischer Indikator für die Richtung der Trends
  • 2. Der Stop-Loss für eine lange Position und der Stop-Loss für eine kurze Position werden nach ATR berechnet.
  • 3. Berechnung der CMO-Kennzahlen für Überkauf- und Überverkaufspannen in Kombination mit einem Moving Average als Einstiegssignal
  • 4. Aufbau von drei Gruppen von Handelssignalen basierend auf einem Durchbruch des ATR und des Moving Averages
    • Kreuzung von Moving Average und Stop-Loss
    • Der Preis und der Stop-Loss-Preis kreuzen sich.
    • Kreuzung von Preisen und Moving Averages
  • 5. Aktivierung verschiedener Signaltypen durch Parameter-Einstellungen
  • 6. Risikomanagement durch das Setzen von Risikofaktoren und Positionskontrollen

Die gesamte Strategie ermöglicht eine stabile Trendverfolgung und automatische Stop-Loss-Anwendung durch eine Kombination aus verschiedenen Indikatoren, die sowohl eine ausreichende Handelsmöglichkeit als auch ein kontrolliertes Handelsrisiko gewährleistet.

Analyse der Stärken

Mehrfache Kombination von Indikatoren

Die Strategie nutzt eine Kombination aus verschiedenen Indikatoren wie beispielsweise Moving Averages, ATR und CMO, um eine effektive Ergänzung zwischen den Indikatoren herzustellen, die die Richtung der Trends und die Überkauf-Überverkaufszonen genauer und zuverlässiger ermitteln kann.

Dynamischer Trailing Stop

Die ATR-basierte dynamische Stop-Loss-Methode ermöglicht die flexible Anpassung der Stop-Loss-Position an die Marktvolatilität und die effektive Kontrolle von Einzelschäden.

Gutes Risikomanagement

Die Strategie bietet Positionskontrollen und Risikofaktor-Einstellungen, die den Prozentsatz des maximalen Verlustes im Voraus definieren können, um große Geldschwankungen zu vermeiden.

Reichtum an Handelssignalen

Die Strategie bietet insgesamt drei Sätze von Handelssignalen, die durch die Auswahl einer Kombination aus verschiedenen Signaltypen, die aktiviert sind, zu besseren Rückmeldungsergebnissen führen können.

Risikoanalyse

Zu hohe Handelsfrequenz

Wenn die gesamte Signalpalette aktiviert ist, kann es zu einer zu hohen Handelsfrequenz kommen. Dies kann vermieden werden, indem nur ein Teil der Signalpalette verwendet wird.

Indikatorparameter sind sensibel

Die Verwendung von mehreren Kennzahlenkombinationen macht die Parameterwahl komplexer und sensibler für die Parameter-Einstellungen, die eine optimale Kombination von Parametern erfordern, die sorgfältig getestet werden müssen.

Breakout-Rückzugrate hoch

Handelssignale, die nur auf der Kreuzung von Preis und Stop-Loss-Preis basieren, haben eine größere Stop-Loss-Range und können zu größeren Einzelschäden und Rückzügen führen. Es besteht die Option, die beweglichen Linear-Signale mit einer Kombination davon zu verwenden.

Optimierungsrichtung

Verschiedene Parameterkombinationen testen

Optimierung der Moving Average-Typen und -Längenparameter; Optimierung der ATR-Zyklusparameter; Optimierung der CMO-Parameter.

Strategien zur Optimierung der Signalnutzung

Die Tests werden nur mit Moving Average Signalen, Stop-Loss-Price-Signalen und Kombinationssignalen durchgeführt, um die optimale Strategie zu analysieren.

Tests an verschiedenen Sorten

Rückmeldung in Aktienindizes, Devisen und Warenarten zur Analyse der Anpassung der Strategie an die Art des Marktes.

Zusammenfassen

Die Strategie verwendet verschiedene Indikatoren, um die Trendrichtung zu identifizieren, einen Stop-Loss-Mechanismus zu erstellen und Überkauf-Überverkauf-Gelegenheiten zu entdecken. Anpassungen durch Parameteroptimierung, Auswahl von Signalkombinationen usw. ermöglichen eine bessere Rücknahmeindikator. Insgesamt ist das Strategie-System vollständig und zuverlässig und lohnt es sich, weiter in der Praxis zu testen und zu optimieren.

Strategiequellcode
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//developer: @KivancOzbilgic
//author: @KivancOzbilgic

strategy(title="Profit Maximizer PMax", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=0.025, slippage=2)


src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="ZLEMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)

alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")


// Calculate position size
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Long
buySignalk = crossover(MAvg, PMax)
plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="BuyL", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)


if(buySignalk and showsignalsk and inDateRange)
    strategy.entry(id="buySignalk", long=true, qty=posSize)
    
sellSignallk = crossunder(MAvg, PMax)
plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="SellL", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

if(sellSignallk and showsignalsk and inDateRange)
    strategy.order(id="sellSignallk", long=false, qty=strategy.position_size)
    
//Short
buySignalc = crossover(src, PMax)
plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="BuyS", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(buySignalc and showsignalsc and inDateRange)
    strategy.entry(id="BuyS", long=false, qty=posSize)

sellSignallc = crossunder(src, PMax)
plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="SellS", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(sellSignallc and showsignalsc and inDateRange)
    strategy.order(id="SellS", long=true, qty=abs(strategy.position_size))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na

fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

// Exit open market position when date range ends
if (not inDateRange)
    strategy.close_all()