EMA-Squeeze-Handelsstrategie mit dynamischem Stop-Loss für mehrere Zeitrahmen

EMA SQM CMF KC SL TP MTF
Erstellungsdatum: 2024-12-11 15:50:38 zuletzt geändert: 2024-12-11 15:50:38
Kopie: 0 Klicks: 435
1
konzentrieren Sie sich auf
1617
Anhänger

EMA-Squeeze-Handelsstrategie mit dynamischem Stop-Loss für mehrere Zeitrahmen

Überblick

Die Strategie ist ein dynamisches Handelssystem, basierend auf einer Analyse über mehrere Zeiträume, das die Erzeugung von Handelssignalen in Kombination mit dem Index Moving Average (EMA), dem Squeeze Moving Quantity Indicator (SQM) und dem Cash Flow Indicator (CMF) kombiniert. Der Kern der Strategie ist die Bestätigung von Trends durch die Analyse mehrerer Zeiträume und die Verwendung von dynamischen Stop Losses zur Optimierung der Risikomanagement. Die Strategie verwendet ein anpassungsfähiges Stop-Loss- und Profit-Schema, das die Handelsparameter automatisch an die Marktvolatilität anpasst.

Strategieprinzip

Die Strategie verwendet drei Haupttechnik-Indikator-Kombinationen, um Handelschancen zu identifizieren. Zuerst wird die Richtung des Markttrends durch 11-Zyklus- und 34-Zyklus-EMA bestimmt. Zweitens wird der verbesserte Squeeze Momentum-Indikator verwendet, um Marktdruck und potenzielle Durchbruchsmöglichkeiten zu erkennen, der die Preisabweichung durch die lineare Regressionsmethode berechnet.

Strategische Vorteile

  1. Multidimensionelle Signalbestätigung: Durch die Kombination mehrerer technischer Indikatoren und der Analyse von Zeiträumen wird das Risiko für falsche Signale deutlich reduziert.
  2. Intelligentes Risikomanagement: Dynamische Stop-Loss-Systeme, die sich automatisch an Marktschwankungen anpassen, um vorzeitige Ausstiege zu vermeiden und gleichzeitig die Gewinne zu schützen.
  3. Anpassungsfähigkeit: Die Strategieparameter können an unterschiedliche Marktbedingungen angepasst werden und haben eine gute Anpassungsfähigkeit.
  4. Der vollständige Abschluss der Transaktionen: Es gibt klare Regeln für das Management von Eintrittssignalen bis zum Ausstieg, wodurch der Einfluss subjektiver Urteile verringert wird.
  5. Flow-Confirmation: Durch die Überwachung der Flow-Confirmation wird der Kurs verbessert und die Zuverlässigkeit der Transaktionen erhöht.

Strategisches Risiko

  1. Parameter-Sensitivität: Die Parameter-Einstellungen für mehrere technische Kennzahlen erfordern eine sorgfältige Optimierung, und falsche Parameter können zu einer Leistungsabnahme führen.
  2. Marktumfeldabhängigkeit: Die Signalqualität kann in stark volatilen oder schwach liquiden Marktumgebungen beeinträchtigt werden.
  3. Komplexität der Berechnung: Die Berechnung von mehreren Zeiträumen kann zu Signalverzögerungen führen, die die tatsächliche Effektivität des Handels beeinträchtigen.
  4. Stop-Loss-Anpassungsrisiko: Dynamische Stop-Losses können unter bestimmten Marktbedingungen zu radikal oder konservativ sein.
  5. Die Strategie erfordert eine angemessene Verwaltung der Mittel, um Risiken und Erträge auszugleichen.

Richtung der Strategieoptimierung

  1. Einführung von Volatilitätsanpassung: Parameter können dynamisch an ATR oder andere Volatilitätsindikatoren angepasst werden, um die Anpassungsfähigkeit der Strategie zu verbessern.
  2. Optimierte Signalfilterung: Um die Signalqualität zu verbessern, kann eine Gewichtung des Transaktionsvolumens oder eine Zeitfilterung hinzugefügt werden.
  3. Verbesserte Stop-Loss-Mechanismen: Die Einstellung der Stop-Loss-Punkte kann in Kombination mit Unterstützung und Widerstand optimiert werden.
  4. Erweiterung der Analyse des Marktumfelds: Einführung von Indikatoren für die Stärke von Markttrends und Verwendung verschiedener Parameter-Sätze für verschiedene Marktumgebungen.
  5. Verbesserung der Kapitalverwaltung: Einführung von Algorithmen zur Positionsverwaltung, die den Positionsanteil an die Signalstärke und Marktschwankungen anpassen.

Zusammenfassen

Die Strategie bietet den Händlern eine systematische Handelsstrategie durch mehrdimensionale technische Analyse und intelligente Risikomanagement. Ihr zentraler Vorteil liegt in der Kombination von Trendverfolgung und dynamischem Risikomanagement, um Marktchancen zu erfassen und gleichzeitig die Gewinne zu schützen. Obwohl es einige Aspekte der Strategie gibt, die optimiert werden müssen, kann sie mit vernünftigen Parameter-Einstellungen und Risikokontrollen immer noch als ein wirksames Handelsinstrument eingesetzt werden.

Strategiequellcode
/*backtest
start: 2024-11-10 00:00:00
end: 2024-12-09 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("LL Crypto - SUI", overlay=true)

// Parâmetros de tempo para criptomoedas
fast_ema_len = input.int(11, minval=5, title="Fast EMA")
slow_ema_len = input.int(34, minval=20, title="Slow EMA")
sqm_lengthKC = input.int(20, title="SQM KC Length")
kauf_period = input.int(20, title="Kauf Period")
kauf_mult = input.float(2, title="Kauf Mult factor")
min_profit_sl = input.float(5, minval=0.01, maxval=100.0, title="Min profit to start moving SL [%]")
longest_sl = input.float(10, minval=0.01, maxval=100.0, title="Maximum possible of SL [%]")
sl_step = input.float(0.5, minval=0.0, maxval=1.0, title="Take profit factor")

// Parâmetros adaptados para criptomoedas
CMF_length = input.int(11, minval=1, title="CMF length")
show_plots = input.bool(true, title="Show plots")

// Definir intervalos de tempo para criptomoedas
selected_timeframe = input.string(defval="15", title="Intervalo de Tempo", options=["1", "15", "60"])

lower_resolution = timeframe.period == '1' ? '1' :
                   timeframe.period == '5' ? '15' :
                   timeframe.period == '15' ? '60' :
                   timeframe.period == '60' ? '240' :
                   timeframe.period == '240' ? 'D' :
                   timeframe.period == 'D' ? 'W' : 'M'

sp_close = close[barstate.isrealtime ? 1 : 0]
sp_high = high[barstate.isrealtime ? 1 : 0]
sp_low = low[barstate.isrealtime ? 1 : 0]
sp_volume = volume[barstate.isrealtime ? 1 : 0]

// Calcular Squeeze Momentum ajustado para criptomoedas
sqm_val = ta.linreg(sp_close - math.avg(math.avg(ta.highest(sp_high, sqm_lengthKC), ta.lowest(sp_low, sqm_lengthKC)), ta.sma(sp_close, sqm_lengthKC)), sqm_lengthKC, 0)
close_low = request.security(syminfo.tickerid, lower_resolution, sp_close, lookahead=barmerge.lookahead_on)
high_low = request.security(syminfo.tickerid, lower_resolution, sp_high, lookahead=barmerge.lookahead_on)
low_low = request.security(syminfo.tickerid, lower_resolution, sp_low, lookahead=barmerge.lookahead_on)
sqm_val_low = ta.linreg(close_low - math.avg(math.avg(ta.highest(high_low, sqm_lengthKC), ta.lowest(low_low, sqm_lengthKC)), ta.sma(close_low, sqm_lengthKC)), sqm_lengthKC, 0)

// CMF adaptado para criptomoedas
ad = sp_close == sp_high and sp_close == sp_low or sp_high == sp_low ? 0 : ((2 * sp_close - sp_low - sp_high) / (sp_high - sp_low)) * sp_volume
money_flow = math.sum(ad, CMF_length) / math.sum(sp_volume, CMF_length)

// Condições de entrada para criptomoedas
low_condition_long = (sqm_val_low > sqm_val_low[1])
low_condition_short = (sqm_val_low < sqm_val_low[1])
money_flow_min = (money_flow[4] > money_flow[2]) and (money_flow[3] > money_flow[2]) and (money_flow[2] < money_flow[1]) and (money_flow[2] < money_flow)
money_flow_max = (money_flow[4] < money_flow[2]) and (money_flow[3] < money_flow[2]) and (money_flow[2] > money_flow[1]) and (money_flow[2] > money_flow)
condition_long = ((sqm_val > sqm_val[1])) and money_flow_min and ta.lowest(sqm_val, 5) < 0
condition_short = ((sqm_val < sqm_val[1])) and money_flow_max and ta.highest(sqm_val, 5) > 0
enter_long = low_condition_long and condition_long
enter_short = low_condition_short and condition_short

// Stop conditions
var float current_target_price = na
var float current_sl_price = na
var float current_target_per = na
var float current_profit_per = na

set_targets(isLong, min_profit, current_target_per, current_profit_per) =>
    float target = na
    float sl = na
    if isLong
        target := sp_close * (1.0 + current_target_per)
        sl := sp_close * (1.0 - (longest_sl / 100.0))
    else
        target := sp_close * (1.0 - current_target_per)
        sl := sp_close * (1.0 + (longest_sl / 100.0))
    [target, sl]

target_reached(isLong, min_profit, current_target_per, current_profit_per) =>
    float target = na
    float sl = na
    float profit_per = na
    float target_per = na
    if current_profit_per == na
        profit_per := (min_profit * sl_step) / 100.0
    else
        profit_per := current_profit_per + ((min_profit * sl_step) / 100.0)
    target_per := current_target_per + (min_profit / 100.0)
    if isLong
        target := strategy.position_avg_price * (1.0 + target_per)
        sl := strategy.position_avg_price * (1.0 + profit_per)
    else
        target := strategy.position_avg_price * (1.0 - target_per)
        sl := strategy.position_avg_price * (1.0 - profit_per)
    [target, sl, profit_per, target_per]

hl_diff = ta.sma(sp_high - sp_low, kauf_period)
stop_condition_long = 0.0
new_stop_condition_long = sp_low - (hl_diff * kauf_mult)
if (strategy.position_size > 0)
    if (sp_close > current_target_price)
        [target, sl, profit_per, target_per] = target_reached(true, min_profit_sl, current_target_per, current_profit_per)
        current_target_price := target
        current_sl_price := sl
        current_profit_per := profit_per
        current_target_per := target_per
    stop_condition_long := math.max(stop_condition_long[1], current_sl_price)
else
    stop_condition_long := new_stop_condition_long

stop_condition_short = 99999999.9
new_stop_condition_short = sp_high + (hl_diff * kauf_mult)
if (strategy.position_size < 0)
    if (sp_close < current_target_price)
        [target, sl, profit_per, target_per] = target_reached(false, min_profit_sl, current_target_per, current_profit_per)
        current_target_price := target
        current_sl_price := sl
        current_profit_per := profit_per
        current_target_per := target_per
    stop_condition_short := math.min(stop_condition_short[1], current_sl_price)
else
    stop_condition_short := new_stop_condition_short

// Submit entry orders
if (enter_long and (strategy.position_size <= 0))
    if (strategy.position_size < 0)
        strategy.close(id="SHORT")
    current_target_per := (min_profit_sl / 100.0)
    current_profit_per := na
    [target, sl] = set_targets(true, min_profit_sl, current_target_per, current_profit_per)
    current_target_price := target
    current_sl_price := sl
    strategy.entry(id="LONG", direction=strategy.long)

    if show_plots
        label.new(bar_index, sp_high, text="LONG\nSL: " + str.tostring(stop_condition_long), style=label.style_label_down, color=color.green)





if (enter_short and (strategy.position_size >= 0))
    if (strategy.position_size > 0)
        strategy.close(id="LONG")
    current_target_per := (min_profit_sl / 100.0)
    current_profit_per := na
    [target, sl] = set_targets(false, min_profit_sl, current_target_per, current_profit_per)
    current_target_price := target
    current_sl_price := sl
    strategy.entry(id="SHORT", direction=strategy.short)
    if show_plots
        label.new(bar_index, sp_high, text="SHORT\nSL: " + str.tostring(stop_condition_short), style=label.style_label_down, color=color.red)

if (strategy.position_size > 0)
    strategy.exit(id="EXIT LONG", stop=stop_condition_long)

if (strategy.position_size < 0)
    strategy.exit(id="EXIT SHORT", stop=stop_condition_short)

// Plot anchor trend
plotshape(low_condition_long, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(low_condition_short, style=shape.triangledown, location=location.abovebar, color=color.red)

plotshape(condition_long, style=shape.triangleup, location=location.belowbar, color=color.green)
plotshape(condition_short, style=shape.triangledown, location=location.belowbar, color=color.red)

plotshape(enter_long, style=shape.triangleup, location=location.bottom, color=color.green)
plotshape(enter_short, style=shape.triangledown, location=location.bottom, color=color.red)

// Plot emas
plot(ta.ema(close, 20), color=color.blue, title="20 EMA")
plot(ta.ema(close, 50), color=color.orange, title="50 EMA")
plot(ta.sma(close, 200), color=color.red, title="MA 200")

// Plot stop loss values for confirmation
plot(series=(strategy.position_size > 0) and show_plots ? stop_condition_long : na, color=color.green, style=plot.style_linebr, title="Long Stop")
plot(series=(strategy.position_size < 0) and show_plots ? stop_condition_short : na, color=color.green, style=plot.style_linebr, title="Short Stop")
plot(series=(strategy.position_size < 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Short TP")
plot(series=(strategy.position_size > 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Long TP")