
Logika inti dari strategi ini sederhana dan kasar: Zero Lag EMA menghilangkan keterbelakangan dari rata-rata bergerak tradisional, dan SuperTrend memberikan konfirmasi arah tren. Dua indikator harus berada di posisi bullish atau bearish pada saat yang sama untuk membuka posisi.
Kuncinya adalah untuk menghitung volatilitas: ta.highest (ta.atr (length), length (ta.*3) * mult, rumus ini mengambil nilai ATR tertinggi dalam 210 siklus dan dikalikan dengan 1,2, untuk memastikan bahwa hanya penembusan yang cukup besar dari ambang batas volatilitas akan memicu sinyal. Data eksperimental menunjukkan bahwa ini mengurangi sekitar 40% dari strategi yang hanya menggunakan ambang batas tetap.
Bagian SuperTrend menggunakan 14 siklus ATR dengan 3.0 kali lipat, kombinasi parameter yang stabil dalam kebanyakan lingkungan pasar. Dibandingkan dengan 2.0-2.5 kali lipat yang umum di pasar, 3.0 kali lipat, meskipun akan kehilangan beberapa peluang bouncing jangka pendek, dapat secara signifikan mengurangi seringnya stop loss dalam situasi yang bergolak.
Stop loss setup menggunakan persentase tetap: 1: 0% stop loss, 0,5% stop loss, dan rasio risiko / keuntungan mencapai 2: 1. Pengaturan ini cocok untuk lingkungan perdagangan frekuensi tinggi, tetapi perlu diperhatikan bahwa stop loss mungkin terlalu sensitif di pasar dengan volatilitas rendah.
Yang patut diperhatikan adalah desain peringatan keluar: longTP_hit dan longSL_hit menilai status posisi melalui strategi.position_size, menghindari gangguan dari sinyal berulang. Desain ini sangat penting dalam perdagangan disk nyata, dapat mencegah pembukaan posisi berulang yang disebabkan oleh keterlambatan jaringan.
Pasar tren:length dapat disetel ke 50, mult turun menjadi 1.0, meningkatkan sensitivitas sinyal Pasar BergoyangLength meningkat menjadi 90, Factor meningkat menjadi 3.5, dan False Breakthrough berkurang Lingkungan yang bergelombang tinggiStop loss diperluas menjadi 1.0%, stop loss disesuaikan menjadi 2.0%, disesuaikan dengan fluktuasi harga yang lebih besar
Formula penghitungan lag dari Zero Lag EMA (math.floor (((length - 1) / 2)) memastikan kecepatan respons indikator, tetapi masih mungkin terjadi lag dalam situasi yang ekstrim. Disarankan untuk melakukan konfirmasi kedua pada indikator komoditas terintegrasi dan menghentikan sinyal perdagangan ketika komoditas terintegrasi di bawah rata-rata 20 siklus.
Menurut data retrospeksi historis, strategi ini bekerja dengan baik dalam kondisi pasar dengan tren yang jelas, tetapi rentan terhadap kerugian kecil berturut-turut pada tahap penyusunan horizontal. Pengembalian yang disesuaikan dengan risiko lebih baik dari indeks acuan selama sebagian besar periode pengujian, tetapi ada risiko penarikan balik maksimum lebih dari 15%.
Peringatan Penting:
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-18 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("Zero Lag + ML SuperTrend Strategy (Multi-Symbol)", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// === Inputs ===
length = input.int(70, "Zero Lag Length")
mult = input.float(1.2, "Band Multiplier")
atrPeriod = input.int(14, "ATR Period (SuperTrend)")
factor = input.float(3.0, "ATR Multiplier (SuperTrend)")
tpPerc = input.float(1.0, "Take Profit %")
slPerc = input.float(0.5, "Stop Loss %")
// === Symbol Info ===
sym = syminfo.ticker
// === Zero Lag Trend ===
src = close
lag = math.floor((length - 1) / 2)
zlema = ta.ema(src + (src - src[lag]), length)
volatility = ta.highest(ta.atr(length), length*3) * mult
bullZL = close > zlema + volatility
bearZL = close < zlema - volatility
// === ML SuperTrend ===
atr = ta.atr(atrPeriod)
upperband = hl2 + factor * atr
lowerband = hl2 - factor * atr
var float trend = na
if close > nz(trend[1], hl2)
trend := math.max(lowerband, nz(trend[1], hl2))
else
trend := math.min(upperband, nz(trend[1], hl2))
bullST = close > trend
bearST = close < trend
// === Combined Signals ===
longEntry = bullZL and bullST
shortEntry = bearZL and bearST
// === Strategy Execution ===
if (longEntry)
strategy.entry("Long", strategy.long)
if (shortEntry)
strategy.entry("Short", strategy.short)
// Exit conditions (fixed SL & TP)
longSL = strategy.position_avg_price * (1 - slPerc/100)
longTP = strategy.position_avg_price * (1 + tpPerc/100)
shortSL = strategy.position_avg_price * (1 + slPerc/100)
shortTP = strategy.position_avg_price * (1 - tpPerc/100)
strategy.exit("Exit Long", from_entry="Long", stop=longSL, limit=longTP)
strategy.exit("Exit Short", from_entry="Short", stop=shortSL, limit=shortTP)
// === Plotting ===
plot(zlema, "ZeroLagEMA", color=color.yellow)
plot(trend, "SuperTrend", color=color.blue)
// === Alerts for Webhook ===
// Entry alerts
alertcondition(longEntry, title="Long Entry",
message='{"action":"long","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortEntry, title="Short Entry",
message='{"action":"short","symbol":"{{ticker}}","price":{{close}}}')
// Exit alerts (triggered only on TP/SL)
longTP_hit = strategy.position_size <= 0 and close >= longTP
longSL_hit = strategy.position_size <= 0 and close <= longSL
shortTP_hit = strategy.position_size >= 0 and close <= shortTP
shortSL_hit = strategy.position_size >= 0 and close >= shortSL
alertcondition(longTP_hit, title="Long TP Hit",
message='{"action":"close_long","type":"tp","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(longSL_hit, title="Long SL Hit",
message='{"action":"close_long","type":"sl","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortTP_hit, title="Short TP Hit",
message='{"action":"close_short","type":"tp","symbol":"{{ticker}}","price":{{close}}}')
alertcondition(shortSL_hit, title="Short SL Hit",
message='{"action":"close_short","type":"sl","symbol":"{{ticker}}","price":{{close}}}')