Flexible Long- und Short-Handelsstrategien basierend auf Keltner-Kanälen

ATR EMA SMA MA TR
Erstellungsdatum: 2025-02-10 15:07:12 zuletzt geändert: 2025-02-10 15:07:12
Kopie: 4 Klicks: 448
1
konzentrieren Sie sich auf
1617
Anhänger

Flexible Long- und Short-Handelsstrategien basierend auf Keltner-Kanälen

Überblick

Es handelt sich um eine flexible Handelsstrategie, die auf dem Keltner-Kanal basiert. Die Strategie unterstützt mehrspurigen, beidseitigen Handel, der durch die Überwachung des Auf- und Abstiegs des Preisbruchs durch den Kanal durchgeführt wird. Der Kern der Strategie besteht darin, einen Preiskanal mit einem Moving Average (MA) zu erstellen und die Kanalbreite in Verbindung mit der realen Breite (ATR) dynamisch anzupassen, um die Strategie in verschiedenen Marktumgebungen anpassbar zu halten.

Strategieprinzip

Die Strategie basiert auf folgenden Kernprinzipien:

  1. Zentraltendenzen, die durch die EMA oder SMA berechnet werden, um einen Kanal-Mittelstrahl zu bilden
  2. Eintritt und Abfahrt der Bahn mit Hilfe von ATR, TR oder Range
  3. Wenn der Preis über den Kurs hinausgeht, wird ein Mehr-Signal ausgelöst, wenn er über den Kurs hinausgeht, wird ein Leerzeichen ausgelöst.
  4. Einstieg und Ausstieg mit einem Stop-Loss-Client-System zur Erhöhung der Zuverlässigkeit der Ausführung von Geschäften
  5. Flexible Handelsmodelloptionen unterstützt: nur Plus, nur Minus oder Zwei-Wege-Handel

Strategische Vorteile

  1. Anpassungsfähigkeit - Durch ATR wird die Kanalbreite dynamisch angepasst, um die Strategie an unterschiedliche Marktumgebungen anzupassen
  2. Perfekte Risikokontrolle - Handel mit einem Stop-Loss-Auftritt, um Risiken effektiv zu kontrollieren
  3. Flexibilität der Bedienung - Unterstützung für mehrere Handelsmodelle, die sich an Marktmerkmale und Handelspräferenzen anpassen lassen
  4. Verifizierte Wirksamkeit - gute Performance in Kryptowährungs- und Aktienmärkten, insbesondere in volatilen Märkten
  5. Visuelle Klarheit - Intuitive Anzeige von Handelssignalen und Positionszuständen

Strategisches Risiko

  1. Schwankungsrisiko - häufige falsche Durchbruchsignale in schwankenden Märkten
  2. Slippage-Risiko - Stop-Loss-Forderungen können in einem Markt mit geringer Liquidität zu einem größeren Slippage führen
  3. Trendwechselrisiko - bei einem plötzlichen Trendwechsel kann ein höherer Verlust entstehen
  4. Parameter-Sensitivität - Die Wahl der Kanalparameter hat einen wichtigen Einfluss auf die Strategie

Richtung der Strategieoptimierung

  1. Einführung eines Trendfilters - um falsche Durchbruchsignale zu reduzieren, indem Trends zu einem Indikator hinzugefügt werden
  2. Dynamische Parameteroptimierung - dynamische Anpassung der Kanalparameter an die Marktschwankungen
  3. Verbesserte Stop-Loss-Mechanismen - Erweiterung der mobilen Stop-Loss-Funktion zur besseren Absicherung von Gewinnen
  4. Erhöhung der Transfertsicherung - Kombination von Transfertindikatoren zur Erhöhung der Signalsicherheit
  5. Optimierung der Positionsverwaltung - Einführung einer dynamischen Positionsverwaltung zur besseren Risikokontrolle

Zusammenfassen

Die Strategie ist ein gut konzipiertes, logisch klares Handelssystem, das durch den flexiblen Einsatz von Kettner-Kanälen und einer Vielzahl von technischen Indikatoren eine effektive Erfassung von Marktchancen ermöglicht. Die Strategie ist stark anpassbar und für Händler mit unterschiedlichen Risikopräferenzen geeignet. Durch kontinuierliche Optimierung und Verbesserung wird die Strategie eine stabile Leistung in verschiedenen Marktumgebungen aufweisen.

Strategiequellcode
/*backtest
start: 2022-02-11 00:00:00
end: 2025-02-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy(title = "Jaakko's Keltner Strategy", overlay = true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

// ──────────────────────────────────────────────────────────────────────────────
// ─── USER INPUTS ─────────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
length      = input.int(20,     minval=1,  title="Keltner MA Length")
mult        = input.float(2.0,             title="Multiplier")
src         = input(close,                 title="Keltner Source")
useEma      = input.bool(true,             title="Use Exponential MA")
BandsStyle  = input.string(title = "Bands Style", defval  = "Average True Range", options = ["Average True Range", "True Range", "Range"])
atrLength   = input.int(10,                title="ATR Length")

// Choose which side(s) to trade
tradeMode = input.string(title   = "Trade Mode", defval  = "Long Only", options = ["Long Only", "Short Only", "Both"])

// ──────────────────────────────────────────────────────────────────────────────
// ─── KELTNER MA & BANDS ───────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
f_ma(source, length, emaMode) =>
    maSma = ta.sma(source, length)
    maEma = ta.ema(source, length)
    emaMode ? maEma : maSma

ma    = f_ma(src, length, useEma)
rangeMa = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrLength) : ta.rma(high - low, length)

upper = ma + rangeMa * mult
lower = ma - rangeMa * mult

// ──────────────────────────────────────────────────────────────────────────────
// ─── CROSS CONDITIONS ─────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
crossUpper = ta.crossover(src, upper) // potential long signal
crossLower = ta.crossunder(src, lower) // potential short signal

// ──────────────────────────────────────────────────────────────────────────────
// ─── PRICE LEVELS FOR STOP ENTRY (LONG) & STOP ENTRY (SHORT) ─────────────────
// ──────────────────────────────────────────────────────────────────────────────
bprice = 0.0
bprice := crossUpper ? high + syminfo.mintick : nz(bprice[1])

sprice = 0.0
sprice := crossLower ? low - syminfo.mintick : nz(sprice[1])

// ──────────────────────────────────────────────────────────────────────────────
// ─── BOOLEAN FLAGS FOR PENDING LONG/SHORT ─────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
crossBcond = false
crossBcond := crossUpper ? true : crossBcond[1]

crossScond = false
crossScond := crossLower ? true : crossScond[1]

// Cancel logic for unfilled orders (same as original)
cancelBcond = crossBcond and (src < ma or high >= bprice)
cancelScond = crossScond and (src > ma or low <= sprice)

// ──────────────────────────────────────────────────────────────────────────────
// ─── LONG SIDE ────────────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
if (tradeMode == "Long Only" or tradeMode == "Both")  // Only run if mode is long or both
    // Cancel unfilled long if invalid
    if cancelBcond
        strategy.cancel("KltChLE")

    // Place long entry
    if crossUpper
        strategy.entry("KltChLE", strategy.long, stop=bprice, comment="Long Entry")

    // If we are also using “Both,” we rely on short side to flatten the long.
    // But if “Long Only,” we can exit on crossLower or do nothing.
    // Let’s do a "stop exit" if in "Long Only" (like the improved version).
    if tradeMode == "Long Only"
        // Cancel unfilled exit
        if cancelScond
            strategy.cancel("KltChLX")

        // Place exit if crossLower
        if crossLower
            strategy.exit("KltChLX", from_entry="KltChLE", stop=sprice, comment="Long Exit")

// ──────────────────────────────────────────────────────────────────────────────
// ─── SHORT SIDE ───────────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
if (tradeMode == "Short Only" or tradeMode == "Both") // Only run if mode is short or both
    // Cancel unfilled short if invalid
    if cancelScond
        strategy.cancel("KltChSE")

    // Place short entry
    if crossLower
        strategy.entry("KltChSE", strategy.short, stop=sprice, comment="Short Entry")

    // If “Short Only,” we might do a symmetrical exit approach for crossUpper
    // Or if "Both," going long automatically flattens the short in a no-hedge account.
    // Let's replicate "stop exit" for short side if "Short Only" is chosen:
    if tradeMode == "Short Only"
        // Cancel unfilled exit
        if cancelBcond
            strategy.cancel("KltChSX")

        // Place exit if crossUpper
        if crossUpper
            strategy.exit("KltChSX", from_entry="KltChSE", stop=bprice, comment="Short Exit")

// ──────────────────────────────────────────────────────────────────────────────
// ─── OPTIONAL VISUALS ─────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
barcolor(strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : na)

plotshape(    strategy.position_size > 0 and strategy.position_size[1] <= 0, title     = "BUY",  text      = '🚀',  style     = shape.labelup,    location  = location.belowbar,     color     = color.green,     textcolor = color.white,      size      = size.small)

plotshape(    strategy.position_size <= 0 and strategy.position_size[1] > 0,     title     = "SELL",     text      = '☄️',     style     = shape.labeldown,     location  = location.abovebar,     color     = color.red,       textcolor = color.white,     size      = size.small)

plotshape(crossLower, style=shape.triangledown, color=color.red, location=location.abovebar, title="CrossLower Trigger")