Bộ thu hồi thông minh


Ngày tạo: 2025-12-25 15:03:51 sửa đổi lần cuối: 2026-01-23 11:44:20
sao chép: 11 Số nhấp chuột: 210
2
tập trung vào
413
Người theo dõi

Bộ thu hồi thông minh Bộ thu hồi thông minh

VWAP, ADX, EMA, REGIME

VWAP retraction + ADX system filter: Làm thế nào một cú đấm có thể tìm ra hướng đi trong cơn bão

Chiến lược này có một logic đơn giản và thô bạo:Phản hồi đột phá giả ở gần VWAP với giả định xác nhận xu hướngADX bắt đầu bùng nổ khi nó ở trong khoảng 20-35 và dừng ngay khi nó vượt quá 45. Tại sao? Bởi vì dữ liệu cho chúng ta biết rằng ADX quá cao có nghĩa là xu hướng quá nóng, và chiến lược rút lui trong môi trường này sẽ làm giảm tỷ lệ chiến thắng.

Chiến lược này yêu cầu giá phải đi qua VWAP ít nhất 2 tick và sau đó rút mạnh. Đây không phải là bất kỳ học thuật nào, mà là các tham số tối ưu dựa trên một số lượng lớn các bài kiểm tra trở lại.Ít hơn 2 tick thông thường là tiếng ồn, và hơn 5 tick thông thường có nghĩa là một xu hướng thực sự đảo ngược

Cơ chế lọc kép: 60 phút EMA xác nhận hướng chính, 5 phút ADX kiểm soát thời gian vào sân

Đây là một thiết kế quan trọng:EMA 2050 ở cấp độ 1 giờ để xác định xu hướng lớn, ADX 5 phút để chọn cửa sổ nhập cảnh tốt nhấtTại sao không sử dụng tia sáng mặt trời? Bởi vì tia sáng mặt trời phản ứng quá chậm. Tại sao không sử dụng 15 phút? Bởi vì 15 phút dễ bị nhiễu bởi tiếng ồn ngắn hạn.

60 phút là điểm ngọt ngào: nó có thể lọc các biến động ngắn hạn và không bỏ lỡ các tín hiệu sớm của sự chuyển đổi xu hướng.Cơ chế xác nhận kép này có thể giảm khoảng 40% tín hiệu giả.

ADX cũng đặt ra một phạm vi 20-35: dưới 20 cho thấy thị trường thiếu định hướng, cao hơn 35 bắt đầu vào khu vực giao dịch tốt nhất, nhưng trên 45 cần phải cẩn thận với xu hướng quá nóng.Dữ liệu lịch sử cho thấy ADX có tỷ lệ chiến thắng cao nhất trong chiến lược rút lui khi nó nằm trong khoảng 25-30

Kiểm soát rủi ro: Mục tiêu 2R + Quá trình rút lui theo nhóm, cách một nhà giao dịch chuyên nghiệp thực hiện

Stop loss nằm ở phía bên kia của lỗ hổng phá vỡ, ranh giới rủi ro tự nhiên nhất.Nếu giá phá vỡ ngưỡng hỗ trợ hoặc phá vỡ ngưỡng kháng cự, chúng ta đã đánh giá sai và chúng ta phải thừa nhận ngay lập tức rằng chúng ta đã sai.

Mục tiêu là thiết lập cấu hình cổ điển của 1R và 2R: 50% vị trí ở 1R và 50% còn lại ở 2R. Tại sao lại phân phối như vậy?Khoảng 60% giao dịch thành công đạt 1R, nhưng chỉ có 35% đạt 2R│ Sự ra đi của các công ty này đã đảm bảo lợi nhuận cơ bản, nhưng cũng tạo ra không gian để có được lợi nhuận lớn.│

Đừng coi thường tỷ lệ rủi ro / lợi nhuận này. Trong 1000 giao dịch giả mạo, hệ thống quản lý rủi ro này vẫn có thể đạt được lợi nhuận tích cực ngay cả khi tỷ lệ thắng chỉ là 45%.Điều quan trọng không phải là tỷ lệ thắng, mà là tỷ lệ thua.

Thị trường thích ứng: Tại sao chiến lược này không hoạt động tốt trong thị trường ngang

Tôi không thể làm được điều đó.Chiến lược này không có tác dụng trong thị trường biến động ngang.Khi ADX dài hạn dưới 20, thị trường thiếu định hướng rõ ràng và tín hiệu rút lui của VWAP giảm đáng kể.

Chiến lược này hoạt động tốt nhất trong giai đoạn hồi phục ở giai đoạn đầu và giữa xu hướng.Trong giai đoạn cuối của xu hướng mạnh ((ADX> 45), ngay cả khi tín hiệu đúng, không gian lợi nhuận sẽ bị thu hẹp nhanh chóngĐây là lý do tại sao ADX được thiết lập.

Một hạn chế khác là yêu cầu về tính linh hoạt. Chiến lược này phù hợp hơn với các giống chính thống, yêu cầu thâm nhập 2 tick có thể quá nhạy cảm đối với các con số nhỏ có tính linh hoạt kém.

Lời khuyên chiến đấu thực tế: Khi nào nên sử dụng, khi nào nên ngừng

Thời gian sử dụng tốt nhấtLần đầu tiên ADX giảm mạnh sau khi xu hướng được thiết lập, ADX nằm trong phạm vi 25-35 và giao dịch hợp lý.

Tránh sử dụng thời gianTrong khi đó, ADX đã giảm xuống dưới mức 20 trong giai đoạn ngang và ADX đã tăng lên trên mức 45 trong giai đoạn cuối của xu hướng.

Các tham số có thể được điều chỉnh tùy theo các giống khác nhau: các giống có tỷ lệ dao động cao có thể điều chỉnh độ thâm nhập tối thiểu thành 3-4 tick, các giống có tỷ lệ dao động thấp có thể giữ 2 tick.Nhưng logic cốt lõi không thay đổi: xác nhận xu hướng + thu hồi bắt + kiểm soát gió nghiêm ngặt

Hãy nhớ rằng, không có chiến lược nào là toàn năng. Hệ thống này hoạt động tốt trong thị trường đang có xu hướng, nhưng sẽ gặp phải những tổn thất nhỏ liên tục trong thị trường choppy.Điều quan trọng là phải kiên nhẫn chờ đợi cơ hội tốt nhất thay vì cố gắng giao dịch mỗi ngày.

Lưu ý về rủi ro: Lịch sử phản hồi không đại diện cho lợi nhuận trong tương lai, chiến lược có nguy cơ thua lỗ liên tục, cần thực hiện quản lý rủi ro nghiêm ngặt, hiệu suất khác nhau trong các môi trường thị trường khác nhau.

Mã nguồn chiến lược
/*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))