Zwillingsoptimierte Trend-Tracker-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-10-08 15:10:31
Tags:

Übersicht

Die Twin Optimized Trend Tracker Strategie ist eine erweiterte Version der OTT-Strategie, die zwei OTT-Linien und einen Koeffizienten kombiniert, um falsche Signale während des seitlichen Marktes besser zu bewältigen.

Grundsätze

Der Kern der Twin OTT-Strategie besteht darin, die Trendrichtung mit zwei optimierten Trendverfolgungslinien - OTT - zu bestimmen. Er berechnet zunächst den gleitenden Durchschnitt MAvg, erhält dann die lange Stop-Loss-Linie longStop und die kurze Stop-Loss-Linie shortStop basierend auf einem Prozentsatz des MAvg-Wertes. Wenn der Preis über die longStop-Linie überschreitet, ist es ein langes Signal, und wenn er unterhalb der shortStop-Linie überschreitet, ist es ein kurzes Signal.

Um mit falschen Signalen während des seitlichen Marktes umzugehen, verbessert die Strategie folgende zwei Aspekte:

  1. Es werden zwei vertikal verschobene OTT-Linien hinzugefügt, OTTup und OTTdn. Sie sind leichte Auf- und Abwärtsbewegungen des ursprünglichen OTT. Nur wenn der Preis durch diese beiden verschobenen Linien bricht, werden gültige Handelssignale generiert.

  2. Ein kleiner Koeffizient wird eingeführt, um die beiden verschobenen OTT-Linien für eine bessere Präzision zu optimieren.

Mit diesem Zwillings-OTT-Design kann der größte Teil des Geräusches aus dem seitlichen Markt gefiltert werden, um falsche Signale zu vermeiden. Es hilft, Trendwendepunkte zu erfassen und Positionen rechtzeitig zu wechseln. Dies ist der größte Vorteil der Twin OTT-Strategie.

Vorteile

  • Das Design der zwei OTT-Linien kann falsche Signale effektiv filtern und die Stabilität der Strategie verbessern
  • Der zusätzliche Koeffizient hilft OTT-Linien, besser auf den Markt zu reagieren
  • Der Autor Anıl Özekşi erklärt die Strategie-Logik in seinen Video-Tutorials deutlich, was leicht zu verstehen ist
  • Es kombiniert mehrere technische Indikatoren wie EMA, Stop Loss Lines, um Markttrends zu bestimmen
  • Der Autor Anıl Özekşi ist ein bekannter türkischer Händler, der die Glaubwürdigkeit der

Risiken

  • Der OTT-Indikator selbst neigt dazu, Whipsaw- und Pullback-Tests durchzuführen.
  • Bei heftigen Schwankungen können die Stop-Loss-Linien häufig ausgelöst werden, was zu einem Überhandel führt.
  • Der Koeffizient muss sorgfältig auf einen optimalen Wert geprüft werden, da er sonst die Wirksamkeit beeinträchtigt.
  • Die Tutorials sind auf Türkisch. Sprachbarrieren können zu Missverständnissen der Logik führen.
  • Unzureichende Backtests. Mehr Zeiträume und Märkte sind erforderlich, um die Strategie zu überprüfen.

Gegenmaßnahmen:

  • Hinzufügen eines Puffers zwischen Stop-Loss-Linien und doppelten OTT, um Überempfindlichkeit zu vermeiden
  • Optimierung der Koeffizienteneinstellungen nach den Rücktestresultaten
  • Übersetzen Sie die Tutorials, um das richtige Verständnis der Logik zu gewährleisten
  • Durchführung von Backtests über mehr historische Zeiträume hinweg zur Überprüfung der Zuverlässigkeit

Optimierungsrichtlinien

  • Machen Sie Parameter wie Periodenlänge einstellbare Eingaben
  • Versuchen Sie andere Arten von gleitenden Durchschnitten, die besser zu den OTT-Grundsätzen passen
  • Optimierung der Koeffizienten für verschiedene Handelsinstrumente
  • Fügen Sie Filter hinzu, um falsche Signale während kleinerer Handelssitzungen zu vermeiden
  • Die Stop-Loss-Linien werden dynamisch basierend auf der Volatilität
  • Einführung von maschinellem Lernen zur automatischen Optimierung von Parametern

Zusammenfassend lässt sich sagen, dass die Twin OTT-Strategie die OTT-Erfahrung von Anıl Özekşi voll ausnutzt und Innovationen vorantreibt. Sie hat das Potenzial, zu einem zuverlässigen, anpassbaren Trend-Tracking-Framework zu werden.

Schlussfolgerung

Die Twin OTT-Strategie verarbeitet falsche Signale während seitlicher Märkte effektiv mit doppelten optimierten Trendverfolgungslinien und einem Feinabstimmungskoeffizienten. Sie nutzt sinnvolle Konzepte von gleitenden Durchschnitten und dynamischen Stop-Loss-Linien, um Trends zu verfolgen. Diese prägnante und praktische Strategie stammt aus der Erfahrung eines renommierten Traders aus erster Hand und lohnt sich daher eine eingehende Forschung und Anwendung. Aber wir sollten uns auch seiner Grenzen bewusst sein und Selbstzufriedenheit vermeiden. Nur durch kontinuierliche Optimierungen und strenge Tests kann sie zu einer robusten Trendverfolgungsstrategie werden.


/*backtest
start: 2023-09-07 00:00:00
end: 2023-10-07 00:00:00
period: 4h
basePeriod: 15m
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

//created by: @Anil_Ozeksi
//developer: ANIL ÖZEKŞİ
//author: @kivancozbilgic

strategy("Twin Optimized Trend Tracker","TOTT", overlay=true)
src = input(close, title="Source")
length=input(40, "OTT Period", minval=1)
percent=input(1, "Optimization Constant", type=input.float, step=0.1, minval=0)
coeff=input(0.001, "Twin OTT Coefficient", type=input.float, step=0.001, minval=0)
showsupport = input(title="Show Support Line?", type=input.bool, defval=true)
showsignalsk = input(title="Show Signals?", type=input.bool, defval=true)
mav = input(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
Var_Func(src,length)=>
    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])
VAR=Var_Func(src,length)
Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
    zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
    lrc = linreg(src, length, 0)
    lrc1 = linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
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)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop =  MAvg + fark
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
MT = dir==1 ? longStop: shortStop
OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200 
OTTup=OTT*(1+coeff)
OTTdn=OTT*(1-coeff)

PPLOT=plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Support Line")

pALLup=plot(nz(OTTup[2]), color=color.green, linewidth=2, title="OTTup", transp=0)
pALLdn=plot(nz(OTTdn[2]), color=color.red, linewidth=2, title="OTTdown", transp=0)

buySignalk = crossover(MAvg, OTTup[2])
sellSignalk = crossunder(MAvg, OTTdn[2])
K1=barssince(buySignalk)
K2=barssince(sellSignalk)
O1=barssince(buySignalk[1])
O2=barssince(sellSignalk[1])

plotshape(buySignalk and showsignalsk and O1>K2 ? min(low-abs(roc(low,1)),OTTdn-abs(roc(low,1))) : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
plotshape(sellSignalk and showsignalsk and O2>K1 ? max(high+abs(roc(high,1)),OTTup+abs(roc(high,1))) : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)
longFillColor = highlighting ? (O2>K1 ? color.green : na) : na
shortFillColor = highlighting ? (O1>K2 ? color.red : na) : na
fill(mPlot, PPLOT, title="UpTrend Highligter", color=longFillColor,transp=90)
fill(mPlot, PPLOT, title="DownTrend Highligter", color=shortFillColor,transp=90)
fill(pALLup, pALLdn, title="Flat Zone Highligter", color=color.blue,transp=90)



dummy0 = input(true, title = "=Backtest Inputs=")
FromDay    = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth  = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear   = input(defval = 2005, title = "From Year", minval = 2005)
ToDay      = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth    = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear     = input(defval = 9999, title = "To Year", minval = 2006)
Start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)
Finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)
Timerange() =>
    time >= Start and time <= Finish ? true : false
if buySignalk
    strategy.entry("Long", strategy.long)
if sellSignalk
    strategy.entry("Short", strategy.short)

Mehr