ETF-Handelsstrategie basierend auf ATR und Ausbrüchen


Erstellungsdatum: 2023-12-26 16:05:55 zuletzt geändert: 2023-12-26 16:05:55
Kopie: 2 Klicks: 822
1
konzentrieren Sie sich auf
1623
Anhänger

ETF-Handelsstrategie basierend auf ATR und Ausbrüchen

Überblick

Die Strategie ist eine ETF-Autohandelsstrategie, die auf einer durchschnittlichen realen Bandbreite (ATR) und einem Preisbruch basiert. Sie verwendet die ATR, um den Stop-Loss und die Stop-Out zu berechnen, und macht eine Über- oder Unterposition, wenn der Preis den Höchst- oder Tiefstpreis eines bestimmten Zeitraums überschreitet.

Strategieprinzip

Die Strategie basiert auf folgenden Prinzipien:

  1. Die Höhe und Tiefe eines bestimmten Zeitraums (z. B. 20 K-Linien) werden verwendet, um die Kursentwicklung und -richtung zu bestimmen. Wenn der Preis den Höchstwert des Zeitraums durchbricht, machen Sie mehr; wenn der Preis den niedrigsten Preis des Zeitraums durchbricht, machen Sie weniger.

  2. Der Stop-Loss wird dynamisch mit ATR berechnet. Der Stop-Loss ist entfernt vom Einstiegspreis. Der ATR-Wert für einen ATR-Zyklus wird mit dem Faktor ((wie 2)) multipliziert.

  3. Der ATR wird verwendet, um die Stop-Position zu berechnen. Die Stop-Distanz ist der Einstiegspreis für einen ATR-Zyklus, multipliziert mit dem Faktor ((wie 1) ).

  4. Tracking von Stopps mit dem ATRtrailer Multifaktor. Der Stop wird ausgeschaltet, wenn der Preis den Trailer-Stopp in eine nachteilige Richtung durchbricht.

Die Strategie ist einfach und zuverlässig und berücksichtigt sowohl die Richtung der Preisentwicklung, um die Preisentwicklung rechtzeitig zu erfassen, als auch die Einstellung von Stop-Loss- und Stop-Positions, um Gewinnchancen zu erfassen und Risiken zu kontrollieren.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Die Strategie ist einfach, klar und leicht zu verstehen und umzusetzen.

  2. Mit der ATR kann die Stop-Loss-Liste berechnet werden, um die Positionsgröße dynamisch anzupassen und das Risiko flexibel zu steuern.

  3. Die Strategie der Zyklusbrechung ist besser geeignet, um die Preisentwicklung zu erfassen und die Erträge zu steigern.

  4. Trailer-Stoppschäden können rechtzeitig gestoppt werden, um ein zu hohes Risiko zu vermeiden.

  5. Dies gilt auch für Trendvarianten wie ETFs, Aktien usw.

Risikoanalyse

Die Strategie birgt auch folgende Risiken:

  1. Wenn die Preise schwanken, kann es zu mehr Fehlsignalen kommen und Positionen umgekehrt eröffnet werden.

  2. Die falsche Einstellung der Zyklusparameter kann dazu führen, dass die Preisentwicklung verpasst wird oder dass zu viele Fantasiegeschäfte abgeschlossen werden.

  3. Fehlende Einstellungen der Koeffizientenparameter können dazu führen, dass die Stop-Loss-Parameter zu radikal oder konservativ sind, was sich auf die Gewinnspanne auswirkt.

  4. Die Risiken, die ETFs selbst mit sich bringen, wie z. B. das Risiko für die Politik, das Risiko für die Prämien, beeinflussen auch die Strategie.

Entsprechende Lösungen:

  1. Die Optimierung der Parameter und die Verringerung der virtuellen Transaktionsraten.
  2. Es werden mehrere Faktoren und Filter kombiniert, um ein Handelssignal zu bestimmen.
  3. Anpassung der Parameter an den jeweiligen Markt.
  4. Verteilung der Investitionen und Kontrolle der Positionen eines einzelnen ETFs.

Optimierungsrichtung

Die Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. In Kombination mit anderen Indikatoren wie dem Moving Average filtert man falsche Signale aus.

  2. Hinzugefügt wurde ein Modul zur Optimierung der Adaptionsparameter, um die Parameter automatisch nach verschiedenen Perioden und Sorten zu optimieren.

  3. Hinzu kommt ein maschinelles Lernmodell, das die Höhen und Tiefen der nächsten K-Linie vorhersagt, um den Durchbruch zu bestimmen.

  4. Der Markt ist in der Lage, sich zu verbessern, indem er sich auf die Entwicklung der Handelsströme konzentriert.

  5. Optimierung der Größe und des Verhältnisses der Lageröffnungen, der Anpassung an verschiedene Sorten und Marktbedingungen.

Zusammenfassen

Die Gesamtkonzeption der Strategie ist klar und prägnant, die Kernmechanik ist durchbrochen und die ATR-Dynamik Stop-Loss kann das Risiko effektiv kontrollieren und die Gewinne sperren. Durch die Optimierung der Parameter und die Kombination mit mehr Filterindikatoren kann die Fähigkeit zur Steigerung der Strategie durch die Gewinnfaktoren und die Risikokontrolle weiter verbessert werden.

Strategiequellcode
/*backtest
start: 2023-12-18 00:00:00
end: 2023-12-21 03:00:00
period: 1m
basePeriod: 1m
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/
// © FX_minds

//@version=4
strategy("ETF tradedr", overlay=true, pyramiding=100, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//------------------------------ get user input
lookback                   = input(title="HH LL lookback", type=input.integer, defval=20)
ATR_periode                = input(title="ATR period", type=input.integer, defval=14)
ATR_SL_multiplier          = input(title="ATR SL multiplier", type=input.float, defval=2)
ATR_TP_multiplier          = input(title="ATR TP multiplier", type=input.float, defval=1)
trailing_SL_ATR_multiplier = input(title="ATR trailing SL multiplier", type=input.float, defval=3.5)
lookback_trailing_SL       = input(title="trailing SL lookback", type=input.integer, defval=4)
max_sequel_trades          = input(title="max sequel trades", type=input.float, defval=1)
trade_long                 = input(title= "trade long ?", type=input.bool, defval=true)
trade_short                = input(title= "trade short ?", type=input.bool, defval=false)

//------------------------------ determine entry conditions
long_condition   = barstate.isconfirmed and crossover(high, highest(high, lookback)[1])
short_condition  = barstate.isconfirmed and crossunder(low, lowest(low, lookback)[1])


//------------------------------ count open long trades
count_open_longs = 0
count_open_longs := nz(count_open_longs[1])

if (long_condition) 
    count_open_longs := count_open_longs +1
    //label.new(bar_index, low, tostring(count_open_longs, "#"), xloc.bar_index, yloc.belowbar, color.green, label.style_none, color.green, size.large)

if (short_condition)
    count_open_longs := 0


//------------------------------ count open short trades
count_open_shorts = 0
count_open_shorts := nz(count_open_shorts[1])

if (short_condition)
    count_open_shorts := count_open_shorts +1
    //label.new(bar_index, low, tostring(count_open_shorts, "#"), xloc.bar_index, yloc.belowbar, color.red, label.style_none, color.red, size.large)

if (long_condition)
    count_open_shorts := 0


//------------------------------ calculate entryprice
entryprice_long = long_condition ? close : na
entryprice_short = short_condition ? close : na


//------------------------------ calculate SL & TP
SL_distance = atr(ATR_periode) * ATR_SL_multiplier
TP_distance  = atr(ATR_periode) * ATR_TP_multiplier
trailing_SL_distance = atr(ATR_periode) * trailing_SL_ATR_multiplier

SL_long = entryprice_long - SL_distance
SL_short = entryprice_short + SL_distance

trailing_SL_short = lowest(close, lookback_trailing_SL) + trailing_SL_distance
trailing_SL_long  = highest(close, lookback_trailing_SL) - trailing_SL_distance

trailing_SL_short_signal = crossover(high, trailing_SL_short[1])
trailing_SL_long_signal = crossunder(low, trailing_SL_long[1])


//------------------------------ plot entry price & SL  
plot(entryprice_long, style=plot.style_linebr, color=color.white)
plot(SL_long, style=plot.style_linebr, color=color.red)
plot(SL_short, style=plot.style_linebr, color=color.green)
plot(trailing_SL_short, style=plot.style_linebr, color=color.red)
plot(trailing_SL_long, style=plot.style_linebr, color=color.green)


//------------------------------ submit entry orders
if (long_condition) and (count_open_longs <= max_sequel_trades) and (trade_long == true)
    strategy.entry("Long" + tostring(count_open_longs, "#"), strategy.long)
    strategy.exit("SL Long"+ tostring(count_open_longs, "#"), 
     from_entry="Long" + tostring(count_open_longs, "#"), stop=SL_long)

if (short_condition) and (count_open_shorts <= max_sequel_trades) and (trade_short == true)
    strategy.entry("Short" + tostring(count_open_shorts, "#"), strategy.short)
    strategy.exit("SL Short" + tostring(count_open_shorts, "#"), 
     from_entry="Short" + tostring(count_open_shorts, "#"), stop=SL_short)
    

//------------------------------ submit exit conditions
if (trailing_SL_long_signal)
    strategy.close("Long" + tostring(count_open_longs, "#"))
    strategy.close("Long" + tostring(count_open_longs-1, "#"))
    strategy.close("Long" + tostring(count_open_longs-2, "#"))
    strategy.close("Long" + tostring(count_open_longs-4, "#"))
    strategy.close("Long" + tostring(count_open_longs-5, "#"))
    strategy.close("Long" + tostring(count_open_longs-6, "#"))
    strategy.close("Long" + tostring(count_open_longs-7, "#"))
    strategy.close("Long" + tostring(count_open_longs-8, "#"))
    strategy.close("Long" + tostring(count_open_longs-9, "#"))
    
if (trailing_SL_short_signal)
    strategy.close("Short" + tostring(count_open_shorts, "#"))
    strategy.close("Short" + tostring(count_open_shorts-1, "#"))
    strategy.close("Short" + tostring(count_open_shorts-2, "#"))
    strategy.close("Short" + tostring(count_open_shorts-3, "#"))
    strategy.close("Short" + tostring(count_open_shorts-4, "#"))
    strategy.close("Short" + tostring(count_open_shorts-5, "#"))
    strategy.close("Short" + tostring(count_open_shorts-6, "#"))
    strategy.close("Short" + tostring(count_open_shorts-7, "#"))
    strategy.close("Short" + tostring(count_open_shorts-8, "#"))
    strategy.close("Short" + tostring(count_open_shorts-9, "#"))