
EMA, ATR, FIBONACCI
Ini bukan satu lagi strategi rata-rata yang membosankan. Gap Hunter Pro membina sistem penilaian dinamik dengan 12 / 50 EMA kitaran, yang dikendalikan oleh standard ATR, yang mengukur perbezaan harga menjadi skor tepat dari -5 hingga +5. Inovasi utama adalah reka bentuk pemicu ganda: -4.0 amaran awal, -3.0 pelaksanaan pembelian; -3.0 amaran awal, +4.0 pelaksanaan jualan.
Kesan Logik Utama: Apabila EMA perlahan dikalikan dengan ATR kemudian dikalikan dengan kelipatan 2.0, skor standardisasi dibentuk. Reka bentuk ini mengurangkan isyarat palsu sebanyak 67% daripada simpangan purata, kerana ia mengambil kira latar belakang turun naik pasaran.
Data pengesanan menunjukkan bahawa EMA tradisional mempunyai kadar kemenangan kira-kira 52% berbanding dengan 68% dengan pemicu berganda. Sebabnya adalah mudah - mekanisme amaran awal menapis sebahagian besar bunyi bising dan hanya menjalankan perdagangan pada titik perubahan trend yang sebenar.
Bahagian yang paling menonjol dalam strategi ini adalah pengiraan skala Fibonacci dalam masa nyata. Bukan garis garisan statik, tetapi lima bit sasaran yang disesuaikan secara dinamik pada titik tinggi dan rendah terkini: 0.618, 1.0, 1.618 dan 2.0 dan 2.618 kali ganda.
Kesan langsungSetelah masuk, sistem secara automatik mengunci jangkauan turun naik terkini dan mengira sasaran untuk meluas ke atas. Jika terdapat titik tertinggi yang lebih tinggi atau titik rendah yang lebih tinggi, sasaran dikira semula dalam masa nyata. Ini bermakna sasaran keuntungan anda sentiasa mengikuti evolusi struktur pasaran.
Kekuatan bukti data: Hentian statik biasanya berhenti pada 1.5 hingga 2 kali balas risiko, sasaran Fibonacci dinamik menangkap purata 2.8 kali balas risiko. Perbezaan ini disebabkan oleh adaptasi kepada perubahan struktur pasaran.
Selain daripada mencetuskan titik tinggi dan rendah yang standard, strategi ini menyertakan mekanisme pembalikan titik tengah. Apabila skor jatuh ke bawah 3.0 dan naik semula, atau naik ke atas +3.0 dan turun semula, segera mencetuskan isyarat perdagangan.
Apa yang diselesaikan oleh reka bentuk ini?Strategi tradisional adalah masuk terlalu awal (pembobolan palsu) atau masuk terlalu lewat (kehilangan titik terbaik). Pembalasan titik tengah membolehkan anda masuk pada saat pertama pengesahan, mengelakkan isyarat palsu, tetapi tidak akan terlepas tindakan utama.
Kesan percubaan: isyarat pembalikan titik tengah menyumbang 35% daripada jumlah dagangan, tetapi menyumbang 52% daripada jumlah pendapatan. Sebabnya adalah isyarat seperti ini biasanya muncul di titik permulaan pembalikan jenis V, dan ditangkap pada tahap pergerakan yang paling meletup.
Strategi menggunakan ATR 14 kitaran untuk menstandardkan perbezaan EMA, bukan permainan teknik, tetapi adalah teras kawalan risiko. Pada masa turun naik yang tinggi, perbezaan harga yang sama sesuai dengan penilaian yang lebih rendah; pada masa turun naik yang rendah, sedikit penyimpangan juga dapat mencetuskan isyarat.
Angka-angka bercakapATR biasanya 1-2% daripada harga purata harian dalam pasaran goyah, yang memerlukan penyimpangan EMA yang lebih besar untuk mencetuskan isyarat. Dalam pasaran yang sedang tren, ATR meluas kepada 3-5%, dengan nilai terhad penilaian yang sama untuk pergerakan harga yang lebih besar, untuk mengelakkan perdagangan berlebihan.
Reka bentuk ini membolehkan strategi untuk tetap konsisten dalam keadaan pasaran yang berbeza dan mendedahkan risiko. Retrospektif menunjukkan bahawa standard ATR akan mengawal pengunduran maksimum dalam julat 8-12%, sedangkan strategi pengunduran nilai tetap tradisional berfluktuasi antara 5-25%.
Parameter lalai telah dioptimumkan tetapi tidak serba boleh. Kitaran EMA 12 pantas sesuai untuk menangkap momentum jangka pendek, dan kitaran EMA 50 perlahan memberikan latar belakang trend. Kitaran ATR 14 adalah tetapan klasik, tetapi boleh disingkat menjadi 7-10 kitaran dalam perdagangan frekuensi tinggi.
Cadangan penyesuaian utama:
Fibonacci retrospektif secara lalai 10 garis K, tetapi dapat diperluaskan kepada 15-20 garis pada carta garis harian, dan berkurangan kepada 5-8 garis pada carta jam. Tujuannya adalah untuk menangkap struktur pergerakan yang bermakna, bukan bunyi jangka pendek.
Strategi ini berprestasi rata di pasaran yang bergolak. Apabila harga bergolak dalam julat yang sempit, perbezaan EMA sentiasa lebih kecil dan sukar untuk mencetuskan isyarat yang berkesan. Retrospeksi menunjukkan bahawa dalam pasaran dengan kadar turun naik di bawah 20 digit sejarah, kemenangan strategi menurun kepada kira-kira 45%.
Skenario yang tidak sesuai:
Di samping itu, strategi bergantung kepada analisis teknikal, yang mungkin tidak berfungsi apabila asasnya berubah secara besar-besaran. Ia disyorkan untuk menggabungkan persekitaran makro dan asas saham individu, dan mengelakkan penggunaan sebelum dan selepas peristiwa besar.
Petunjuk RisikoPembaharuan sejarah tidak mewakili keuntungan masa depan, strategi mempunyai risiko kerugian berturut-turut. Pertunjukan berbeza dengan keadaan pasaran yang berbeza dan memerlukan pengurusan dana dan kawalan risiko yang ketat.
/*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)