Optimierung des Momentum-Ausbruchs

Schriftsteller:ChaoZhang, Datum: 2024-01-17 16:44:30
Tags:

img

Übersicht

Die Momentum Breakout Optimization Strategie ist eine Trendfolgestrategie, die Handelssignale generiert und Stop-Loss/Take-Profit basierend auf Momentum-Indikatoren festlegt. Sie beurteilt die Markttrendrichtung, indem sie die Crossovers zwischen Preis und gleitendem Durchschnitt berechnet und einen dynamischen Stop-Loss-Mechanismus mit ATR und LinReg Channel erstellt. Inzwischen identifiziert die Strategie auch Überkauf-/Überverkaufsniveaus mit dem CMO-Indikator für bessere Einstiegspreise.

Strategie Logik

    1. Berechnung des gleitenden Durchschnitts des Preises ZLEMA als technischer Indikator für die Trendrichtung
    1. Berechnung des langen Stoppverlusts und des kurzen Stoppverlusts auf der Grundlage von ATR
    1. Berechnung des KMO-Indikators zur Ermittlung von Überkauf-/Überverkaufszonen in Kombination mit gleitendem Durchschnitt als Einstiegssignale
    1. Generieren Sie 3 Sätze von Handelssignalen basierend auf ATR, gleitendem Durchschnitt und Preisbreakouts
    • Crossovers zwischen gleitendem Durchschnitt und Stop-Loss-Leveln
    • Überschneidungen zwischen Preis- und Stop-Loss-Leveln
    • Crossovers zwischen Preis und gleitendem Durchschnitt
    1. Aktivieren/Deaktivieren verschiedener Signalkombinationen durch Parameter-Einstellungen
    1. Festlegen von Risikoprozentsatz und Positionsgröße für das Risikomanagement

Die Gesamtstrategie kombiniert mehrere Indikatoren für eine stetige Trendverfolgung und automatisierte Stop-Loss, die angemessene Handelsmöglichkeiten gewährleisten und gleichzeitig Handelsrisiken kontrollieren.

Analyse der Vorteile

Kombination mehrerer Indikatoren

Die Strategie verwendet eine Kombination von Indikatoren, darunter gleitender Durchschnitt, ATR, CMO usw. Die Indikatoren ergänzen sich gegenseitig und liefern zuverlässigere Beurteilungen über die Trendrichtung und überkaufte/überverkaufte Zonen.

Dynamischer Zughalt

Der auf ATR basierende dynamische Stop-Loss kann die Stop-Loss-Niveaus flexibel anhand der Marktvolatilität anpassen und damit den Einzelhandelsverlust wirksam kontrollieren.

Umfassendes Risikomanagement

Die Strategie enthält Positionsgröße und Risikoprozentsätze, die den maximalen Risikokapitalanteil festlegen, um starke Schwankungen der Fonds zu vermeiden.

Zahlreiche Handelssignale

Die Strategie bietet 3 Sätze von Handelssignalen. Durch die Aktivierung verschiedener Signalkombinationen können bessere Backtestergebnisse erzielt werden.

Risikoanalyse

Hohe Handelsfrequenz

Es könnte zu häufige Handel, wenn alle Signalkombinationen aktiviert sind. Dies kann vermieden werden, indem nur einige der Signale.

Empfindlich für Parameter-Einstellungen

Das Multiparametermodell macht die Parameteroptimierung komplexer und empfindlicher.

Höhere Auslastung für Ausbruchssignale

Für die reinen Preis/Stop-Loss-Break-out-Signale ist der Stop-Loss-Bereich breiter, was zu einem größeren Einzelhandelsverlust und Drawdown führen kann.

Optimierungsrichtlinien

Verschiedene Parameterkombinationen testen

Optimieren Sie Parameter wie gleitende Durchschnittsart/Länge, ATR-Periode, CMO-Periode, um die optimale Übereinstimmung zu finden.

Optimierung der Signalnutzungsstrategien

Testen Sie die Leistung, indem Sie nur gleitende Durchschnittssignale, Stop-Loss-Signale oder Kombinationssignale verwenden, um die beste Nutzungsstrategie zu finden.

Testleistung für verschiedene Produkte

Die Strategie wird über Index-, Devisen- und Rohstoffprodukte hinweg getestet, um die Anpassungsfähigkeit auf verschiedenen Marktarten zu analysieren.

Schlussfolgerung

Diese Strategie integriert mehrere Indikatoren für die Trendidentifizierung, Stop-Loss-Konstruktion, Überkauf-/Überverkaufserkennung. Durch das Abstimmen von Parametern und Signalkombinationen können zufriedenstellende Risikometriken erreicht werden. Das Gesamtsystem ist umfassend und zuverlässig für weitere Live-Tests und Optimierungen.


/*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()
  

Mehr