Trend-Riding-Strategie auf Basis von MOST und KAMA

Schriftsteller:ChaoZhang, Datum: 2024-02-29 11:04:38
Tags:

img

Diese Strategie kombiniert mehrere gleitende Durchschnitte wie SMA und EMA, um die Kursentwicklungsrichtung zu identifizieren, und setzt Stop-Loss-Linien auf der Grundlage des Preisdurchbruchs, um eine Trendfolgestrategie zu entwerfen. Wenn die Preise steigen, folgt es dem oberen Band als Stop-Loss; wenn die Preise fallen, folgt es der unteren Grenze als Stop-Loss. Der Vorteil der Strategie besteht darin, dass die Kombination mehrerer gleitender Durchschnitte die Preisdaten glätten und Trends identifizieren kann; Das dynamische Stop-Loss-Design vermeidet übermäßig empfindliche Stopps. Das Risiko der Strategie besteht darin, dass die Einstellung der Stop-Loss-Linie zu locker ist, um den Verlust rechtzeitig zu stoppen.

Strategieprinzip

Diese Strategie verwendet KAMA als Grundlage für die Beurteilung der Trendrichtung, da KAMA auf Kursänderungen empfindlicher reagiert und Wende im Voraus identifizieren kann.

Die Einstellung der Stop-Loss-Linie der Strategie basiert auf dem Preis selbst und dem gleitenden Durchschnitt. Insbesondere ist die nach oben verlaufende Stop-Loss-Linie der gleitende Durchschnitt plus ein Anteil als Puffer; die nach unten verlaufende Stop-Loss-Linie ist der gleitende Durchschnitt minus ein Anteil als Puffer. Dies ermöglicht einen sofortigen Stop-Loss, wenn sich die Preise umkehren.

Die Einstiegsbedingungen sind lang, wenn die Preise von unten nach oben durch die Aufwärts-Stop-Loss-Linie durchbrechen; kurz, wenn die Preise von oben nach unten die Abwärts-Stop-Loss-Linie durchbrechen.

Analyse der Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass durch die Kombination mehrerer gleitender Durchschnitte die Genauigkeit des Trendurteils verbessert und falsche Signale reduziert werden können. Gleichzeitig ändert sich die Stop-Loss-Linie der Strategie dynamisch auf der Grundlage des gleitenden Durchschnitts, der sich in Echtzeit anpassen und auf plötzliche Ereignisse reagieren kann.

Darüber hinaus kombiniert diese Strategie im Vergleich zu Einzelindikatorstrategien die Vorteile von Trendverfolgung und Durchbruchsstrategien. In einem Trendmarkt kann sie die Gewinne maximieren; während sie auf einem Whipsaw-Markt Verluste durch Stop-Loss-Einstellungen reduzieren kann.

Risikoanalyse

Das Hauptrisiko dieser Strategie besteht darin, dass die Einstellung der Stop-Loss-Linie zu locker sein kann, um den Stop-Loss rechtzeitig zu stoppen. Dies liegt daran, dass die Retracement-Ratio der Stop-Loss-Linie feststeht, wenn es eine gewaltsame Veränderung auf dem Markt gibt, kann die Stop-Loss-Linie nicht rechtzeitig aktualisiert werden, was zu größeren Verlusten führen kann.

Darüber hinaus hat der gleitende Durchschnitt selbst eine hohe Hysterese und kann nicht sofort auf Kursänderungen reagieren. Dies kann auch dazu führen, dass der Verlust nicht rechtzeitig gestoppt wird, wenn der Markt schnell umkehrt.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Versuche verschiedene Parameter-Einstellungen für Stop-Loss-Line-Verhältnisse, um bessere Parameterkombinationen zu finden;

  2. Versuchen Sie, die Stop-Loss-Linie dynamisch entsprechend dem Grad der Marktfluktuation zu ändern;

  3. Erhöhung anderer Indikatoren zur Beurteilung, Einführung mehrer Variablen in die Stop-Loss-Basis, um die Anpassungsfähigkeit der Strategie zu verbessern;

  4. Optimieren Sie die Zyklusparameter des gleitenden Durchschnitts, um die beste Zyklus-Einstellung für glatte Preise zu finden.

Zusammenfassung

Insgesamt ist diese Strategie ziemlich robust, indem sie mehrere gleitende Durchschnitte kombiniert, um die Trendrichtung zu bestimmen, und einen dynamischen Trailing-Stop-Loss-Mechanismus entwirft, der darauf abzielt, Trends zu folgen. Die Vorteile sind, dass sie falsche Signale reduzieren, Risiken durch Stop-Loss kontrollieren kann; Der Nachteil ist, dass die Stop-Loss-Linie zu breit eingestellt werden kann, um den Verlust schnell zu stoppen. Der nächste Schritt zur Optimierung der Strategie sollte sich auf die Gestaltung der Stop-Loss-Linie konzentrieren, um sie dynamisch anpassbar zu machen, entsprechend den Marktveränderungen.


/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Atlantean Trend Signal BUY SELL Strategy', overlay=true)

ma_length = input.int(title='Moving Average Length', minval=1, defval=3)
percent = input.float(3.3, 'STOP LOSS Percent', step=0.1, minval=0)
src = input(title='Source', defval=close)
mav = input.string(title="Moving Average Type", defval="KAMA", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL", "KAMA"])
T3a1 = 0.7
_type = false //input(false, title='Activate Moving Average Screening Mode')
_type1 = false //input(false, title='Activate Moving Average Color Change Screening Mode')
activateScreener = input.bool(false, title="Activate Screener?")
showsignallabels = input(title='Show Signal Labels?', defval=true)

Var_Func(src, ma_length) =>
    valpha = 2 / (ma_length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

VAR = Var_Func(src, ma_length)
DEMA = 2 * ta.ema(src, ma_length) - ta.ema(ta.ema(src, ma_length), ma_length)

Wwma_Func(src, ma_length) =>
    wwalpha = 1 / ma_length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

WWMA = Wwma_Func(src, ma_length)

// KAMA Calculation
Kama_Func(src, ma_length) =>
    xvnoise = math.abs(src - src[1])
    nfastend = 0.666
    nslowend = 0.0645
    nsignal = math.abs(src - src[ma_length])
    nnoise = math.sum(xvnoise, ma_length)
    nefratio = nnoise != 0 ? nsignal / nnoise : 0
    nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2)
    nAMA = 0.0
    nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1]))
    nAMA

Zlema_Func(src, ma_length) =>
    zxLag = ma_length / 2 == math.round(ma_length / 2) ? ma_length / 2 : (ma_length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, ma_length)
    ZLEMA

ZLEMA = Zlema_Func(src, ma_length)

Tsf_Func(src, ma_length) =>
    lrc = ta.linreg(src, ma_length, 0)
    lrc1 = ta.linreg(src, ma_length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, ma_length, 0) + lrs
    TSF

TSF = Tsf_Func(src, ma_length)

HMA = ta.wma(2 * ta.wma(src, ma_length / 2) - ta.wma(src, ma_length), math.round(math.sqrt(ma_length)))

T3e1 = ta.ema(src, ma_length)
T3e2 = ta.ema(T3e1, ma_length)
T3e3 = ta.ema(T3e2, ma_length)
T3e4 = ta.ema(T3e3, ma_length)
T3e5 = ta.ema(T3e4, ma_length)
T3e6 = ta.ema(T3e5, ma_length)
T3c1 = -T3a1 * T3a1 * T3a1
T3c2 = 3 * T3a1 * T3a1 + 3 * T3a1 * T3a1 * T3a1
T3c3 = -6 * T3a1 * T3a1 - 3 * T3a1 - 3 * T3a1 * T3a1 * T3a1
T3c4 = 1 + 3 * T3a1 + T3a1 * T3a1 * T3a1 + 3 * T3a1 * T3a1
T3 = T3c1 * T3e6 + T3c2 * T3e5 + T3c3 * T3e4 + T3c4 * T3e3

getMA(src, ma_length) =>
    ma = 0.0
    ma := switch mav
        'SMA' => ta.sma(src, ma_length)
        'EMA' => ta.ema(src, ma_length)
        'WMA' => ta.wma(src, ma_length)
        'DEMA' => DEMA
        'TMA' => ta.sma(ta.sma(src, math.ceil(ma_length / 2)), math.floor(ma_length / 2) + 1)
        'VAR' => VAR
        'WWMA' => WWMA
        'ZLEMA' => ZLEMA
        'TSF' => TSF
        'HULL' => HMA
        'TILL' => T3
        'KAMA' => Kama_Func(src, ma_length)
    ma
ALL = getMA(src, ma_length)
exMov = ALL
fark = exMov * percent * 0.01
longStop = exMov - fark
longStopPrev = nz(longStop[1], longStop)
longStop := exMov > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = exMov + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := exMov < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and exMov > shortStopPrev ? 1 : dir == 1 and exMov < longStopPrev ? -1 : dir
MOST = dir == 1 ? longStop : shortStop
cro = _type and _type1 ? ta.crossover(exMov, exMov[1]) : _type ? ta.crossover(close, exMov) : ta.crossover(exMov, MOST)
cru = _type and _type1 ? ta.crossunder(exMov, exMov[1]) : _type ? ta.crossunder(close, exMov) : ta.crossunder(exMov, MOST)
direction = 0
direction := cro ? 1 : cru ? -1 : direction[1]
col1 = exMov > exMov[1]
col3 = exMov < exMov[1]
colorM = col1 and _type and _type1 ? color.rgb(14, 241, 52) : col3 and _type and _type1 ? color.red : color.new(#00bcd4, 0)
if (cro)
    strategy.entry('LONG', strategy.long)
if (cru)
    strategy.close('LONG')

plot(_type ? na : MOST, color=color.new(color.maroon, 0), linewidth=3, title='MOST')
plot(exMov, color=colorM, linewidth=2, title='exMov')
plotshape(cro and showsignallabels, title='BUY', text='BUY', location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(#00bcd4, 0), textcolor=color.new(color.white, 0))
plotshape(cru and showsignallabels, title='SELL', text='SELL', location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.new(#e91e63, 0), textcolor=color.new(color.white, 0))


Mehr