
VWAP, ADX, EMA, REGIME
Не надо слепо преследовать и убивать.Фальшивые прорывы вблизи VWAP, специально предназначенные для снайперов, отступают при условии подтверждения тенденции│ │ADX начинает стрелять в диапазоне 20-35 и прекращает работу сразу после 45 │ Почему? Потому что данные говорят нам, что слишком высокий ADX означает перегрев тенденции, а стратегия отступления в этой среде резко снижает шансы на победу │
Стратегия требует, чтобы цена прошла через VWAP не менее чем на 2 тика, а затем сильно отступила. Это не какая-то фантастика, а оптимальный параметр, основанный на большом количестве обратных тестов.Проникновение менее 2 тиков обычно является шумом, а проникновение более 5 тиков обычно означает подлинное изменение тренда。
Вот ключевой дизайн:20⁄50 EMA на 1-часовом уровне отвечает за определение основных тенденций, 5 минут ADX отвечает за выбор оптимального входного окнаПочему не использовать солнечный свет? Потому что солнечный свет слишком медленно реагирует. Почему не использовать 15 минут? Потому что 15 минут легко отвлекаются от кратковременного шума.
60 минут - это сладкая точка: можно отфильтровывать краткосрочные колебания, но не пропустить ранние сигналы о переходе тренда. Когда быстрая линия пересекает медленную линию, и обе линии наклоняются вверх, многородная тенденция подтверждается.Этот механизм двойного подтверждения позволяет сократить количество ложных сигналов на 40%.。
В ADX диапазон 20-35 также имеет значение: ниже 20 указывает на отсутствие направления рынка, выше 35 начинает входить в зону наилучшей торговли, но выше 45 следует быть осторожным с перегревом.Исторические данные показывают, что ADX имеет наибольшую вероятность успеха в стратегии отмены в диапазоне 25-30。
Стоп-лома находится на другом конце прорыва, это самая естественная граница риска.Если цена не преодолеет поддержку или не преодолеет сопротивление, это означает, что мы ошиблись и должны немедленно признать свою ошибку。
Цель состоит в том, чтобы установить классическую конфигурацию 1R и 2R: 50% позиций уходят в 1R, а остальные 50% удерживаются в 2R. Почему такое распределение?Около 60% успешных сделок достигают 1R, но только 35% достигают 2R│ │ │ │ │ │ │ │ │ │ │ │
Нельзя недооценивать риско-возвращаемость проекта. Даже если выигрыш составит 45% от 1000 трейдеров, система управления рисками все равно даст положительную прибыль.Не победа, а проигрыш。
Я не могу сказать, что это не так.Эта стратегия не помогла в условиях рыночных колебаний.Когда ADX длительное время находится ниже 20, рынок не имеет четкого направления, и надежность отзыва VWAP значительно снижается. Лучший вариант в этом случае - наблюдать, а не принудительно торговать.
Наилучшим периодом эффективности стратегии является период отклонения в начале и середине тренда.В конце сильного тренда ((ADX>45), даже если сигнал будет правильным, пространство для прибыли будет быстро сокращаться│ │ │ │ │ │ │ │ │
Другим ограничением является требование к мобильности. Эта стратегия больше подходит для основных сортов, а для небольших групп людей с плохой мобильностью требование к проникновению двух тиков может быть слишком чувствительным.
Лучшее время использованияПервое существенное понижение после установления тренда: ADX находится в диапазоне 25-35, а объемы торгов совпадают.
Избегайте использования времениВ конце концов, мы не смогли найти ни одного человека, который был бы в состоянии выполнить это задание.
Параметры могут быть изменены в зависимости от разных сортов: высокоподвижные сорта могут быть настроены на минимальное проникновение до 3-4 тиков, а низкоподвижные сорта сохраняют 2 тика.Но ключевая логика остается неизменной: подтверждение тренда + отзыв лова + строгий контроль ветра。
Имейте в виду, что никакая стратегия не может быть универсальной. Эта система отлично работает на трендовых рынках, но вызывает постоянные небольшие потери на choppy рынках.Ключ в том, чтобы терпеливо ждать наилучшей возможности, а не настаивать на ежедневных сделках.。
Примечание о риске: исторический отсчет не является индикатором будущей прибыли, существует риск непрерывных убытков в стратегии, требуется строгое управление рисками, существенная разница в производительности в разных рыночных условиях.
/*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))