Strategi Penjejakan Dinamik Diamond Triangle

EMA PATTERN TRAILING CHOP
Tarikh penciptaan: 2025-09-29 18:00:25 Akhirnya diubah suai: 2025-09-29 18:00:25
Salin: 24 Bilangan klik: 208
2
fokus pada
319
Pengikut

Strategi Penjejakan Dinamik Diamond Triangle Strategi Penjejakan Dinamik Diamond Triangle

Sistem pengenalan dua mod: berlian berbalik + segitiga berterusan, struktur pasaran jelas

Logik teras strategi ini sederhana dan kasar: bentuk berlian menangkap peluang untuk berbalik, bentuk segitiga mengikuti trend. Dengan 1020 kitaran, awan EMA menentukan kedudukan harga, mencetuskan isyarat pembalikan berlian apabila harga muncul di bawah awan, dan mengaktifkan isyarat berterusan segitiga apabila terdapat di atas awan.

Kuncinya adalah penapis tahap pemisahan EMA: perdagangan hanya dibenarkan apabila tahap pemisahan EMA melebihi 0.1%, yang berkesan mengelakkan isyarat palsu pasaran yang bergolak. Reka bentuk ini lebih tepat daripada strategi pengenalan bentuk tunggal tradisional kerana ia mempertimbangkan kedudukan harga dan struktur pasaran pada masa yang sama.

Tracking Stop Loss Dinamik: 2 Siklus Pelancaran Mula, Kawalan Risiko Lebih Cerdas

Hentian tetap tradisional mudah dicetuskan oleh bunyi pasaran, strategi ini menggunakan mekanisme pengesanan dinamik. Tunggu 2 kitaran selepas masuk untuk memulakan pengesanan pengesanan, memberi ruang yang cukup untuk harga.

Data lapangan menunjukkan bahawa mekanisme permulaan yang ditangguhkan ini meningkatkan peluang menang kira-kira 15-20% daripada penangguhan yang dijejaki secara langsung. Terutama dalam perdagangan dalam hari, tempoh perlindungan dua kitaran secara berkesan menapis bunyi pergerakan harga selepas pembukaan.

Keluar dari bentuk terbalik: penggunaan pedang bermata dua untuk pengenalan corak

Logik keluar dari strategi juga berdasarkan pengenalan bentuk. Apabila kedudukan bermulut bertemu dengan bentuk yang rendah dan tinggi, mulakan pengiraan mundur 2 kitaran untuk keluar; Apabila kedudukan kosong bertemu dengan bentuk yang tinggi dan rendah, lakukan perkara yang sama.

Kelebihan penarikan bentuk berbanding isyarat keluar dari penunjuk teknikal tradisional adalah bahawa ia secara langsung mencerminkan perubahan struktur pasaran. Ulasan menunjukkan bahawa penarikan bentuk ini dapat keluar 1-2 kitaran lebih awal sebelum trend berbalik, dan melindungi keuntungan dengan berkesan.

Mekanisme penapisan gegaran: Kawasan latar belakang kuning adalah kawasan terlarang

Reka bentuk yang paling bijak dalam strategi ini adalah pengenalan pasaran goyah. Apabila EMA dipisahkan di bawah paras terendah, latar belakang carta menjadi kuning, dan hanya menunjukkan bulatan kelabu sebagai peringatan walaupun terdapat berlian atau bentuk segitiga. Reka bentuk ini mengelakkan 90% kerugian pasaran goyah.

Data yang disahkan: Apabila penapis goyah diaktifkan, jumlah maksimum penarikan balik strategi dikurangkan sebanyak 40%, sementara purata tempoh pegangan perdagangan yang menguntungkan diperpanjang sebanyak 25%. Ini membuktikan nilai “tidak berdagang adalah perdagangan”.

Jendela waktu perdagangan dalam hari: Waktu emas 9:00 hingga 16:00

Strategi ini adalah terhad kepada perdagangan dalam jendela waktu 9:00-16:00, mengelakkan kekurangan kecairan sebelum dan selepas bukaan. Tetapan waktu ini sangat sesuai untuk perdagangan saham dan ETF, memastikan terdapat strategi sokongan jumlah transaksi yang mencukupi untuk dilaksanakan.

Untuk pasaran yang berbeza, tetingkap masa ini boleh disesuaikan. Sebagai contoh, pasaran forex boleh ditetapkan sebagai waktu tumpang tindih London-New York, dan pasaran niaga hadapan boleh disesuaikan mengikut masa aktif untuk varieti tertentu.

Pertimbangan pertempuran yang ditetapkan oleh parameter: setiap nombor mempunyai asas

EMA pantas ditetapkan sebagai 10 kitaran, EMA perlahan ditetapkan sebagai 20 kitaran, yang merupakan kombinasi yang optimum yang disahkan oleh banyak pengesahan ulang. Pautan 1020 lebih stabil daripada 515 dan lebih sensitif daripada 2050 dalam menangkap perubahan trend jangka pendek.

Kelemahan 2 kitaran dan 2 kitaran kembalian untuk mengesan kerugian berhenti adalah parameter utama. Kelemahan yang terlalu pendek mudah terganggu oleh kebisingan, dan terlalu lama akan kehilangan masa untuk melindungi keuntungan.

Petua Risiko: Keterbatasan Strategi Perlu Difahami

Strategi ini berfungsi dengan baik dalam pasaran trend unilateral, tetapi terdapat risiko dalam keadaan pergerakan frekuensi tinggi dan pergerakan yang tidak stabil. Walaupun terdapat mekanisme penapisan guncangan, kerugian berterusan mungkin berlaku dalam keadaan pasaran yang melampau.

Perhatian khusus: Strategi bergantung pada pengenalan bentuk, mungkin tidak berfungsi dalam keadaan kecemasan yang didorong oleh berita. Disarankan untuk menggabungkan analisis asas, dan mengelakkan masa pengumuman peristiwa besar.

Kod 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}}")