
VWAP, ADX, EMA, REGIME
A lógica central desta estratégia é simples e grosseira:Retirada de falsa brecha em torno de VWAP, com o objetivo de apontar para uma tendência confirmadaPorque os dados nos dizem que um ADX muito alto significa que a tendência está superaquecida, e as estratégias de retração caem rapidamente nesse ambiente.
A estratégia exige que o preço atravesse o VWAP por pelo menos 2 ticks e depois retroceda fortemente. Isso não é ficção, mas é baseado em um grande número de parâmetros de otimização.Menos de 2 ticks de penetração tendem a ser ruídos, e mais de 5 ticks de penetração geralmente significam uma verdadeira reversão de tendência。
Aqui está um projeto-chave:A EMA 20⁄50 em nível de 1 hora é responsável por julgar as grandes tendências, e o ADX de 5 minutos é responsável por escolher a melhor janela de entradaPorque é que não usam luz solar? Porque a luz solar é muito lenta. Porque é que não usam 15 minutos? Porque 15 minutos são facilmente perturbados por ruídos de curta duração.
60 minutos é um ponto doce: pode filtrar oscilações de curto prazo e não perder os sinais iniciais de mudança de tendência. A confirmação de tendência múltipla ocorre quando a linha rápida atravessa a linha lenta e ambas as linhas estão inclinadas para cima.O mecanismo de dupla verificação reduz os sinais falsos em cerca de 40%.。
A definição de 20-35 no ADX também é importante: abaixo de 20 indica falta de direção do mercado, acima de 35 começa a entrar na melhor zona de negociação, mas acima de 45 é preciso ter cuidado com a tendência de superaquecimento.Os dados históricos mostram que a estratégia de retração é mais bem sucedida quando o ADX está na faixa 25-30。
O ponto de paralisação fica no outro extremo da barreira de ruptura, que é a fronteira mais natural de risco.Se o preço derrubar o suporte ou se a resistência for quebrada, então o nosso julgamento está errado e temos que admitir isso imediatamente.。
O objetivo é definir a configuração clássica de 1R e 2R: 50% de posições em 1R e 50% restantes em 2R. Por que essa distribuição?Cerca de 60% dos negócios bem sucedidos atingem 1R, mas apenas 35% atingem 2R│ │ │ │ │ │ │ │ │ │
Não subestime a relação de risco/retorno. Mesmo com uma taxa de sucesso de 45% em 1000 simulações, o sistema de gestão de risco ainda consegue obter um lucro positivo.O que importa não é o número de vitórias, mas a proporção de perdas.。
É preciso reconhecer que não há nada de errado com isso.Esta estratégia não funcionou em mercados de baixa volatilidade.Quando o ADX está abaixo de 20 por um longo período, o mercado não tem uma direção clara e a confiabilidade do sinal de retirada do VWAP diminui drasticamente. A melhor opção é esperar, não forçar a negociação.
O melhor período de desempenho da estratégia é o início da tendência e a fase de correção no meio da tendência.No final de uma forte tendência (ADX>45), o espaço de ganho será rapidamente reduzido, mesmo que o sinal esteja corretoÉ por isso que o ADX tem uma linha dura.
Outra restrição é a exigência de mobilidade. Esta estratégia é mais adequada para as raças principais, pois a exigência de penetração de 2 ticks pode ser muito sensível para os pequenos indicadores de população com pouca mobilidade.
O melhor momento para usarA primeira retracção significativa após a tendência estabelecida, o ADX ficou na faixa de 25-35, acompanhado por volume de transações.
Evitar o uso do tempoO ADX ficou abaixo de 20 em períodos de baixa horizontal, e o ADX ficou acima de 45 no final da tendência.
Os parâmetros podem ser ajustados de acordo com a variedade: variedades com alta taxa de flutuação podem ajustar a penetração mínima para 3-4 ticks, variedades com baixa taxa de flutuação podem manter 2 ticks.Mas a lógica central não muda: confirmação de tendência + retirada da captura + controle rigoroso do vento。
Lembre-se de que nenhuma estratégia é universal. Este sistema funciona muito bem em mercados de tendência, mas sofre pequenos prejuízos em mercados de choppy.A chave é ter paciência para esperar a melhor oportunidade, em vez de insistir em ter transações todos os dias.。
Dica de Risco: A retrospectiva histórica não é indicativa de lucro futuro, há risco de perdas contínuas na estratégia, a gestão de risco precisa ser rigorosamente executada e a diferença de desempenho em diferentes condições de mercado é significativa.
/*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))