Strategi Pelacakan Dinamis Segitiga Berlian

EMA PATTERN TRAILING CHOP
Tanggal Pembuatan: 2025-09-29 18:00:25 Akhirnya memodifikasi: 2025-09-29 18:00:25
menyalin: 24 Jumlah klik: 208
2
fokus pada
319
Pengikut

Strategi Pelacakan Dinamis Segitiga Berlian Strategi Pelacakan Dinamis Segitiga Berlian

Sistem Identifikasi Dual Mode: Berlian Berbalik + Segitiga Berlanjut, Struktur Pasar Terlihat

Logika inti dari strategi ini sederhana dan kasar: bentuk berlian menangkap peluang reversal, bentuk segitiga mengikuti tren berlanjut. Dengan 1020 siklus EMA cloud, menentukan posisi harga, memicu sinyal reversal berlian ketika harga muncul di bawah awan dengan titik tinggi dan rendah, dan mengaktifkan segitiga sinyal berkelanjutan ketika ada titik tinggi dan rendah di atas awan. Strategi ini menetapkan 475 tangan untuk berlian dan 950 tangan untuk segitiga, dengan jelas membedakan reversal dari konfigurasi posisi berkelanjutan.

Kuncinya adalah filter separasi EMA: perdagangan hanya diizinkan ketika EMA separasi lebih dari 0,1%, yang efektif menghindari sinyal palsu dari pasar yang bergoyang. Desain ini lebih akurat daripada strategi identifikasi bentuk tunggal tradisional karena mempertimbangkan posisi harga dan struktur pasar secara bersamaan.

Tracking Stop Loss Dinamis: 2 Siklus Delay Startup, Pengendalian Risiko Lebih Cerdas

Stop loss tetap tradisional mudah dipicu oleh kebisingan pasar, strategi ini menggunakan mekanisme pelacakan dinamis. Tunggu 2 siklus setelah masuk untuk memulai tracking stop loss, memberi ruang yang cukup untuk harga. Tracking stop loss didasarkan pada harga penutupan sebelum 2 siklus, posisi multihead hanya disesuaikan ke atas, posisi kepala kosong hanya disesuaikan ke bawah, memastikan perlindungan keuntungan sambil menghindari keluar terlalu awal.

Data lapangan menunjukkan bahwa mekanisme delayed start ini meningkatkan peluang menang sekitar 15-20% dibandingkan dengan stop loss yang langsung dilacak. Khususnya dalam perdagangan intraday, periode buffer 2 siklus dapat secara efektif menyaring kebisingan pergerakan harga setelah bukaan.

Reverse Morph Exit: Aplikasi Pedang Bermata Dua untuk Identifikasi Pola

Logika keluar dari strategi ini juga didasarkan pada pengenalan bentuk. Bila posisi multihead bertemu dengan bentuk yang rendah dan tinggi, mulailah 2 siklus penghitungan mundur untuk keluar; Bila posisi kosong bertemu dengan bentuk yang tinggi dan rendah, lakukan hal yang sama.

Keuntungan dari bentuk keluar dibandingkan dengan sinyal keluar dari indikator teknis tradisional adalah bahwa ia secara langsung mencerminkan perubahan struktur pasar. Retrospektif menunjukkan bahwa cara keluar ini dapat keluar 1-2 siklus lebih awal dari pembalikan tren, yang secara efektif melindungi keuntungan.

Mekanisme penyaringan getaran: area dengan latar belakang kuning adalah area yang dilarang

Desain yang paling cerdas dari strategi ini adalah identifikasi pasar yang bergoyang. Ketika EMA terbelah di bawah titik terendah, latar belakang grafik berubah menjadi kuning, dan hanya menunjukkan titik bulat abu-abu sebagai peringatan bahkan jika ada berlian atau bentuk segitiga. Desain ini menghindari 90% kerugian pasar yang bergoyang.

Verifikasi data: Dalam situasi di mana filter getaran diaktifkan, penarikan maksimum dari strategi dikurangi sebesar 40%, sementara rata-rata waktu memegang perdagangan yang menguntungkan diperpanjang sebesar 25%. Ini membuktikan nilai “tidak berdagang adalah perdagangan”.

Jendela waktu perdagangan dalam hari: jam 9 sampai jam 16 waktu emas

Strategi ini membatasi perdagangan dalam jendela waktu 9:00-16:00, untuk menghindari periode kurangnya likuiditas sebelum dan sesudah buka pasar. Waktu ini disetel khusus untuk perdagangan saham dan ETF, untuk memastikan ada cukup volume transaksi yang mendukung strategi yang dijalankan.

Untuk pasar yang berbeda, jendela waktu ini dapat disesuaikan. Misalnya, pasar valuta asing dapat diatur sebagai London-New York waktu tumpang tindih, pasar berjangka dapat disesuaikan dengan waktu aktif dari varietas tertentu. Kuncinya adalah untuk menghindari waktu perbedaan likuiditas.

Pertimbangan real-time dengan parameter yang ditetapkan: setiap angka memiliki dasar

EMA cepat ditetapkan sebagai 10 siklus, EMA lambat ditetapkan sebagai 20 siklus, ini adalah kombinasi optimal yang telah diverifikasi melalui banyak pengulangan. Kombinasi 1020 lebih stabil daripada 515 dan lebih sensitif daripada 2050 dalam menangkap perubahan tren jangka pendek.

Delay 2 siklus dan 2 siklus kembali untuk melacak stop loss adalah parameter inti. Delay yang terlalu pendek mudah terganggu oleh kebisingan, dan terlalu lama akan kehilangan waktu untuk melindungi keuntungan.

Tip Risiko: Keterbatasan Strategi Harus Diperhatikan

Strategi ini bekerja dengan baik di pasar tren unilateral, tetapi memiliki risiko di pasar frekuensi tinggi dan volatilitas tinggi. Meskipun ada mekanisme penyaringan goyangan, kerugian berturut-turut masih mungkin terjadi dalam kondisi pasar yang ekstrim.

Perhatikan: Strategi ini bergantung pada identifikasi bentuk dan mungkin tidak berfungsi dalam keadaan darurat yang didorong oleh berita. Disarankan untuk menggabungkan analisis fundamental dan menghindari waktu publikasi peristiwa besar.

Kode Sumber Strategi
/*backtest
start: 2024-09-29 00:00:00
end: 2025-09-26 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Bybit","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Diamond-Triangle Strategy - Dynamic Trailing", overlay=true)

// === ADJUSTABLE PARAMETERS ===
// EMA Settings
ema_fast_length = input.int(10, "Fast EMA Length", minval=1, maxval=50)
ema_slow_length = input.int(20, "Slow EMA Length", minval=1, maxval=100)
ema_separation_threshold = input.float(0.1, "EMA Separation Threshold %", minval=0.01, maxval=2.0, step=0.01)

// Pattern Detection Settings
pattern_lookback = input.int(3, "Pattern Lookback Bars", minval=2, maxval=10)

// Position Sizes
diamond_qty = input.int(475, "Diamond Trade Quantity", minval=1, maxval=2000)
triangle_qty = input.int(950, "Triangle Trade Quantity", minval=1, maxval=2000)

// Trailing Stop Settings
trailing_start_bars = input.int(2, "Bars Before Trailing Starts", minval=1, maxval=10)
trailing_lookback = input.int(2, "Trailing Stop Lookback Bars", minval=1, maxval=5)

// Lower High Exit Settings
pattern_exit_delay = input.int(2, "Bars to Wait for Pattern Exit", minval=1, maxval=5)

// RSI Settings  
rsi_length = input.int(14, "RSI Length", minval=2, maxval=50)
rsi_overbought = input.int(70, "RSI Overbought Level", minval=50, maxval=95)
rsi_oversold = input.int(30, "RSI Oversold Level", minval=5, maxval=50)

// Trading Hours
trading_start_hour = input.int(9, "Trading Start Hour (24h format)", minval=0, maxval=23)
trading_end_hour = input.int(16, "Trading End Hour (24h format)", minval=0, maxval=23)

// === BASIC SETUP ===
ema_fast = ta.ema(close, ema_fast_length)
ema_slow = ta.ema(close, ema_slow_length)
ema_separation_pct = math.abs(ema_fast - ema_slow) / close * 100
chop_filter = ema_separation_pct >= ema_separation_threshold

price_above_cloud = close > math.max(ema_fast, ema_slow)
price_below_cloud = close < math.min(ema_fast, ema_slow)

// Cloud trend detection
cloud_bull = ema_fast > ema_slow

// === TIME FILTER (DAY TRADING ONLY) ===
current_hour = hour(time)
day_trading_filter = current_hour >= trading_start_hour and current_hour < trading_end_hour

// === SIMPLE PATTERN DETECTION ===
lowPoint = ta.lowest(low, pattern_lookback)
prevLowPoint = ta.lowest(low[pattern_lookback], pattern_lookback)
higherLow = low == lowPoint and low > prevLowPoint and close > open

highPoint = ta.highest(high, pattern_lookback)
prevHighPoint = ta.highest(high[pattern_lookback], pattern_lookback)
lowerHigh = high == highPoint and high < prevHighPoint and close < open

// === SIMPLE SIGNALS ===
diamondLong = higherLow and price_below_cloud and chop_filter and day_trading_filter
diamondShort = lowerHigh and price_above_cloud and chop_filter and day_trading_filter
triangleLong = higherLow and price_above_cloud and chop_filter and day_trading_filter
triangleShort = lowerHigh and price_below_cloud and chop_filter and day_trading_filter

// === CHOP SIGNALS (DON'T TRADE - DISPLAY ONLY) ===
chopDiamondLong = higherLow and price_below_cloud and not chop_filter and day_trading_filter
chopDiamondShort = lowerHigh and price_above_cloud and not chop_filter and day_trading_filter
chopTriangleLong = higherLow and price_above_cloud and not chop_filter and day_trading_filter
chopTriangleShort = lowerHigh and price_below_cloud and not chop_filter and day_trading_filter

// === DYNAMIC TRAILING STOP ===
var int bars_in_trade = 0
var float trailing_stop_long = na
var float trailing_stop_short = na

// Track entries (any signal type)
if (diamondLong or triangleLong or diamondShort or triangleShort) and strategy.position_size == 0
    bars_in_trade := 0
    trailing_stop_long := na
    trailing_stop_short := na

// Count bars and set trailing stops
if strategy.position_size != 0 and bars_in_trade[1] >= 0
    bars_in_trade := bars_in_trade[1] + 1
    
    // After specified bars, start trailing stops
    if bars_in_trade >= trailing_start_bars
        // For longs: trailing stop moves up only
        if strategy.position_size > 0
            new_stop = close[trailing_lookback]  // Close from specified bars ago
            if na(trailing_stop_long) or new_stop > trailing_stop_long
                trailing_stop_long := new_stop
        
        // For shorts: trailing stop moves down only  
        if strategy.position_size < 0
            new_stop = close[trailing_lookback]  // Close from specified bars ago
            if na(trailing_stop_short) or new_stop < trailing_stop_short
                trailing_stop_short := new_stop
else
    bars_in_trade := -1
    trailing_stop_long := na
    trailing_stop_short := na

// Exit conditions
trailing_exit_long = strategy.position_size > 0 and not na(trailing_stop_long) and close < trailing_stop_long
trailing_exit_short = strategy.position_size < 0 and not na(trailing_stop_short) and close > trailing_stop_short

// === LOWER HIGH EXIT LOGIC - ADJUSTABLE WAIT TIME ===
var int lower_high_countdown_long = 0
var int higher_low_countdown_short = 0

// Start countdown when pattern detected
if strategy.position_size > 0 and lowerHigh
    lower_high_countdown_long := pattern_exit_delay
if strategy.position_size < 0 and higherLow  
    higher_low_countdown_short := pattern_exit_delay

// Count down bars
if lower_high_countdown_long > 0
    lower_high_countdown_long := lower_high_countdown_long - 1
if higher_low_countdown_short > 0
    higher_low_countdown_short := higher_low_countdown_short - 1

// Reset countdown when not in position
if strategy.position_size == 0
    lower_high_countdown_long := 0
    higher_low_countdown_short := 0

// Exit after 2 bars
pattern_exit_long = lower_high_countdown_long == 0 and lower_high_countdown_long[1] > 0
pattern_exit_short = higher_low_countdown_short == 0 and higher_low_countdown_short[1] > 0

// === ENTRIES ===
if diamondLong
    strategy.entry("Diamond Long", strategy.long, qty=diamond_qty, comment="Diamond Reversal")

if diamondShort
    strategy.entry("Diamond Short", strategy.short, qty=diamond_qty, comment="Diamond Reversal")

if triangleLong  
    strategy.entry("Triangle Long", strategy.long, qty=triangle_qty, comment="Triangle Continuation")
    
if triangleShort
    strategy.entry("Triangle Short", strategy.short, qty=triangle_qty, comment="Triangle Continuation")

// === EXITS ===
if strategy.position_size > 0
    if trailing_exit_long
        strategy.close_all(comment="Dynamic Trailing")
    else if close <= ta.lowest(low[pattern_lookback], pattern_lookback)
        strategy.close_all(comment="Stop Loss")
    else if pattern_exit_long
        strategy.close_all(comment="Lower High Exit")
        
if strategy.position_size < 0
    if trailing_exit_short
        strategy.close_all(comment="Dynamic Trailing")
    else if close >= ta.highest(high[pattern_lookback], pattern_lookback)
        strategy.close_all(comment="Stop Loss")
    else if pattern_exit_short
        strategy.close_all(comment="Higher Low Exit")

// === VISUALS ===
plotshape(diamondLong, "Diamond Long", shape.diamond, location.belowbar, color.lime, text="💎")
plotshape(diamondShort, "Diamond Short", shape.diamond, location.abovebar, color.red, text="💎")
plotshape(triangleLong, "Triangle Long", shape.triangleup, location.belowbar, color.green, text="🔺")
plotshape(triangleShort, "Triangle Short", shape.triangledown, location.abovebar, color.orange, text="🔺")

// Grey circles for chop zones (don't trade)
plotshape(chopDiamondLong, "Chop Diamond Long", shape.circle, location.belowbar, 
         color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopDiamondShort, "Chop Diamond Short", shape.circle, location.abovebar,
         color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopTriangleLong, "Chop Triangle Long", shape.circle, location.belowbar,
         color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopTriangleShort, "Chop Triangle Short", shape.circle, location.abovebar,
         color.new(color.gray, 50), size=size.tiny, text="⚫")

// Show trailing stop levels
plot(strategy.position_size > 0 and not na(trailing_stop_long) ? trailing_stop_long : na, 
     "Long Trailing Stop", color.purple, linewidth=3)
plot(strategy.position_size < 0 and not na(trailing_stop_short) ? trailing_stop_short : na, 
     "Short Trailing Stop", color.purple, linewidth=3)

// EMA Cloud
ema1 = plot(ema_fast, "Fast", color.new(color.blue, 60), linewidth=1)
ema2 = plot(ema_slow, "Slow", color.new(color.blue, 60), linewidth=1)
fill(ema1, ema2, color=cloud_bull ? color.new(color.green, 85) : color.new(color.red, 85), title="Cloud")

// Background coloring for chop zones
bgcolor(not chop_filter ? color.new(color.yellow, 95) : na, title="Chop Zone")

// === COMPREHENSIVE DASHBOARD ===
rsi = ta.rsi(close, rsi_length)



// === ALERTS ===
alertcondition(diamondLong, title="Diamond Long Signal", message="💎 DIAMOND REVERSAL LONG - {{ticker}} at {{close}}")
alertcondition(triangleLong, title="Triangle Long Signal", message="🔺 TRIANGLE CONTINUATION LONG - {{ticker}} at {{close}}")
alertcondition(strategy.position_size == 0 and strategy.position_size[1] != 0, title="Position Closed", message="💰 POSITION CLOSED - {{ticker}} at {{close}}")