Fibonacci-Retracement Dynamische Stop-Loss-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-06 14:33:06
Tags:

img

Übersicht

Diese Strategie nutzt die Fibonacci-Retracement-Levels, um automatisch Stop-Loss zu setzen und Gewinnpreise für das Positionsmanagement zu nehmen.

Strategie Logik

Der Kern dieser Strategie beruht auf dem Fibonacci-Retracement-Indikator, um wichtige Unterstützungs- und Widerstandsniveaus zu bestimmen. Es verfolgt die jüngsten Höchst- und Tiefstände, um 10 Fibonacci-Preisschwellen zu erstellen. Basierend auf der Konfiguration wird eines der Fibonacci-Niveaus als Einstiegs-Trigger ausgewählt. Wenn der Preis über dieses Niveau bricht, wird eine Long-Order basierend auf der konfigurierten Hebelwirkung platziert. Gleichzeitig wird ein Take-Profit-Preis auf einen bestimmten Prozentsatz über dem Einstiegspreis festgelegt.

Nach dem Eintritt verfolgt die Strategie die aktualisierten Fibonacci-Levels. Wenn ein niedrigeres Fib-Level auftaucht, was auf eine mögliche Umkehr hinweist, kündigt die Strategie bestehende Aufträge ab und platziert Aufträge zum niedrigeren Preis als Stop-Loss-Mechanismus. Wenn der Preis schließlich über den Take-Profit-Preis liegt, wird die Position für den Gewinn geschlossen.

Vorteile

Der größte Vorteil dieser Strategie ist die Fähigkeit, den Stop-Loss dynamisch anzupassen und Gewinnpreise für Trendmärkte zu ermitteln.

  1. Erhalten Sie größere Gewinne unter Trendbedingungen, indem Sie auf Basis des Einstiegspreises Stopps verfolgen.

  2. Verluste bei der Konsolidierung zu mindern, indem man bei niedrigeren Fib-Niveaus aufhört.

  3. Erlauben Sie Pyramiden, indem Sie Position hinzufügen, wenn der Preis einen bestimmten Prozentsatz vom letzten Einstiegspreis sinkt.

  4. Einfache Bedienung mit automatischer Bestellung, sobald sie korrekt konfiguriert ist.

Risiken

Es gibt noch einige Risiken, die man beachten sollte:

  1. Anfällig für wiederholte Haltestellen bei seitlichen Märkten, steigende Gebühren.

  2. Es gibt keinen festen Stop-Loss-Mechanismus.

  3. Unbegrenzte Pyramiden könnten die Verluste verschärfen.

Entsprechende Lösungen

  1. Handel pausieren, wenn der Preis im Bereich schwankt.

  2. Überwachen Sie die Märkte manuell und schließen Sie gegebenenfalls Positionen.

  3. Setzen Sie Grenzen für Pyramidenordnungen.

Möglichkeiten zur Verbesserung

Es gibt noch viel Optimierungsmöglichkeiten:

  1. Hinzufügen von zusätzlichen Indikatoren wie EMA, MACD für zusätzliche Eintrittsbestätigung, um falsche Ausbrüche zu vermeiden.

  2. Einbeziehung von festen/nachlaufenden Stop-Loss-Mechanismen zur Begrenzung von Verlusten unter extremen Bedingungen.

  3. Verfeinern Sie die Pyramidenlogik, die auf Marktregimes basiert, um eine übermäßige Hebelwirkung zu verhindern.

  4. Einsatz von Machine-Learning-Modellen wie LSTM zur Preisvorhersage und zur besseren Identifizierung von Ein-/Ausfahrten.

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass diese Strategie für Trend-Fading-Szenarien geeignet ist. Durch die ständige Anpassung von Stopps können Trends effektiv angetrieben werden.


/*backtest
start: 2024-01-06 00:00:00
end: 2024-02-05 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © CryptoRox

//@version=4
//Paste the line below in your alerts to run the built-in commands.
//{{strategy.order.alert_message}}
strategy(title="Fibs limit only", shorttitle="Strategy", overlay=true, precision=8, pyramiding=1000, commission_type=strategy.commission.percent, commission_value=0.04)

//Settings 
testing = input(false, "Live")
//Use epochconverter or something similar to get the current timestamp.
starttime = input(1600976975, "Start Timestamp") * 1000
//Wait XX seconds from that timestamp before the strategy starts looking for an entry.
seconds = input(60, "Start Delay") * 1000
testPeriod = true


leverage = input(1, "Leverage")
tp = input(1.0, "Take Profit %") / leverage
dca = input(-1.0, "DCA when < %") / leverage *-1
fibEntry = input("1", "Entry Level", options=["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"])

//Strategy Calls
equity = strategy.equity
avg = strategy.position_avg_price
symbol = syminfo.tickerid
openTrades = strategy.opentrades
closedTrades = strategy.closedtrades
size = strategy.position_size

//Fibs
lentt = input(60, "Pivot Length")
h = highest(lentt)
h1 = dev(h, lentt) ? na : h
hpivot = fixnan(h1)
l = lowest(lentt)
l1 = dev(l, lentt) ? na : l
lpivot = fixnan(l1)
z = 400
p_offset= 2
transp = 60
a=(lowest(z)+highest(z))/2
b=lowest(z)
c=highest(z)

fib0 = (((hpivot - lpivot)) + lpivot)
fib1 = (((hpivot - lpivot)*.21) + lpivot)
fib2 = (((hpivot - lpivot)*.3) + lpivot)
fib3 = (((hpivot - lpivot)*.5) + lpivot)
fib4 = (((hpivot - lpivot)*.62) + lpivot)
fib5 = (((hpivot - lpivot)*.7) + lpivot)
fib6 = (((hpivot - lpivot)* 1.00) + lpivot)
fib7 = (((hpivot - lpivot)* 1.27) + lpivot)
fib8 = (((hpivot - lpivot)* 2) + lpivot)
fib9 = (((hpivot - lpivot)* -.27) + lpivot)
fib10 = (((hpivot - lpivot)* -1) + lpivot)

notna = nz(fib10[60])
entry = 0.0
if fibEntry == "1"
    entry := fib10
if fibEntry == "2"
    entry := fib9
if fibEntry == "3"
    entry := fib0
if fibEntry == "4"
    entry := fib1
if fibEntry == "5"
    entry := fib2
if fibEntry == "6"
    entry := fib3
if fibEntry == "7"
    entry := fib4
if fibEntry == "8"
    entry := fib5
if fibEntry == "9"
    entry := fib6
if fibEntry == "10"
    entry := fib7
profit = avg+avg*(tp/100)
pause = 0
pause := nz(pause[1])
paused = time < pause

fill = 0.0
fill := nz(fill[1])
count = 0.0
count := nz(fill[1])

filled = count > 0 ? entry > fill-fill/100*dca : 0
signal = testPeriod and notna and not paused and not filled ? 1 : 0

neworder = crossover(signal, signal[1])
moveorder = entry != entry[1] and signal and not neworder ? true : false
cancelorder = crossunder(signal, signal[1]) and not paused
filledorder = crossunder(low[1], entry[1]) and signal[1]

last_profit = 0.0
last_profit := nz(last_profit[1])

if neworder and signal
    strategy.order("New", 1, 0.0001, alert_message='New Order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry)) 
if moveorder
    strategy.order("Move", 1, 0.0001, alert_message='Move Order|e=binancefuturestestnet s=btcusdt b=long c=order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry))
if filledorder and size < 1
    fill := entry
    count := count+1 
    pause := time + 60000
    p = close+close*(tp/100)
    strategy.entry("Filled", 1, 1,  alert_message='Long Filled|e=binancefuturestestnet s=btcusdt b=short c=order|delay=1|e=binancefuturestestnet s=btcusdt b=long c=position q=100% ro=1 fp=' + tostring(p))
if filledorder and size >= 1
    fill := entry
    count := count+1 
    pause := time + 60000
    strategy.entry("Filled", 1, 1,  alert_message='Long Filled|e=binancefuturestestnet s=btcusdt b=short c=order|delay=1|e=binancefuturestestnet s=btcusdt b=long c=position q=100% ro=1 fp=' + tostring(profit))

if cancelorder and not filledorder
    pause := time + 60000
    strategy.order("Cancel", 1, 0.0001,  alert_message='Cancel Order|e=binancefuturestestnet s=btcusdt b=long c=order')

if filledorder
    last_profit := profit

closeit = crossover(high, profit) and size >= 1
if closeit
    strategy.entry("Close ALL", 0, 0, alert_message='Profit')
    count := 0
    fill := 0.0
    last_profit := 0.0
    
//Plots
bottom = signal ? color.green : filled ? color.red : color.white
plot(entry, "Entry", bottom)

Mehr