Strategie zur Verringerung von Verlusten auf Basis von Preisunterschieden

Schriftsteller:ChaoZhang, Datum: 2023-11-28 13:53:16
Tags:

img

Übersicht

Diese Strategie verwendet das Prinzip der Preisdifferenz, wenn der Preis die jüngsten Tiefs durchbricht, mit Stop-Loss- und Take-Profit-Orders, um den niedrigsten Preis für die Gewinnnahme zu verfolgen.

Strategie Logik

Es identifiziert Lücken, wenn der Preis unter den niedrigsten Preis in den letzten N Stunden bricht, geht lang basierend auf konfiguriertem Prozentsatz, mit Stop-Loss- und Take-Profit-Orders. Stop-Loss-Linie und Take-Profit-Linie bewegen sich entsprechend der Preisbewegung.

  1. Berechnung des niedrigsten Preises in den letzten N Stunden als verbindlicher Preis
  2. Gehen Sie lang, wenn der Echtzeitpreis unter dem bindenden Preis * Kaufprozentsatz liegt
  3. Set Take Profit auf Basis des Einstiegspreises * Verkaufsprozentsatz
  4. Einrichtung eines Stop-Loss auf Basis des Einstiegspreises - Einstiegspreis * Stop-Loss-Prozentsatz
  5. Positionsgröße in Prozent des Strategie-Eigenkapitals
  6. Strecke mit dem niedrigsten Preis
  7. Schließung der Position, wenn ein Gewinn oder Stop-Loss ausgelöst wird

Analyse der Vorteile

Die Vorteile dieser Strategie:

  1. Nutzen Sie das Konzept der Preislücke, verbessern Sie die Gewinnrate
  2. Automatischer Trailing Stop Loss, um die meisten Gewinne zu erzielen
  3. Anpassungsfähige Stop-Loss- und Gewinnspanne für verschiedene Märkte
  4. Funktioniert gut für Instrumente mit offensichtlichen Rebounds
  5. Einfache Logik und einfache Umsetzung

Risikoanalyse

Es gibt auch einige Risiken:

  1. Durchbruch der Lücken kann bei niedrigeren Tiefs scheitern
  2. Fehlende Stop-Loss- oder Take-Profit-Einstellungen können zu einem vorzeitigen Ausstieg führen
  3. Erfordern regelmäßige Parameter-Ausrichtung auf Marktveränderungen
  4. Begrenzt anwendbare Instrumente können für einige
  5. Manchmal ist ein manuelles Eingreifen erforderlich.

Optimierungsrichtlinien

Die Strategie kann in folgenden Bereichen verbessert werden:

  1. Hinzufügen von maschinellen Lernmodellen für automatisches Parameter-Tuning
  2. Hinzufügen mehrer Arten von Stop Loss/Take Profit, z. B. nachlaufender Stop Loss, Bracket-Orders
  3. Optimierung der Stop-Loss-/Take-Profit-Logik für intelligentere Exits
  4. Mehr Indikatoren hinzufügen, um falsche Signale auszufiltern
  5. Erweiterung auf weitere Instrumente zur Verbesserung der Universalität

Schlussfolgerung

Dies ist eine einfache und wirksame Trailing Stop Loss Strategie, die auf Preislücken basiert. Sie reduziert falsche Einträge und Sperren in Gewinne effektiv. Es gibt noch viel Raum für Verbesserungen bei Parameter-Tuning und Signalfilterung. Es lohnt sich, weiter zu forschen und zu verfeinern.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)



Mehr