
VWAP, ADX, EMA, REGIME
La lógica central de esta estrategia es sencilla y brutal:Retirada de la falsa brecha cerca del VWAP, con el supuesto de que se confirme la tendenciaEl ADX se dispara cuando está en el rango de 20-35, y más de 45 se detiene directamente. ¿Por qué? Porque los datos nos dicen que el ADX demasiado alto significa que la tendencia se ha sobrecalentado, y las estrategias de retiro tienen una tasa de ganancias más baja en este entorno.
La estrategia requiere que el precio penetre el VWAP por al menos 2 ticks y luego retroceda fuertemente. Esto no es una ciencia ficción, sino un parámetro óptimo basado en una gran cantidad de retroalimentación.Menos de 2 ticks de penetración suelen ser ruido, y más de 5 ticks de penetración suelen significar un verdadero cambio de tendencia。
Este es un diseño clave:El EMA 20⁄50 a nivel de 1 hora es responsable de determinar las grandes tendencias, y el ADX de 5 minutos es responsable de elegir la mejor ventana de entrada¿Por qué no usar la luz solar? Porque la luz solar es muy lenta. ¿Por qué no usar 15 minutos? Porque 15 minutos son susceptibles a ser interrumpidos por el ruido a corto plazo.
60 minutos es un punto dulce: puede filtrar las fluctuaciones de corta duración sin perderse las señales tempranas de cambio de tendencia. La tendencia múltiple se confirma cuando la línea rápida atraviesa la línea lenta y ambas líneas tienden hacia arriba.Este mecanismo de doble confirmación reduce las señales falsas en un 40%.。
La configuración del ADX en el rango 20-35 también es importante: menos de 20 indica que el mercado carece de dirección, más de 35 comienza a entrar en la zona de mejor negociación, pero más de 45 debe tener cuidado con la tendencia de sobrecalentamiento.Los datos históricos muestran que la estrategia de retiro tiene mayor probabilidad de éxito cuando el ADX está en el rango 25-30。
El Stop Loss está situado al otro extremo de la brecha, que es el límite de riesgo más natural.Si el precio cae por debajo del soporte o no logra romper la resistencia, entonces nuestro juicio está equivocado y debemos reconocerlo inmediatamente.。
El objetivo es establecer una configuración clásica de 1R y 2R: 50% de las posiciones en 1R se retirarán, y el 50% restante se mantendrá en 2R. ¿Por qué esta distribución?Alrededor del 60% de las transacciones exitosas alcanzan el 1R, pero sólo el 35% alcanzan el 2R。 Este tipo de salidas en grupos garantiza un ingreso básico, pero también da espacio para grandes ganancias。
No hay que menospreciar el diseño de la relación entre el riesgo y el retorno. En 1000 simulaciones de operaciones, el sistema de gestión de riesgos puede generar ganancias positivas incluso si la probabilidad de éxito es del 45%.La clave no es ganar, sino perder。
Hay que reconocerlo.Esta estrategia no sirvió para nada en un mercado de fluctuación horizontal.Cuando el ADX está por debajo de 20 durante mucho tiempo, el mercado carece de una dirección clara y la fiabilidad de la señal de retiro de VWAP disminuye considerablemente. En este caso, la mejor opción es esperar, no forzar la negociación.
La estrategia funciona mejor en las fases de retroceso temprano y medio de la tendencia.Al final de una fuerte tendencia (ADX>45), el espacio para obtener ganancias se estrechará rápidamente incluso si la señal es correctaPor eso es por lo que hay que configurar el ADX para que el cable duro se detenga.
Otra limitación es el requisito de movilidad. Esta estrategia es más adecuada para las variedades principales, ya que el requisito de penetración de 2 ticks puede ser demasiado sensible para las minorías con poca movilidad.
El mejor momento para usarloEl ADX se encuentra en el rango 25-35, con una combinación de volumen de negocios.
Evita el uso del tiempoEl ADX ha estado por debajo de los 20 en los períodos transitorios antes y después de las noticias importantes, y por encima de los 45 en los períodos finales de la tendencia.
Los parámetros se pueden ajustar de acuerdo con las diferentes variedades: las variedades con alto índice de oscilación pueden ajustar la penetración mínima a 3-4 ticks, las variedades con bajo índice de oscilación pueden mantener 2 ticks.Pero la lógica central no ha cambiado: confirmación de tendencia + retirada de captura + control de viento estricto。
Recuerde que ninguna estrategia es perfecta. Este sistema funciona muy bien en los mercados de tendencia, pero en los mercados de choppy se ven afectados por pequeñas pérdidas continuas.La clave es tener paciencia y esperar la mejor oportunidad, en lugar de exigir el intercambio todos los días.。
Nota de riesgo: El retroceso histórico no representa ganancias futuras, la estrategia tiene riesgo de pérdidas continuas, se requiere una gestión de riesgos estricta y el rendimiento varía significativamente en diferentes entornos de mercado.
/*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))