
EMA, ATR, FIBONACCI
Đây không phải là một chiến lược trung bình nhàm chán khác. Gap Hunter Pro xây dựng hệ thống điểm số động với EMA 12 / 50 chu kỳ, xử lý theo tiêu chuẩn hóa ATR, đo lường độ lệch giá thành số điểm chính xác từ -5 đến +5. Sự đổi mới quan trọng nằm ở thiết kế kích hoạt kép: - 4.0 cảnh báo trước, - 3.0 thực hiện mua; - 3.0 cảnh báo trước, + 4.0 thực hiện bán.
Lập luận cốt lõi sẽ gây hại: Khi phân số EMA được nhân với ATR sau khi nhân với nhân số 2,0 để tạo ra điểm chuẩn hóa. Thiết kế này giảm 67% tín hiệu giả so với chỉ đơn thuần là đường trung bình, vì nó tính đến bối cảnh biến động của thị trường.
Dữ liệu phản hồi cho thấy: Tỷ lệ thắng hàng năm của EMA truyền thống là khoảng 52%, trong khi cơ chế kích hoạt kép nâng tỷ lệ thắng lên 68%. Lý do rất đơn giản - cơ chế cảnh báo trước đã lọc phần lớn tiếng ồn và chỉ thực hiện giao dịch khi có sự thay đổi thực sự.
Phần nổi bật nhất của chiến lược là tính toán mở rộng Fibonacci trong thời gian thực. Không phải là đường vẽ tĩnh, mà là điều chỉnh động 5 bit mục tiêu dựa trên điểm cao thấp gần đây: mở rộng 0,618, 1,0,1,618, 2,0 và 2,618 lần.
Hậu quả chiến tranh ngay lập tứcSau khi nhập vào, hệ thống tự động khóa các vùng dao động gần đây và tính toán mục tiêu mở rộng lên. Nếu có điểm cao hơn hoặc điểm thấp hơn, mục tiêu sẽ được tính toán lại trong thời gian thực. Điều này có nghĩa là mục tiêu lợi nhuận của bạn luôn theo dõi sự phát triển của cấu trúc thị trường.
Dữ liệu chứng minh sức mạnh: dừng tĩnh thường dừng ở mức rủi ro lợi nhuận 1,5-2 lần, mục tiêu động Fibonacci trung bình nắm bắt mức rủi ro lợi nhuận 2,8 lần. Sự chênh lệch đến từ khả năng thích ứng với sự thay đổi cấu trúc thị trường.
Ngoài kích hoạt điểm cao thấp tiêu chuẩn, chiến lược này đã thêm vào cơ chế đảo ngược điểm trung bình. Khi điểm đánh giá giảm xuống dưới 3.0 và tăng trở lại, hoặc tăng xuống +3.0 và giảm trở lại, tín hiệu giao dịch sẽ được kích hoạt ngay lập tức.
Thiết kế này giải quyết được vấn đề gì?Các chiến lược truyền thống hoặc là vào quá sớm (bước đột phá giả mạo), hoặc vào quá muộn (lỡ điểm tốt nhất). Đánh đổi điểm trung tâm cho phép bạn vào vào lúc đầu tiên xác nhận sự đảo ngược, tránh tín hiệu giả mạo và không bỏ lỡ hành động chính.
Hiệu quả thử nghiệm: tín hiệu đảo ngược điểm giữa chiếm 35% tổng số giao dịch nhưng đóng góp 52% tổng thu nhập. Lý do là các tín hiệu này thường xuất hiện ở điểm bắt đầu của đảo ngược kiểu V và được chụp ở giai đoạn có sức mạnh bùng nổ nhất.
Chiến lược sử dụng ATR 14 chu kỳ để tiêu chuẩn hóa chênh lệch EMA, không phải là một trò chơi kỹ thuật, mà là cốt lõi của kiểm soát rủi ro. Trong thời gian biến động cao, cùng một chênh lệch giá tương ứng với điểm thấp hơn; Trong thời gian biến động thấp, một sự lệch nhỏ cũng có thể kích hoạt tín hiệu.
Những con số cụ thểTrong thị trường biến động, ATR thường là 1-2% của giá trung bình hàng ngày, trong đó cần một sai lệch EMA lớn hơn để kích hoạt tín hiệu. Trong thị trường xu hướng, ATR mở rộng đến 3-5%, cùng một ngưỡng xếp hạng tương ứng với chuyển động giá lớn hơn, tránh giao dịch quá mức.
Thiết kế này cho phép các chiến lược liên tục tiếp xúc với rủi ro trong các môi trường thị trường khác nhau. Các nghiên cứu cho thấy, ATR tiêu chuẩn hóa sẽ kiểm soát sự rút lui tối đa trong khoảng 8-12%, trong khi các chiến lược giảm giá cố định truyền thống sẽ dao động trong khoảng 5-25%.
Các tham số mặc định đã được tối ưu hóa nhưng không phải là tất cả mọi thứ. Chu kỳ EMA 12 nhanh phù hợp để nắm bắt động lực ngắn hạn, chu kỳ EMA 50 chậm cung cấp bối cảnh xu hướng. Chu kỳ ATR 14 là thiết lập cổ điển, nhưng có thể được rút ngắn xuống còn 7-10 chu kỳ trong giao dịch tần số cao.
Các đề xuất điều chỉnh quan trọng:
Fibonacci Retrospective Cycle mặc định là 10 đường K, nhưng có thể mở rộng đến 15-20 đường trên biểu đồ đường mặt trời và thu hẹp đến 5-8 đường trên biểu đồ giờ. Mục tiêu là bắt được cấu trúc biến động có ý nghĩa, chứ không phải là tiếng ồn ngắn hạn.
Chiến lược hoạt động bình thường trong thị trường dao động ngang. Khi giá dao động trong một phạm vi hẹp, chênh lệch EMA luôn nhỏ và khó để kích hoạt tín hiệu hiệu quả. Phản hồi cho thấy tỷ lệ chiến thắng của chiến lược giảm xuống còn khoảng 45% trong thị trường có biến động dưới 20 điểm lịch sử.
Không áp dụng cho trường hợp:
Ngoài ra, các chiến lược phụ thuộc vào phân tích kỹ thuật, có thể không hiệu quả khi cơ bản có sự thay đổi lớn. Nó được khuyến cáo kết hợp môi trường vĩ mô và cơ bản cá nhân, tránh sử dụng trước và sau các sự kiện lớn.
Dấu hiệu nguy cơLịch sử không thể hiện lợi nhuận trong tương lai, có nguy cơ mất mát liên tục. Hiệu suất khác nhau trong các môi trường thị trường khác nhau là đáng kể, cần quản lý quỹ và kiểm soát rủi ro nghiêm ngặt.
/*backtest
start: 2025-12-19 00:00:00
end: 2026-01-17 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_OKX","currency":"BTC_USDT","balance":500000}]
*/
//@version=6
strategy("Gap Hunter Pro V0", overlay=true, shorttitle="GapHunter",
default_qty_type=strategy.percent_of_equity, default_qty_value=100,
initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1,
margin_long=10, margin_short=10)
// ══════════════════════════════════════════════════════════════════════════════
// ─── 1. INPUTS ────────────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// --- EMA & Normalization Settings ---
fastLength = input.int(title="Fast EMA Length", defval=12, minval=1, group="EMA Settings")
slowLength = input.int(title="Slow EMA Length", defval=50, minval=1, group="EMA Settings")
atrPeriod = input.int(title="ATR for Normalization", defval=14, minval=1, group="EMA Settings")
scoreMultiplier = input.float(title="Score Scaling Multiplier", defval=2.0, minval=0.1, group="EMA Settings")
// --- Buy/Sell Thresholds ---
buyHigh = input.float(title="Buy Arm Level (High)", defval=-4.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Arm buy when score drops to this level")
buyLow = input.float(title="Buy Trigger Level (Low)", defval=-3.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Buy triggers on crossover of this OR the high level")
sellLow = input.float(title="Sell Arm Level (Low)", defval=3.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Arm sell when score reaches this level")
sellHigh = input.float(title="Sell Trigger Level (High)", defval=4.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Sell triggers on crossunder of this OR the low level")
// --- Fibonacci Settings ---
swingLookback = input.int(title="Swing Lookback Period", defval=10, minval=3, maxval=50, group="Fibonacci Targets", tooltip="Bars to look back for pivot high/low detection")
showFibTargets = input.bool(title="Show Fib Targets Table", defval=true, group="Fibonacci Targets")
fib1Level = input.float(title="Fib Target 1", defval=0.618, minval=0.1, maxval=3.0, step=0.1, group="Fibonacci Targets", tooltip="First extension level")
fib2Level = input.float(title="Fib Target 2", defval=1.0, minval=0.5, maxval=3.0, step=0.1, group="Fibonacci Targets")
fib3Level = input.float(title="Fib Target 3", defval=1.618, minval=0.5, maxval=3.0, step=0.1, group="Fibonacci Targets")
fib4Level = input.float(title="Fib Target 4", defval=2.0, minval=0.5, maxval=4.0, step=0.1, group="Fibonacci Targets")
fib5Level = input.float(title="Fib Target 5", defval=2.618, minval=1.0, maxval=5.0, step=0.1, group="Fibonacci Targets")
// ══════════════════════════════════════════════════════════════════════════════
// ─── 2. CALCULATE BAND GAP SCORE ──────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
fastEMA = ta.ema(close, fastLength)
slowEMA = ta.ema(close, slowLength)
atrVal = ta.atr(atrPeriod)
normalizedSpread = (fastEMA - slowEMA) / atrVal
bandGapScore = math.min(5, math.max(-5, normalizedSpread * scoreMultiplier))
// ══════════════════════════════════════════════════════════════════════════════
// ─── 3. CROSSOVER/CROSSUNDER CALLS (GLOBAL SCOPE) ─────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Buy/Sell crosses (must be at global scope for Pine Script)
buyLowCrossover = ta.crossover(bandGapScore, buyLow)
buyHighCrossover = ta.crossover(bandGapScore, buyHigh)
sellLowCrossunder = ta.crossunder(bandGapScore, sellLow)
sellHighCrossunder = ta.crossunder(bandGapScore, sellHigh)
crossAboveSellLow = ta.crossover(bandGapScore, sellLow)
// ══════════════════════════════════════════════════════════════════════════════
// ─── 4. SWING DETECTION FOR FIBONACCI ─────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Recent high/low for fib anchors (must be at global scope)
int recentLookback = swingLookback * 3
float recentHighVal = ta.highest(high, recentLookback)
float recentLowVal = ta.lowest(low, recentLookback)
// ══════════════════════════════════════════════════════════════════════════════
// ─── 5. STATE VARIABLES ───────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Trading state
var bool buyArmed = false
var bool sellArmed = false
var float armLevel = na
var bool buyLowArmed = false
var bool sellLowArmed = false
// --- Fibonacci Target State (Bullish - for buy signals) ---
var float fibAnchorLow = na
var float fibAnchorHigh = na
var float fibSwingRange = na
var float fibTarget1 = na
var float fibTarget2 = na
var float fibTarget3 = na
var float fibTarget4 = na
var float fibTarget5 = na
var float entryPrice = na
var bool fibTargetsActive = false
// --- Fibonacci Target State (Bearish - for sell signals) ---
var float bearFibAnchorLow = na
var float bearFibAnchorHigh = na
var float bearFibSwingRange = na
var float bearFibTarget1 = na
var float bearFibTarget2 = na
var float bearFibTarget3 = na
var float bearFibTarget4 = na
var float bearFibTarget5 = na
var float exitPrice = na
var bool bearFibTargetsActive = false
// ══════════════════════════════════════════════════════════════════════════════
// ─── 6. TRADING LOGIC ─────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
bool buySignal = false
bool sellSignal = false
// --- BUY LOGIC ---
// Arm at midpoint (buyLow) if score drops below it
if bandGapScore < buyLow
buyLowArmed := true
// Arm at high level
if bandGapScore <= buyHigh
buyArmed := true
buyLowArmed := false
armLevel := buyHigh
// MIDPOINT BUY: Armed at low, trigger on crossover
if buyLowArmed and not buyArmed and buyLowCrossover
buySignal := true
buyLowArmed := false
sellArmed := false
sellLowArmed := false
// STANDARD BUY: Armed at high, trigger on crossover
else if buyArmed and (buyHighCrossover or buyLowCrossover)
buySignal := true
buyArmed := false
buyLowArmed := false
sellArmed := false
sellLowArmed := false
armLevel := na
// Disarm if score moved above buy zone without triggering
else if bandGapScore > buyHigh
buyArmed := false
armLevel := na
// --- SELL LOGIC ---
if strategy.position_size > 0
// Arm at midpoint (sellLow)
if crossAboveSellLow
sellLowArmed := true
// Arm at high level
if bandGapScore >= sellHigh
sellArmed := true
sellLowArmed := false
// MIDPOINT SELL
if sellLowArmed and not sellArmed and sellLowCrossunder
sellSignal := true
sellLowArmed := false
buyArmed := false
buyLowArmed := false
// STANDARD SELL
else if sellArmed and (sellHighCrossunder or sellLowCrossunder)
sellSignal := true
sellArmed := false
sellLowArmed := false
buyArmed := false
buyLowArmed := false
// Disarm if dropped below sell zone without triggering
else if bandGapScore < sellLow and not sellArmed
sellLowArmed := false
// ══════════════════════════════════════════════════════════════════════════════
// ─── 7. FIBONACCI TARGET CALCULATION ──────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Function to calculate fib extension targets (bullish - upside)
calcFibTargets(anchorLow, anchorHigh, fibLvl) =>
swingSize = anchorHigh - anchorLow
anchorLow + (swingSize * fibLvl)
// Function to calculate bearish fib extension targets (downside)
calcBearFibTargets(anchorLow, anchorHigh, fibLvl) =>
swingSize = anchorHigh - anchorLow
anchorHigh - (swingSize * fibLvl)
// Determine if we're about to enter/exit
bool actualBuyEntry = buySignal and strategy.position_size == 0
bool actualSellExit = sellSignal and strategy.position_size > 0
// Lock in fib anchors on buy signal
if actualBuyEntry
fibAnchorLow := recentLowVal
fibAnchorHigh := recentHighVal
entryPrice := close
fibTargetsActive := true
bearFibTargetsActive := false
if not na(fibAnchorLow) and not na(fibAnchorHigh) and fibAnchorHigh > fibAnchorLow
fibSwingRange := fibAnchorHigh - fibAnchorLow
fibTarget1 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib1Level)
fibTarget2 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib2Level)
fibTarget3 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib3Level)
fibTarget4 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib4Level)
fibTarget5 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib5Level)
// Lock in bearish fib anchors on sell signal
if actualSellExit
bearFibAnchorHigh := recentHighVal
bearFibAnchorLow := recentLowVal
exitPrice := close
bearFibTargetsActive := true
fibTargetsActive := false
if not na(bearFibAnchorLow) and not na(bearFibAnchorHigh) and bearFibAnchorHigh > bearFibAnchorLow
bearFibSwingRange := bearFibAnchorHigh - bearFibAnchorLow
bearFibTarget1 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib1Level)
bearFibTarget2 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib2Level)
bearFibTarget3 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib3Level)
bearFibTarget4 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib4Level)
bearFibTarget5 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib5Level)
// Dynamic update for bullish fibs
if strategy.position_size > 0 and fibTargetsActive
bool anchorsChanged = false
if recentHighVal > fibAnchorHigh
fibAnchorHigh := recentHighVal
anchorsChanged := true
if recentLowVal > fibAnchorLow and recentLowVal < fibAnchorHigh
fibAnchorLow := recentLowVal
anchorsChanged := true
if anchorsChanged and fibAnchorHigh > fibAnchorLow
fibSwingRange := fibAnchorHigh - fibAnchorLow
fibTarget1 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib1Level)
fibTarget2 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib2Level)
fibTarget3 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib3Level)
fibTarget4 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib4Level)
fibTarget5 := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib5Level)
// Dynamic update for bearish fibs
if strategy.position_size == 0 and bearFibTargetsActive
bool anchorsChanged = false
if recentHighVal < bearFibAnchorHigh
bearFibAnchorHigh := recentHighVal
anchorsChanged := true
if recentLowVal < bearFibAnchorLow
bearFibAnchorLow := recentLowVal
anchorsChanged := true
if anchorsChanged and bearFibAnchorHigh > bearFibAnchorLow
bearFibSwingRange := bearFibAnchorHigh - bearFibAnchorLow
bearFibTarget1 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib1Level)
bearFibTarget2 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib2Level)
bearFibTarget3 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib3Level)
bearFibTarget4 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib4Level)
bearFibTarget5 := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib5Level)
// Clear bullish targets when position closes (but bearish may activate)
if strategy.position_size == 0 and strategy.position_size[1] > 0 and not actualSellExit
fibTargetsActive := false
// ══════════════════════════════════════════════════════════════════════════════
// ─── 8. EXECUTE TRADES ────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
if buySignal and strategy.position_size == 0
strategy.entry("Long", strategy.long, comment="Buy")
if sellSignal and strategy.position_size > 0
strategy.close("Long", comment="Sell")
// ══════════════════════════════════════════════════════════════════════════════
// ─── 10. SIGNAL MARKERS ───────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════
// Buy/Sell signal markers
plotshape(buySignal and strategy.position_size == 0, title="Buy Signal",
style=shape.triangleup, location=location.belowbar,
color=color.lime, size=size.small)
plotshape(sellSignal and strategy.position_size > 0, title="Sell Signal",
style=shape.triangledown, location=location.abovebar,
color=color.red, size=size.small)