Triple-EMA-Retracement-Scalping-Strategie

EMA ATR PULLBACK SCALPING
Erstellungsdatum: 2025-09-30 13:04:41 zuletzt geändert: 2025-09-30 13:04:41
Kopie: 0 Klicks: 444
2
konzentrieren Sie sich auf
319
Anhänger

Triple-EMA-Retracement-Scalping-Strategie Triple-EMA-Retracement-Scalping-Strategie

25/50/100 EMA Dreifachfilterung, das ist der wahre Trendrückzug

Die Strategie baut ein komplettes Trenderkennungssystem mit drei 25/50/100 EMAs auf, die EMAs in der Reihenfolge angeordnet und in die gleiche Richtung geneigt werden müssen, plus eine Mindestintervallanforderung von 0.10x ATR. Die Daten zeigen, dass diese Dreifachfilterung effektiv ist, um falsche Durchbrüche in schwankenden Märkten zu vermeiden und nur bei echten Trends zu helfen.

Der Schlüssel liegt in einer “sauberen EMA-Aufstellung”: 25>50>100 bei mehreren Köpfen und vollständig nach oben, 25<50<100 bei leeren Köpfen und vollständig nach unten. Die Intervallfilterung sorgt dafür, dass der Trend stark genug ist, um ein ungültiges Signal unter gleichmäßiger Verklebung zu vermeiden.

Rücktrittslogik-Design-Genauigkeit, Rücktrittsbestätigung innerhalb von 15 Zyklen erforderlich

Der Kern der Strategie ist die Rücknahme-Detektionsmechanik. Eine mehrstufige Rücknahme erfordert, dass der Preis 25 oder 50 EMA erreicht, aber über 100 EMA bleibt, und eine leere Rücknahme erfordert, dass der Preis 25 oder 50 EMA erreicht, aber unter 100 EMA bleibt. Diese Konstruktion ist viel präziser als die herkömmliche “Breakout-Unterstützung und dann kaufen”.

Die Einstellung eines 15-Zyklen-Rückzugsfensters ist vernünftig. Die Rücklaufdaten zeigen, dass ein echter Trendrückzug in der Regel innerhalb von 10 bis 15 Zyklen abgeschlossen wird. Ein Rückzug über dieses Zeitfenster hinaus bedeutet oft, dass ein Trendwechsel möglich ist.

Die Eintrittsprüfung ist streng, die gesamte K-Linie muss vollständig von der 25EMA getrennt sein.

Die Triggerbedingungen für den Einstieg sind äußerst streng: Nach der Bestätigung der K-Linie-Schließung muss die gesamte K-Linie (Open, Top, Low, Schließung) vollständig auf der richtigen Seite der 25EMA liegen. Diese Konstruktion vermeidet falsche Durchbrüche und Tellerlärm und sorgt dafür, dass der Einstieg nur nach der tatsächlichen Umkehrbestätigung erfolgt.

Mehrköpfige Eintrittsvoraussetzungen: Aufschluss> 25EMA, Minimum> 25EMA, Schließung> 25EMA. Leerköpfige Eintrittsvoraussetzungen: Aufschluss<25EMA, Maximum<25EMA, Schließung<25EMA. Diese Methode der “ganzen K-Linie-Bestätigung” verbessert die Eintrittsqualität erheblich und reduziert ungültige Geschäfte.

10% Lagerplatz + 0,05% Gebühr, geeignet für Hochfrequenz-Scalping

Die Strategie hat eine Standardposition von 10% eingestellt, um genügend Gewinne zu erzielen und das einzelne Risiko zu kontrollieren. Die Vergütung von 0,05% ist nahe an den tatsächlichen Handelskosten eingestellt, und die Rückmeldungsergebnisse haben einen besseren Bezugsrahmen.

Wichtiger Hinweis: Die Strategie beinhaltet nur die Einstiegslogik und keine Stop-Loss-Einstellungen. Für den Einsatz in der Praxis muss ein strenges Risikomanagement durchgeführt werden. Es wird empfohlen, einen Stop-Loss von 2-3 mal ATR und einen Stop-Loss von 1,5-2 mal RR zu setzen.

Die Szenarien sind eindeutig, die Trendmärkte sind gut, aber es ist vorsichtig, wenn die Märkte schwanken

Die Strategie funktioniert gut in klaren Trendmärkten und eignet sich besonders für Rückkauf bei einseitigen Bewegungen. In schwankenden Märkten ist es jedoch schwierig, die EMA-Klassifizierung zu erfüllen, und es gibt relativ wenige Handelsmöglichkeiten. Dies ist in der Tat der Vorteil der Strategie, um übermäßigen Handel in ungünstigen Umgebungen zu vermeiden.

Risikotipp: Die historische Rückspielung ist kein Hinweis auf zukünftige Gewinne und die Strategie besteht das Risiko einer fortlaufenden Verlust. In einem wackligen Markt kann es zu einer langen Zeit ohne Signal kommen. Es ist empfehlenswert, geduldig auf das richtige Marktumfeld zu warten.

Strategiequellcode
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-27 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Bybit","currency":"ETH_USDT","balance":500000}]
*/

//@version=6
strategy("Clean 25/50/100 EMA Pullback Scalper — Entries Only (Side Select)",
     overlay=true, calc_on_every_tick=true, calc_on_order_fills=true,
     initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.05,
     pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// === Side selector ===
side = input.string("Both", "Trade Side", options=["Both", "Long Only", "Short Only"])
longsEnabled  = side == "Both" or side == "Long Only"
shortsEnabled = side == "Both" or side == "Short Only"

// === Inputs ===
lenFast   = input.int(25,  "Fast EMA (pullback)", minval=1)
lenMid    = input.int(50,  "Mid EMA (filter)",    minval=1)
lenSlow   = input.int(100, "Slow EMA (safety)",   minval=1)

useSlope  = input.bool(true,  "Require EMAs sloping same way?")
useSpread = input.bool(true,  "Require clean spacing (min spread)?")
spreadPct = input.float(0.10, "Min spread vs ATR (0.10 = 0.10×ATR)", step=0.01, minval=0.0)

pullLookback = input.int(15, "Max bars after pullback", minval=1, maxval=100)
showSignals  = input.bool(true, "Show entry markers?")

// === Series ===
ema25  = ta.ema(close, lenFast)
ema50  = ta.ema(close, lenMid)
ema100 = ta.ema(close, lenSlow)
atr    = ta.atr(14)

// === Trend & spacing ===
isUpStack   = ema25 > ema50 and ema50 > ema100
isDownStack = ema25 < ema50 and ema50 < ema100
slopeUp     = ema25 > ema25[1] and ema50 > ema50[1] and ema100 > ema100[1]
slopeDown   = ema25 < ema25[1] and ema50 < ema50[1] and ema100 < ema100[1]

minGap = atr * spreadPct
spreadUpOK   = (ema25 - ema50) > minGap and (ema50 - ema100) > minGap
spreadDownOK = (ema100 - ema50) > minGap and (ema50 - ema25) > minGap

trendLongOK  = isUpStack   and (useSlope ? slopeUp   : true) and (useSpread ? spreadUpOK   : true)
trendShortOK = isDownStack and (useSlope ? slopeDown : true) and (useSpread ? spreadDownOK : true)

// === Pullback detection state ===
var bool  pullArmedLong   = false
var bool  pullArmedShort  = false
var int   pullBarIdxLong  = na
var int   pullBarIdxShort = na
var float pullMinLong     = na
var float pullMaxShort    = na

// Long pullback state
if trendLongOK
    touched25 = low <= ema25
    touched50 = low <= ema50
    stayedAbove100 = low > ema100
    if (touched25 or touched50) and stayedAbove100
        pullArmedLong  := true
        pullBarIdxLong := bar_index
        pullMinLong    := na(pullMinLong) ? low : math.min(pullMinLong, low)
    else if pullArmedLong
        pullMinLong := na(pullMinLong) ? low : math.min(pullMinLong, low)
        if low <= ema100 or (bar_index - pullBarIdxLong > pullLookback)
            pullArmedLong := false
            pullMinLong   := na
else
    pullArmedLong := false
    pullMinLong   := na

// Short pullback state
if trendShortOK
    touched25s = high >= ema25
    touched50s = high >= ema50
    stayedBelow100 = high < ema100
    if (touched25s or touched50s) and stayedBelow100
        pullArmedShort  := true
        pullBarIdxShort := bar_index
        pullMaxShort    := na(pullMaxShort) ? high : math.max(pullMaxShort, high)
    else if pullArmedShort
        pullMaxShort := na(pullMaxShort) ? high : math.max(pullMaxShort, high)
        if high >= ema100 or (bar_index - pullBarIdxShort > pullLookback)
            pullArmedShort := false
            pullMaxShort   := na
else
    pullArmedShort := false
    pullMaxShort   := na

// === Entry triggers (confirmed bar & whole candle outside 25 EMA) ===
longEntryRaw  = pullArmedLong  and barstate.isconfirmed and (open > ema25 and low > ema25 and close > ema25) and (na(pullMinLong)  or pullMinLong  > ema100)
shortEntryRaw = pullArmedShort and barstate.isconfirmed and (open < ema25 and high < ema25 and close < ema25) and (na(pullMaxShort) or pullMaxShort < ema100)

longEntry  = longsEnabled  and longEntryRaw
shortEntry = shortsEnabled and shortEntryRaw

// Disarm after trigger
if longEntry
    pullArmedLong := false
    pullMinLong   := na
if shortEntry
    pullArmedShort := false
    pullMaxShort   := na

// === Orders (entries only; no TP/SL) ===
if longEntry and strategy.position_size <= 0
    strategy.entry("Long", strategy.long)

if shortEntry and strategy.position_size >= 0
    strategy.entry("Short", strategy.short)

// === Plots & visuals ===
plot(ema25,  "EMA 25",  color=color.new(color.teal, 0))
plot(ema50,  "EMA 50",  color=color.new(color.orange, 0))
plot(ema100, "EMA 100", color=color.new(color.purple, 0))

bgcolor(trendLongOK  ? color.new(color.green, 92) : na)
bgcolor(trendShortOK ? color.new(color.red, 92)   : na)

if showSignals and longEntry
    label.new(bar_index, low, "▲ BUY\nFull candle above 25 EMA", style=label.style_label_up, textcolor=color.white, color=color.new(color.green, 0))
if showSignals and shortEntry
    label.new(bar_index, high, "▼ SELL\nFull candle below 25 EMA", style=label.style_label_down, textcolor=color.white, color=color.new(color.red, 0))