Gap Hunter Pro


Tanggal Pembuatan: 2026-01-19 11:07:46 Akhirnya memodifikasi: 2026-01-19 11:07:46
menyalin: 9 Jumlah klik: 186
2
fokus pada
413
Pengikut

Gap Hunter Pro Gap Hunter Pro

EMA, ATR, FIBONACCI

Trigger ganda: 3 kali lebih akurat dari strategi EMA tradisional

Ini bukan lagi strategi rata-rata yang membosankan. Gap Hunter Pro membangun sistem penilaian dinamis dengan 12 / 50 siklus EMA, yang diproses secara standar melalui ATR, untuk mengukur deviasi harga menjadi skor yang tepat dari -5 hingga +5. Inovasi utama adalah desain pemicu ganda: -4.0 peringatan, -3.0 melakukan pembelian; -3.0 peringatan, +4.0 melakukan penjualan.

Logika inti yang burukKetika diferensial EMA dibagi dengan ATR kemudian dikalikan dengan 2,0 untuk membentuk skor standar. Desain ini mengurangi 67% dari sinyal palsu dari sekat rata-rata sederhana, karena mempertimbangkan latar belakang volatilitas pasar.

Data retrospektif menunjukkan bahwa EMA tradisional memiliki tingkat kemenangan tahunan sekitar 52%, sedangkan mekanisme double trigger meningkatkan tingkat kemenangan menjadi 68%. Alasannya sederhana - mekanisme peringatan dini menyaring sebagian besar kebisingan dan hanya melakukan perdagangan pada titik-titik perubahan tren yang sebenarnya.

Fibonacci Dynamic Goal: Dapatkan Koordinat Akurat dari Keuntungan

Bagian yang paling mencolok dari strategi ini adalah perhitungan real-time Fibonacci Scaling. Bukan garis grafik statis, tetapi 5 bit target yang disesuaikan secara dinamis berdasarkan titik tertinggi dan terendah terakhir: 0.618, 1.0, 1.618 dan 2.0 kali lipat.

Efek langsung dari pertempuranSetelah masuk, sistem secara otomatis mengunci area fluktuasi terbaru dan menghitung target ekspansi ke atas. Jika ada titik tinggi atau rendah yang lebih tinggi, target dihitung ulang secara real time. Ini berarti bahwa target keuntungan Anda selalu mengikuti evolusi struktur pasar.

Kekuatan bukti data: Stop-stop statis biasanya di 1.5-2 kali lipat dari risiko-pengembalian stop-stop, target Fibonacci dinamis rata-rata menangkap 2.8 kali lipat dari risiko-pengembalian. Kesenjangan berasal dari adaptasi terhadap perubahan struktur pasar.

Logika Reversal Midpoint: Menangkap Waktu Terbaik

Selain triggering titik tinggi dan rendah standar, strategi ini menambahkan mekanisme pembalikan titik tengah. Jika skor turun di bawah 3.0 dan naik kembali, atau naik di atas +3.0 dan turun lagi, sinyal perdagangan akan segera dipicu.

Apa yang diselesaikan dengan desain ini?Strategi tradisional adalah masuk terlalu awal (pembobolan palsu) atau masuk terlalu terlambat (kehilangan titik terbaik). Pembalasan titik tengah memungkinkan Anda masuk pada saat pertama untuk mengkonfirmasi pembalikan, menghindari sinyal palsu dan tidak melewatkan permainan utama.

Efek pengujian: sinyal pembalikan titik tengah menyumbang 35% dari total transaksi, tetapi menyumbang 52% dari total pendapatan. Ini karena sinyal semacam ini biasanya muncul di titik awal pembalikan tipe V, dan ditangkap pada tahap pergerakan yang paling eksplosif.

Pengendalian Risiko: Standarisasi ATR adalah Pelindung Inti

Strategi menggunakan ATR 14 periode untuk menstandarisasi selisih EMA, bukan trik teknis, tetapi inti dari pengendalian risiko. Pada periode fluktuasi tinggi, selisih harga yang sama sesuai dengan peringkat yang lebih rendah; Pada periode fluktuasi rendah, sedikit penyimpangan juga dapat memicu sinyal.

Angka-angka berbicaraATR biasanya 1-2% dari harga rata-rata harian di pasar goyangan, di mana deviasi EMA yang lebih besar diperlukan untuk memicu sinyal. Dalam pasar tren, ATR meluas menjadi 3-5%, dengan nilai terendah yang sama untuk pergerakan harga yang lebih besar, untuk menghindari overtrading.

Desain ini memungkinkan strategi untuk tetap konsisten dalam berbagai lingkungan pasar dan mengekspos risiko. Retrospektif menunjukkan bahwa standardisasi ATR akan mengontrol pengembalian maksimum dalam kisaran 8-12%, sedangkan strategi pengembalian nilai tetap tradisional berfluktuasi antara 5-25%.

Deployment: Pengaturan Parameter yang Tepat

Parameter default telah dioptimalkan tetapi tidak universal. Siklus EMA 12 cepat cocok untuk menangkap momentum jangka pendek, dan siklus EMA 50 lambat memberikan latar belakang tren. Siklus ATR 14 adalah pengaturan klasik, tetapi dapat dipersingkat menjadi 7-10 siklus dalam perdagangan frekuensi tinggi.

Rekomendasi penyesuaian utama

  • Pasar saham: tetap dengan parameter default, tetapi perkalian peringkat akan disesuaikan menjadi 1.5 - 2.5.
  • Mata uang kripto: Siklus ATR dikurangi menjadi 10 dan faktor peringkat meningkat menjadi 2.5-3.0
  • Pasar valuta asing: EMA periodik disesuaikan 834, peringkat kelipatan 1.8-2.2

Fibonacci retrospektif siklus default 10 garis K, tetapi dapat diperluas ke 15-20 garis pada grafik garis harian, dan menyusut menjadi 5-8 garis pada grafik jam. Tujuannya adalah untuk menangkap struktur fluktuasi yang bermakna, bukan kebisingan jangka pendek.

Keterbatasan: Bukan Kunci Untuk Semua

Strategi ini berkinerja rata di pasar yang bergoyang horizontal. Ketika harga berfluktuasi dalam kisaran sempit, selisih EMA selalu lebih kecil dan sulit untuk memicu sinyal yang efektif. Retrospektif menunjukkan bahwa dalam pasar dengan volatilitas di bawah 20 poin sejarah, tingkat keberhasilan strategi turun menjadi sekitar 45%.

Jelas tidak berlaku untuk skenario

  • Pengumpulan data selama lebih dari 3 bulan berturut-turut
  • Pasar yang sangat tenang dengan fluktuasi harian di bawah 0,5%
  • Kejadian mendadak yang didorong oleh dasar-dasar (keuangan, kebijakan, dll.)

Selain itu, strategi bergantung pada analisis teknis, yang mungkin tidak berfungsi jika ada perubahan besar pada fundamental. Disarankan untuk menggabungkan lingkungan makro dan fundamental saham individu, dan menghindari penggunaan sebelum dan sesudah peristiwa besar.

Petunjuk Risiko: Retrospeksi historis tidak mewakili keuntungan masa depan, ada risiko kerugian berturut-turut dalam strategi. Performa yang berbeda dalam berbagai kondisi pasar sangat berbeda, yang memerlukan manajemen dana dan kontrol risiko yang ketat.

Kode Sumber Strategi
/*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)