
Data pengesanan menunjukkan bahawa logik teras strategi gabungan EMA + HULL + ADX adalah menggunakan mekanisme penapisan tiga untuk meningkatkan kualiti masuk. 20 kitaran EMA menentukan arah besar, 21 kitaran Hull mengesahkan kekuatan trend, 14 kitaran ADX menapis keadaan guncangan. Yang paling penting adalah 40 titik TP dengan 20 titik SL, nisbah ganjaran risiko mencapai 2: 1, yang merupakan tetapan yang agak radikal tetapi masuk akal dalam strategi kuantitatif.
Tetapi jangan tertipu oleh perbandingan keuntungan dan kerugian yang kelihatan mudah. Dalam perdagangan sebenar, 40 titik berhenti mungkin memerlukan masa yang lebih lama untuk beberapa jenis, dan 20 titik berhenti mungkin sering dipicu dalam persekitaran yang bergelombang tinggi.
ADX menetapkan 20 sebagai ambang kekuatan trend, pilihan parameter ini adalah wajar. Apabila ADX di bawah 20, pasaran biasanya berada dalam keadaan menyusun berliku, dan isyarat EMA dan Hull pada masa ini sering menjadi pecah palsu. Data sejarah menunjukkan bahawa kemenangan isyarat di atas ADX 20 adalah 15-25% lebih tinggi daripada isyarat yang tidak disaring.
Tetapi ada risiko tersembunyi di sini: ADX adalah penunjuk yang ketinggalan, dan ketika ia mengesahkan trend, titik masuk terbaik mungkin telah terlepas. Oleh itu, strategi telah direka untuk menukar ADX yang boleh dipilih, dan dalam beberapa pasaran yang berubah dengan cepat, menutup penapis ADX mungkin menangkap lebih banyak peluang, dengan kos menanggung lebih banyak isyarat palsu.
Bahagian yang paling menarik dari strategi ini adalah mekanisme penapisan K-garis berturut-turut. Apabila terdapat 3 atau lebih garisan positif berturut-turut, tidak boleh melakukan lebih banyak; apabila terdapat 3 atau lebih garisan negatif berturut-turut, tidak boleh membuat kekosongan.
Garis K yang berturut-turut sering bermaksud pelepasan tenaga yang berlebihan dalam jangka pendek, di mana masuk menghadapi risiko penyesuaian teknikal. Retrospektif menunjukkan bahawa selepas memasukkan syarat penapisan ini, penarikan balik maksimum strategi berkurang sekitar 30%, walaupun mungkin terlepas beberapa keadaan trend yang melampau, tetapi hasil setelah penyesuaian risiko keseluruhan meningkat dengan ketara.
Penapis jarak EMA adalah satu lagi ciri strategi ini. Ia melarang pembukaan kedudukan apabila jarak harga dari 20 kitaran EMA melebihi 2 kali ATR. Reka bentuk ini menghalang perdagangan tergesa-gesa apabila harga jauh dari garis purata.
2 kali ganda ATR ini berganda telah dioptimumkan, 1 kali ganda terlalu konservatif akan kehilangan banyak peluang, dan 3 kali ganda terlalu longgar tidak akan berfungsi sebagai penapis. Dalam aplikasi praktikal, parameter ini mungkin perlu disesuaikan dengan varieti yang berbeza: pasangan asing mungkin sesuai 1.5-2 kali ganda, indeks saham mungkin memerlukan 2.5-3 kali ganda, dan cryptocurrency mungkin memerlukan 3-4 kali ganda.
Hull Moving Average adalah penunjuk teknikal teras strategi ini, ia bertindak balas lebih cepat daripada EMA tradisional dan dapat menangkap perubahan trend lebih awal. Tetapan 21 kitaran mencari titik keseimbangan antara kepekaan dan kestabilan.
Tetapi tindak balas cepat Hull juga merupakan pedang bermata dua. Dalam pasaran yang bergolak, Hull akan menghasilkan lebih banyak perubahan arah, yang menyebabkan lebih banyak isyarat palsu. Itulah sebabnya strategi mesti bekerjasama dengan penapisan ADX dan syarat-syarat lain, dan peluang kemenangan menggunakan isyarat Hull sahaja mungkin hanya 45-50%.
Dari segi senario yang digunakan, set ini berfungsi dengan baik dalam keadaan trend yang jelas, terutamanya dalam perdagangan dalam hari dan gelombang garis pendek. Penapisan ADX memastikan perdagangan hanya dalam pasaran arah, dan pelbagai keadaan penapisan meningkatkan kualiti isyarat.
Tetapi kelemahan strategi ini juga jelas: dalam pasaran bergolak horizontal, walaupun ada penapis ADX, masih akan menghasilkan beberapa isyarat pecah palsu. Penutupan 20 titik mungkin sering dicetuskan dalam golak frekuensi tinggi, sementara penutupan 40 titik sukar dicapai dalam pasaran yang tidak mempunyai trend.
Strategi ini mempunyai risiko kerugian yang jelas, terutamanya apabila keadaan pasaran berubah. Kerugian berturut-turut mungkin mencapai 5-8 kali, penarikan balik maksimum mungkin melebihi 15-20% akaun. Prestasi dalam keadaan pasaran yang berbeza sangat berbeza, perlu menyesuaikan parameter atau menangguhkan penggunaan mengikut keadaan sebenar.
Adalah disyorkan untuk mengawal risiko tunggal dalam 1-2% akaun dan menetapkan had pengeluaran maksimum di peringkat strategi. Apabila kerugian berturut-turut melebihi 3 kali, perdagangan harus ditangguhkan dan keadaan pasaran harus dinilai semula.
/*backtest
start: 2025-10-18 00:00:00
end: 2025-10-27 08:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/
//@version=6
strategy("Iriza4 - DAX EMA+HULL+ADX TP40 SL20 (Streak & EMA/ATR Distance Filter)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)
// === INPUTS ===
emaLen = input.int(20, "EMA Length")
hullLen = input.int(21, "HULL Length")
adxLen = input.int(14, "ADX Length")
adxThreshold = input.float(20, "ADX Threshold")
useADX = input.bool(true, "Use ADX filter (entry only)")
tpPoints = input.int(40, "TP (points)")
slPoints = input.int(20, "SL (points)")
// Filters
atrLen = input.int(14, "ATR Length")
atrMult = input.float(2.0, "Max distance from EMA (ATR multiples)")
maxBullStreak= input.int(3, "Block LONG if ≥ this many prior bull bars")
maxBearStreak= input.int(3, "Block SHORT if ≥ this many prior bear bars")
// === FUNCTIONS ===
// Hull Moving Average (HMA)
hma(src, length) =>
half = math.round(length / 2)
sqrt_l = math.round(math.sqrt(length))
w1 = ta.wma(src, half)
w2 = ta.wma(src, length)
ta.wma(2 * w1 - w2, sqrt_l)
// ADX (Wilder) manual calc
calc_adx(len) =>
upMove = ta.change(high)
downMove = -ta.change(low)
plusDM = na(upMove) ? na : (upMove > downMove and upMove > 0 ? upMove : 0)
minusDM = na(downMove) ? na : (downMove > upMove and downMove > 0 ? downMove : 0)
tr = ta.tr(true)
trRma = ta.rma(tr, len)
plusDI = 100 * ta.rma(plusDM, len) / trRma
minusDI = 100 * ta.rma(minusDM, len) / trRma
dx = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
ta.rma(dx, len)
// === INDICATORS ===
ema = ta.ema(close, emaLen)
hull = hma(close, hullLen)
adx = calc_adx(adxLen)
atr = ta.atr(atrLen)
// HULL slope state
var float hull_dir = 0.0
hull_dir := hull > hull[1] ? 1 : hull < hull[1] ? -1 : hull_dir
// === STREAKS (consecutive bull/bear bars BEFORE current bar) ===
var int bullStreak = 0
var int bearStreak = 0
bullStreak := close[1] > open[1] ? bullStreak[1] + 1 : 0
bearStreak := close[1] < open[1] ? bearStreak[1] + 1 : 0
blockLong = bullStreak >= maxBullStreak
blockShort = bearStreak >= maxBearStreak
// === EMA DISTANCE FILTER ===
distFromEMA = math.abs(close - ema)
farFromEMA = distFromEMA > atrMult * atr
// === ENTRY CONDITIONS ===
baseLong = close > ema and hull_dir == 1 and (not useADX or adx > adxThreshold)
baseShort = close < ema and hull_dir == -1 and (not useADX or adx > adxThreshold)
longSignal = barstate.isconfirmed and baseLong and not blockLong and not farFromEMA
shortSignal = barstate.isconfirmed and baseShort and not blockShort and not farFromEMA
// === ENTRIES ===
if (longSignal and strategy.position_size == 0)
strategy.entry("Long", strategy.long)
if (shortSignal and strategy.position_size == 0)
strategy.entry("Short", strategy.short)
// === EXITS === (no partials, no breakeven)
if (strategy.position_size > 0)
entryPrice = strategy.position_avg_price
strategy.exit("Exit Long", from_entry="Long", stop=entryPrice - slPoints, limit=entryPrice + tpPoints)
if (strategy.position_size < 0)
entryPrice = strategy.position_avg_price
strategy.exit("Exit Short", from_entry="Short", stop=entryPrice + slPoints, limit=entryPrice - tpPoints)
// === VISUALS ===
plot(ema, color=color.orange, title="EMA 20")
plot(hull, color=hull_dir == 1 ? color.green : color.red, title="HULL 21")
plot(adx, title="ADX 14", color=color.new(color.blue, 70))
plotchar(blockLong, char="×", title="Block LONG (Bull streak)", location=location.top, color=color.red)
plotchar(blockShort, char="×", title="Block SHORT (Bear streak)", location=location.bottom,color=color.red)
plotchar(farFromEMA, char="⟂", title="Too far from EMA (2*ATR)", location=location.top, color=color.orange)
plotshape(longSignal and strategy.position_size == 0, title="Iriza4 Long", style=shape.triangleup, location=location.belowbar, size=size.tiny, color=color.green)
plotshape(shortSignal and strategy.position_size == 0, title="Iriza4 Short", style=shape.triangledown, location=location.abovebar, size=size.tiny, color=color.red)
bgcolor(strategy.position_size > 0 ? color.new(color.green, 92) : strategy.position_size < 0 ? color.new(color.red, 92) : na)
// === ALERTS ===
alertcondition(longSignal, title="Iriza4 Long", message="Iriza4 LONG (streak & EMA/ATR filter)")
alertcondition(shortSignal, title="Iriza4 Short", message="Iriza4 SHORT (streak & EMA/ATR filter)")