Preismomentum-Tracking-Stop-Loss-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-27 11:45:04
Tags:

img

Übersicht

Diese Strategie berechnet den Momentum des Preises, um die Trendrichtung zu bestimmen, und setzt bidirektionale Tracking-Stops ein, um Gewinne zu erzielen und einen Stop-Loss nach dem Trend zu erzielen.

Strategie Logik

Es berechnet die 12-Perioden-Dynamik des Preises und berechnet weiter die 1-Perioden-Dynamik des Momentums. Wenn die schnelle Dynamik (1-Perioden-Dynamik des Preismomentums) größer als 0 ist, geht es lang. Wenn es weniger als 0 ist, geht es kurz. Dies beurteilt die Richtungsänderung der Preisdynamik, um den Preistrend zu bestimmen.

Es setzt den Trailing Stop Abstand und die Aktivierungsstufe fest. Der Trailing Stop Abstand bezieht sich auf die Anpassung des Stops auf eine bestimmte Entfernung vom neuesten Höchst- oder Tiefstand, wenn der Preis neue Höchst- oder Tiefstände erreicht.

Die Strategie schließt die Gewinne ein, indem sie den höchsten oder niedrigsten Preis verfolgt und Schlussauftrage sendet, wenn der Preis über die festgelegte Stoppdistanz zurückzieht.

Analyse der Vorteile

  1. Die doppelte Momentumbestimmung beurteilt die Trendrichtung genau, reduziert Trades und vermeidet, dass man gefangen wird.

  2. Flexible Hinterhaltdistanz verringert das Risiko und die Gewinnsicherung.

  3. Die Aktivierungsstufe verhindert einen vorzeitigen Stop-Loss, indem sie erst nach Erreichen eines gewissen Gewinnziels ein Trailing ermöglicht.

  4. Bidirektionale Stopps kontrollieren die Risiken sowohl für Longs als auch für Shorts umfassend.

  5. Einfache und effiziente Berechnung, leicht zu verstehen und umzusetzen.

Risikoanalyse

  1. Bei doppelter Bewegung kann es umgekehrte Signale geben, was einen Trendfilter erfordert.

  2. Eine übermäßige Stoppdistanz kann zu erheblichen Verlusten führen.

  3. Eine hohe Aktivierungsstufe kann Stoppmöglichkeiten verpassen.

  4. Es sind weitere Parameterprüfungen und Optimierungen erforderlich, um optimale Haltestellen zu finden.

Kann falsche Signale durch Trendbeurteilung und Parameteroptimierung reduzieren. Test auf verschiedenen Produkten und Parameter-Sets, um die beste Konfiguration zu finden.

Optimierungsrichtlinien

  1. Kombination von Marktstrukturerkennung für den Trend und Vermeidung von Umkehrhandel.

  2. Fügen Sie mehr Zeitbedingungen hinzu, wie Lautstärkeänderungen, Pressen von Ausbrüchen, um die Signalgenauigkeit zu verbessern.

  3. Optimierung der Parameter durch Prüfung verschiedener Stoppdistanzen und Aktivierungsstufen.

  4. Der Wert der Vermögenswerte, die für die Berechnung der Vermögenswerte verwendet werden, wird in der Tabelle 1 aufgeführt.

  5. Für eine bessere Risikokontrolle partielle oder bewegliche Haltestellen einstellen.

Schlussfolgerung

Die Strategie hat eine klare Struktur, beurteilt den Trend mit doppelter Dynamik und sperrt Gewinne mit flexiblen Trailing-Stops, um Handelsrisiken effektiv zu kontrollieren. Sie ist leicht zu verstehen und umzusetzen, mit optimierbarem Raum. Das Hinzufügen von mehr technischen Indikatoren und Parameter-Tests kann die Strategieleistung weiter verbessern. Die Strategie bietet Ideen und Referenzen für die Realisierung des Stop-Loss-Managements.


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

//@version=5
strategy("Trailing Stop Snippet", overlay=true)

length = input(12)
price = close
momentum(seria, length) =>
	mom = seria - seria[length]
	mom
mom0 = momentum(price, length)
mom1 = momentum( mom0, 1)

tsact = input.float(0.0, "Trailing Stop Activation |", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100
tsact := tsact ? tsact : na
ts = input.float(0.0, "Position Trailing Stop |", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100
ts := ts ? ts : na

in_long = strategy.position_size > 0
in_short = strategy.position_size < 0

var ts_ = array.new_float()
ts_size = array.size(ts_)
ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0

if in_long
    if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
    if not tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
if in_short
    if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)
    if not tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)
    
trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na

if (mom0 > 0 and mom1 > 0)
	strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE")
else
	strategy.cancel("MomLE")
if (mom0 < 0 and mom1 < 0)
	strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE")
else
	strategy.cancel("MomSE")

tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na
if trail    
    strategy.close_all()
if not strategy.opentrades
	array.clear(ts_)

//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

plotchar(ts_get, "GET", "")
plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross)
plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross)
plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)

Mehr