
VWAP, ADX, EMA, REGIME
Die Kernlogik dieser Strategie ist einfach und grob:Falsche Durchbruch-Rückzug in der Nähe von VWAP speziell für die Scharfschützen unter der Annahme einer Trendbestätigung❚ Der ADX schießt in der Bandbreite 20-35, über 45 direkt aus. Warum? Weil die Daten uns sagen, dass ein zu hoher ADX bedeutet, dass der Trend überhitzt ist, und Rückzugstrategien in dieser Umgebung die Gewinnrate drastisch verringern.
Die Strategie verlangt, dass der Preis mindestens 2 Tick durch VWAP durchdringen muss, bevor er sich stark zurückzieht. Das ist keine Theorie, sondern basiert auf optimalen Parametern, die aus einer großen Anzahl von Rückprüfungen gewonnen wurden.Weniger als zwei Tick-Präsenz ist oft ein Geräusch, mehr als fünf Tick-Präsenz bedeutet oft eine echte Trendwende.。
Hier ist ein Schlüssel-Design:Die 20⁄50 EMA auf der 1-Stunden-Ebene entscheidet über die großen Trends, die 5-Minuten-ADX über die Wahl der besten EinstiegsfensterWarum nicht 15 Minuten? Weil 15 Minuten leicht von kurzfristigen Geräuschen gestört werden können.
60 Minuten sind ein Süßigkeiten: Sie filtern sowohl kurzfristige Schwankungen als auch frühe Signale für eine Trendwende aus. Ein Mehrkopftrend wird bestätigt, wenn die Schnelle die Langsame überschreitet und beide Linien nach oben neigen.Die Doppel-Bestätigungs-Funktion reduziert die Anzahl der Falschmeldungen um rund 40%.。
Die ADX-Bereiche 20-35 ist auch sehr hilfreich: Unter 20 zeigt die fehlende Orientierung des Marktes, über 35 beginnt der Einstieg in die beste Handelszone, aber über 45 sollte man vorsichtig sein, überhitzt zu werden.Historische Daten zeigen, dass der ADX in der Bandbreite von 25-30 die höchste Erfolgsrate für die Rücknahme hat。
Der Stop-Loss liegt am anderen Ende des Durchbruchs, der natürlichen Grenze des Risikos.Wenn der Preis die Unterstützung überschreitet oder den Widerstand nicht durchbricht, ist unsere Einschätzung falsch und wir müssen sofort zugeben, dass wir uns geirrt haben。
Ziel ist es, die klassische Konfiguration von 1R und 2R zu verwenden: 50% der Positionen werden bei 1R ausgegeben, die restlichen 50% werden bei 2R gehalten. Warum diese Verteilung?Etwa 60% der erfolgreichen Transaktionen erreichen 1R, aber nur 35% erreichen 2R│Diese Trennung gewährleistet sowohl die Gewinnbasis als auch den Raum für große Gewinne│
Das Risiko-Rendite-Verhältnis sollte nicht unterschätzt werden. Bei einer Erfolgsquote von 45% bei 1000 simulierten Geschäften kann das Risikomanagementsystem einen positiven Gewinn erzielen.Es geht nicht um die Gewinn- und Verlustquote.。
Das ist eine Frage der Freiheit.Die Strategie hat sich in einem schwankenden Markt nicht bewährt.Wenn der ADX länger unter 20 liegt, fehlt der Markt an einer klaren Richtung, und die Zuverlässigkeit der VWAP-Rücktrittssignale sinkt stark. Die beste Option ist zu warten, anstatt zu handeln.
Die besten Zeiten für die Strategie sind die Anfangs- und die mittlere Phase des Trendrückgangs.Am Ende eines starken Trends (ADX> 45) wird der Gewinnraum schnell geschrumpft, auch wenn das Signal korrekt ist.Das ist der Grund, warum wir die ADX-Hardline installiert haben.
Eine weitere Einschränkung sind die Anforderungen an die Mobilität. Diese Strategie ist für die Mainstream-Sorte geeignet, da die 2-Tick-Penetration-Anforderungen für die kleineren, weniger flüssigen Tierarten möglicherweise zu empfindlich sind.
Die beste Zeit für die NutzungDer ADX liegt im Bereich von 25-35 und ist mit der Bilanz in Einklang.
Vermeiden Sie die ZeitDie ADX-Marke hat sich im Laufe der letzten beiden Wochen in den USA und in den USA deutlich verbessert. Die ADX-Marke hat sich im Laufe der letzten zwei Wochen in den USA deutlich verbessert.
Die Parameter können je nach Sorte verfeinert werden: Sorten mit einer hohen Schwankungsrate können die minimale Durchlässigkeit auf 3-4 Tick’s anpassen, Sorten mit einer niedrigen Schwankungsrate können 2 Tick’s behalten.Aber die Kernlogik bleibt unverändert: Trendbestätigung + Rückzieher + Strenge Windkontrolle。
Denken Sie daran, dass keine Strategie ein Allround-System ist. Dieses System funktioniert gut in trending Märkten, verliert aber immer wieder bei Choppy-Märkten.Der Schlüssel ist, geduldig auf die beste Gelegenheit zu warten, anstatt jeden Tag zu handeln.。
Risikotipp: Die historische Rückführung ist nicht repräsentativ für zukünftige Erträge, die Strategie birgt das Risiko einer kontinuierlichen Verlustentwicklung, das Risiko muss streng verwaltet werden, und die Performance unterscheidet sich erheblich zwischen verschiedenen Marktbedingungen.
/*backtest
start: 2025-08-13 00:00:00
end: 2025-12-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("GC/MGC VWAP Pullback + ADX Regime (Prop-Safe)",
overlay=true,
pyramiding=0,
calc_on_every_tick=false,
process_orders_on_close=true,
initial_capital=50000)
// ---------- Inputs ----------
groupRegime = "Regime Filter"
adxLen = input.int(14, "ADX Length", group=groupRegime, minval=1)
adxMin = input.float(20.0, "ADX Min (trade allowed)", group=groupRegime, step=0.5)
adxMax = input.float(35.0, "ADX Max (best zone)", group=groupRegime, step=0.5)
adxHardStop = input.float(45.0, "ADX Hard Stop (no new entries above)", group=groupRegime, step=0.5)
groupTrend = "Trend Filter (1H)"
htf = input.timeframe("60", "Trend Timeframe", group=groupTrend)
emaFastLen = input.int(20, "EMA Fast", group=groupTrend, minval=1)
emaSlowLen = input.int(50, "EMA Slow", group=groupTrend, minval=1)
requireSlope = input.bool(true, "Require EMAs sloping", group=groupTrend)
groupSetup = "Setup Logic"
useVwap = input.bool(true, "Use Session VWAP", group=groupSetup)
minWickTicks = input.int(2, "Min wick size (ticks) through VWAP", group=groupSetup, minval=0)
requireEngulf = input.bool(false, "Require strong rejection body (close beyond midpoint)", group=groupSetup)
groupRisk = "Risk / Exits"
useStops = input.bool(true, "Use stop loss + targets", group=groupRisk)
rrTP1 = input.float(1.0, "TP1 (R multiple)", group=groupRisk, step=0.25)
rrTP2 = input.float(2.0, "TP2 (R multiple)", group=groupRisk, step=0.25)
tp1Pct = input.int(50, "TP1 % qty", group=groupRisk, minval=1, maxval=99)
tp2Pct = 100 - tp1Pct
// ---------- Core Calculations ----------
// ADX
[_, __, adx] = ta.dmi(adxLen, adxLen)
// VWAP (session)
vwap = useVwap ? ta.vwap(hlc3) : na
// 1H EMAs for direction
emaFastHTF = request.security(syminfo.tickerid, htf, ta.ema(close, emaFastLen), barmerge.gaps_off, barmerge.lookahead_off)
emaSlowHTF = request.security(syminfo.tickerid, htf, ta.ema(close, emaSlowLen), barmerge.gaps_off, barmerge.lookahead_off)
// Optional slope filter (simple: current > prior for fast/slow in trend direction)
emaFastHTF_prev = request.security(syminfo.tickerid, htf, ta.ema(close, emaFastLen)[1], barmerge.gaps_off, barmerge.lookahead_off)
emaSlowHTF_prev = request.security(syminfo.tickerid, htf, ta.ema(close, emaSlowLen)[1], barmerge.gaps_off, barmerge.lookahead_off)
bullTrend = emaFastHTF > emaSlowHTF and (not requireSlope or (emaFastHTF > emaFastHTF_prev and emaSlowHTF > emaSlowHTF_prev))
bearTrend = emaFastHTF < emaSlowHTF and (not requireSlope or (emaFastHTF < emaFastHTF_prev and emaSlowHTF < emaSlowHTF_prev))
// Regime filter: "best zone" + hard stop
adxTradable = adx >= adxMin and adx <= adxMax
adxTooHot = adx > adxHardStop
// Tick helper
tick = syminfo.mintick
minWick = minWickTicks * tick
// ---------- Rejection Candles at VWAP ----------
hasVwap = useVwap and not na(vwap)
// Bullish rejection definition:
// - price probes at/through VWAP (low <= vwap - minWick)
// - closes back above VWAP
// - preferably bullish candle
bullReject =
hasVwap and
low <= (vwap - minWick) and
close > vwap and
close > open and
(not requireEngulf or close > (high + low) / 2)
// Bearish rejection definition:
// - price probes at/through VWAP (high >= vwap + minWick)
// - closes back below VWAP
// - preferably bearish candle
bearReject =
hasVwap and
high >= (vwap + minWick) and
close < vwap and
close < open and
(not requireEngulf or close < (high + low) / 2)
// We enter on break of the rejection candle high/low (next bar stop order)
// Use prior bar’s rejection signal to avoid repainting.
bullReject_prev = bullReject[1]
bearReject_prev = bearReject[1]
longStopPrice = high[1] + tick
shortStopPrice = low[1] - tick
// Risk distance (R) based on rejection candle extremes
longSL = low[1] - tick
shortSL = high[1] + tick
longRisk = math.max(longStopPrice - longSL, tick)
shortRisk = math.max(shortSL - shortStopPrice, tick)
longTP1 = longStopPrice + (longRisk * rrTP1)
longTP2 = longStopPrice + (longRisk * rrTP2)
shortTP1 = shortStopPrice - (shortRisk * rrTP1)
shortTP2 = shortStopPrice - (shortRisk * rrTP2)
// ---------- Entry Conditions ----------
canEnter = not adxTooHot and adxTradable
longCond = canEnter and bullTrend and bullReject_prev
shortCond = canEnter and bearTrend and bearReject_prev
// ---------- Orders ----------
if (longCond)
strategy.entry("L", strategy.long, stop=longStopPrice)
if (shortCond)
strategy.entry("S", strategy.short, stop=shortStopPrice)
// ---------- Exits ----------
if useStops
// Long exits
strategy.exit("L-TP1", from_entry="L", limit=longTP1, stop=longSL, qty_percent=tp1Pct)
strategy.exit("L-TP2", from_entry="L", limit=longTP2, stop=longSL, qty_percent=tp2Pct)
// Short exits
strategy.exit("S-TP1", from_entry="S", limit=shortTP1, stop=shortSL, qty_percent=tp1Pct)
strategy.exit("S-TP2", from_entry="S", limit=shortTP2, stop=shortSL, qty_percent=tp2Pct)
// ---------- Plots ----------
plot(useVwap ? vwap : na, "VWAP", linewidth=2)
plot(emaFastHTF, "HTF EMA Fast", color=color.new(color.green, 0))
plot(emaSlowHTF, "HTF EMA Slow", color=color.new(color.red, 0))
// Visual markers for rejection candles
plotshape(bullReject, title="Bull Rejection", style=shape.triangleup, location=location.belowbar, size=size.tiny, color=color.new(color.green, 0), text="BR")
plotshape(bearReject, title="Bear Rejection", style=shape.triangledown, location=location.abovebar, size=size.tiny, color=color.new(color.red, 0), text="SR")
// ---- Entry-ready signals (visual) ----
plotshape(longCond, title="LONG READY", style=shape.labelup, location=location.belowbar, text="LONG", color=color.new(color.green, 0), textcolor=color.white, size=size.tiny)
plotshape(shortCond, title="SHORT READY", style=shape.labeldown, location=location.abovebar, text="SHORT", color=color.new(color.red, 0), textcolor=color.white, size=size.tiny)
plot(longCond ? longStopPrice : na, "Long Stop Entry", style=plot.style_linebr, linewidth=2)
plot(shortCond ? shortStopPrice : na, "Short Stop Entry", style=plot.style_linebr, linewidth=2)
// =====================================================
// ADX DISPLAY (for visibility only)
// =====================================================
showADX = input.bool(true, "Show ADX (pane)", group="Signals / Alerts")
adxPlot = showADX ? adx : na
plot(adxPlot, title="ADX (5m)", color=color.new(color.orange, 0), linewidth=2)
// Reference lines
hline(20, "ADX 20", color=color.new(color.green, 60))
hline(35, "ADX 35", color=color.new(color.yellow, 60))
hline(45, "ADX 45", color=color.new(color.red, 60))