
VWAP, ADX, EMA, REGIME
この戦略の核心的な論理は単純で粗野です:VWAP周辺の偽突破撤退を狙う,トレンドが確認された前提でADXは20-35の範囲で火をつけ,45を超えると直接停止します.なぜですか?データによると,ADXが高くすぎると,トレンドが過熱し,この環境で引き戻し戦略の勝利率は急激に低下します.
策略は,価格がVWAPを少なくとも2タック通過し,その後強引に引き下げることを要求する.これは学術的なことではなく,大量に反省された最適なパラメータに基づいている.2つ未満のティックはノイズで,5つ以上のティックは実際のトレンドの逆転です.。
デザインの鍵はこれです1時間の20/50 EMAは大きなトレンドを判断し,5分間のADXは最適なエントリーウィンドウを選択します.◎ なぜ日光線を使わないのか? 日光線反応が遅いからです ◎ なぜ15分を使わないのか? ◎ 15分は短時間の騒音に 容易に邪魔されるからです
60分はスイーツポイントです. 短期的な波動をフィルタリングしながらも,トレンド転換の早期の信号を逃さないことです. 速線が遅線を横断し,両線が上向きに傾いているとき,多頭線が確認されます.この二重確認は偽信号の40%を削減します.。
ADXの20〜35の区間設定も参考になる:20未満は市場の方向性の欠如を示し,35以上は最高の取引区間に入りますが,45以上は過熱傾向に注意してください.歴史的なデータによると,ADXは25-30の範囲で,撤回戦略の成功率が最高です.。
ストップダストは,ブレイクチャームの反対側にあり,これは最も自然なリスクの境界線である.価格がサポートを下げたり,レジスタンスを突破したりできなければ,判断が間違っていて,すぐに間違いを認める必要があります.。
1Rと2Rのクラシック配置を採用する目標を設定します:50%のポジションは1Rでオフ,残りの50%は2Rに保持されます.なぜこのような分配なのでしょうか?取引の成功率の60%は1Rに達しますが,2Rに達するのは35%だけです│ │ │ │ │ │ │ │ │ │
リスク・リターン・比率の設計を軽視しないでください. 1,000回の模擬取引で,勝率は45%であっても,このリスク管理システムは正の収益を達成できます.勝率ではなく,損益比が重要だ.。
イスラム教は,この戦略は横軸の揺れ市場ではうまくいきませんでした.ADXが長期にわたって20を下回ったとき,市場には明確な方向性がなく,VWAPの撤回信号の信頼性が大きく低下する.このとき,強引な取引ではなく,見守るのが最良の選択である.
戦略のベストパフォーマンスは,トレンドの初期とトレンドの中間の回収段階である.強いトレンドの末期 ((ADX>45),信号が正しかったとしても,利益の余地が急速に縮小される│ │ │ │ │ │ │ │
もう一つの制限は流動性の要求である.この戦略は,流動性が低い小众標識の2つのティックの貫通要求が過度に敏感である可能性があるため,メインストリーム品種に適している.
適切なタイミング: トレンドが確立された後,ADXは25-35の範囲で,取引量配合で最初の重要な回転.
時間の使い方を避ける重要なニュース発表前後,ADXは20を下回る横断期,そしてADXは45を超え,トレンドの終わり期.
パラメータは,異なる品種に応じて微調整することができます:波動率が高い品種は,最小の穿透率を3-4タックに調整することができます.波動率低い品種は,2タックを維持することができます.しかし,その核心的な論理は変わらず,トレンド確認+リコールキャプチャ+厳格な風力管理.。
このシステムは,トレンド市場では優れているが,チョッピー市場では連続して小損失を被る.重要なのは,毎日取引を強要するのではなく,最高の機会を待つことです.。
リスクヒント: 過去の反転は将来の利益を意味しません. 戦略には連続した損失のリスクがあり,リスク管理を厳格に実施する必要があります. 異なる市場環境でパフォーマンスの違いは顕著です.
/*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))