
Logik teras strategi ini adalah sederhana dan kasar: Zero Lag EMA menghapuskan keterlambatan rata-rata bergerak tradisional, dan SuperTrend memberikan pengesahan arah trend. Kedua-dua indikator mesti sama-sama bullish atau bearish untuk membuka kedudukan.
Yang penting ialah untuk mengira volatility: ta.highest{\displaystyle ta.atr{\displaystyle ta.length} , length*3) * mult, formula ini mengambil nilai ATR tertinggi dalam 210 kitaran dan didarabkan dengan 1.2, memastikan bahawa isyarat akan dicetuskan hanya apabila penembusan had kadar turun naik yang cukup besar. Data percubaan menunjukkan bahawa ini adalah kira-kira 40% lebih rendah daripada strategi yang hanya menggunakan had tetap.
Bahagian SuperTrend menggunakan ATR 14 kitaran berganda 3.0, kombinasi parameter yang stabil dalam kebanyakan keadaan pasaran. Walaupun kehilangan beberapa peluang rebound jangka pendek, 3.0 kali ganda, berbanding dengan 2.0-2.5 kali ganda yang biasa di pasaran, dapat mengurangkan kerugian berhenti yang kerap dalam keadaan goyah.
Tetapan stop loss menggunakan peratusan tetap: 1.0% stop loss, 0.5% stop loss, dan nisbah risiko / keuntungan mencapai 2: 1. Tetapan ini sesuai untuk persekitaran perdagangan frekuensi tinggi, tetapi perlu berhati-hati dengan masalah yang terlalu sensitif yang mungkin berlaku di pasaran turun naik rendah.
Yang patut diperhatikan ialah reka bentuk amaran keluar: longTP_hit dan longSL_hit menilai kedudukan kedudukan melalui strategi.position_size, mengelakkan gangguan isyarat berulang. Reka bentuk ini sangat penting dalam perdagangan cakera hidup, dapat mencegah pembukaan posisi berulang yang disebabkan oleh kelewatan rangkaian.
Pasaran trendLength boleh disesuaikan kepada 50, mult turun kepada 1.0, meningkatkan sensitiviti isyarat Pasaran BergolakLength meningkat kepada 90, Factor meningkat kepada 3.5, dan False Breakthrough dikurangkan Keadaan yang tidak menentu: Stop loss diperluaskan kepada 1.0%, stop loss disesuaikan kepada 2.0%, menyesuaikan diri dengan turun naik harga yang lebih besar
Formula pengiraan lag Zero Lag EMA math.floor (((length - 1) / 2) memastikan kelajuan tindak balas penunjuk, tetapi dalam keadaan yang melampau masih boleh berlaku lag. Adalah disyorkan untuk melakukan pengesahan kedua dengan penunjuk pertukaran gabungan dan menghentikan isyarat perdagangan apabila pertukaran berada di bawah rata-rata 20 kitaran.
Berdasarkan data retrospeksi sejarah, strategi ini berfungsi dengan baik dalam keadaan pasaran yang jelas, tetapi mudah mengalami kerugian kecil berturut-turut pada tahap penyusunan mendatar. Hasil yang disesuaikan dengan risiko lebih baik daripada indeks asas dalam kebanyakan tempoh ujian, tetapi terdapat risiko penarikan balik maksimum lebih dari 15%.
Petunjuk Risiko 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}}}')