
Strategi ini adalah sistem perdagangan trend track yang komprehensif yang menggabungkan pelbagai indeks moving averages (EMA) dan indeks yang agak kuat (RSI). Strategi ini menggunakan tiga EMA yang berbeza (20, 50, 200) untuk menentukan arah trend pasaran, dan menggunakan indikator RSI sebagai syarat penapisan tambahan untuk mengelakkan masuk ke dalam persekitaran pasaran yang terlalu banyak dibeli atau terlalu banyak dijual.
Logik utama strategi ini adalah berdasarkan beberapa komponen utama:
Pengenalan Trend: Menggunakan EMA200 sebagai penunjuk trend jangka panjang. Apabila harga lebih tinggi daripada EMA200, ia dianggap sebagai trend naik; apabila harga lebih rendah daripada EMA200, ia dianggap sebagai trend menurun.
Isyarat masuk: Menjana isyarat dagangan melalui persilangan EMA20 dan EMA50 Khususnya:
Pengesahan tambahanStrategi ini menawarkan pilihan syarat-syarat pengesahan kemasukan:
Pengurusan RisikoStrategi ini menawarkan dua cara untuk menghentikan kerugian:
Pengurusan keuntungan: menggunakan RR (Risk-to-Return Ratio) untuk menetapkan sasaran keuntungan, dengan default 2R
Pengurusan kedudukanModel risiko peratusan tetap berdasarkan hak dan faedah akaun, memastikan risiko setiap urus niaga sama
Mekanisme pengeluaranSelain daripada sasaran stop loss dan profit, anda juga boleh memilih untuk keluar apabila terdapat isyarat EMA yang berlawanan.
Dengan mengkaji lebih mendalam mengenai pelaksanaan kod strategi ini, beberapa kelebihan yang jelas dapat diringkaskan:
Pengesahan trend pelbagai peringkatMelalui tiga EMA yang berbeza, strategi ini dapat mengenal pasti dan mengesahkan trend pasaran dengan berkesan, mengurangkan isyarat palsu. EMA jangka panjang ((200) menentukan trend besar, manakala EMA jangka pendek ((20⁄50) menyeberang untuk menangkap peluang masuk dalam trend.
Penembusan palsuPenapis RSI berkesan mengelakkan masuk dalam keadaan pasaran yang terlalu dibeli atau terlalu dijual, yang mengurangkan perdagangan yang salah ketika pasaran akan berbalik.
Pengurusan risiko yang fleksibelStrategi ini menawarkan dua kaedah untuk menghentikan kerugian (ATR dan titik ayunan) yang membolehkan peniaga memilih kaedah kawalan risiko yang paling sesuai mengikut keadaan pasaran yang berbeza.
Pengurusan kedudukan dinamikPerkiraan peratusan risiko berdasarkan kepentingan akaun memastikan risiko yang konsisten dalam keadaan pasaran yang berbeza-beza, yang merupakan ciri utama sistem perdagangan profesional.
Mekanisme Keluar BerbilangStrategi ini mempunyai bukan sahaja sasaran untuk menghentikan kerugian dan keuntungan, tetapi juga pilihan untuk keluar apabila isyarat pembalikan trend muncul, yang memberikan kawalan risiko yang lebih menyeluruh.
Reka bentuk parameter yang telusSemua parameter utama boleh disesuaikan melalui antara muka input, membolehkan peniaga menyesuaikan strategi mengikut pilihan risiko dan gaya perdagangan mereka sendiri.
Walaupun strategi ini dirancang secara menyeluruh, terdapat beberapa potensi risiko dan batasan:
Kepekaan ParameterStrategi sangat bergantung kepada pilihan parameter EMA dan RSI. Tetapan parameter yang tidak sesuai boleh menyebabkan perdagangan berlebihan atau kehilangan peluang perdagangan penting. Penyelesaian adalah dengan mengkaji semula parameter optimum melalui sejarah dan mencari kombinasi terbaik untuk pasaran tertentu.
Penundaan perubahan trendKelemahan yang melekat dengan penggunaan purata bergerak sebagai penunjuk trend adalah terdapatnya keterlambatan, yang mungkin menghasilkan pengunduran yang lebih besar pada awal pembalikan trend. Anda boleh mempertimbangkan untuk memasukkan penunjuk trend yang lebih sensitif sebagai tambahan.
Batasan penapis RSIWalaupun penapis RSI membantu mengelakkan pasaran yang terlalu beli / dijual, dalam pasaran yang sedang tren, RSI mungkin berada di kawasan yang melampau untuk jangka masa yang lama, yang menyebabkan kehilangan peluang perdagangan yang menguntungkan. Penyelesaian adalah dengan menyesuaikan nilai RSI dalam keadaan pasaran yang berbeza.
Batasan penghentian peratusan tetap: Menggunakan nisbah ganjaran risiko tetap ® untuk menetapkan sasaran keuntungan, mungkin tidak sesuai dengan semua keadaan pasaran. Apabila pasaran berubah, mungkin perlu menyesuaikan nisbah ganjaran risiko secara dinamik.
Kesan kos urus niagaWalaupun strategi mengambil kira komisen sebanyak 0.05%, dalam persekitaran perdagangan frekuensi tinggi, slippage dan kos transaksi lain boleh mempengaruhi prestasi strategi dengan ketara. Model kos transaksi yang lebih realistik harus dimasukkan ke dalam penilaian semula.
Berdasarkan analisis mendalam mengenai strategi ini, berikut adalah beberapa jalan yang mungkin boleh dioptimumkan:
Pengaturan parameter dinamikPertimbangkan untuk menyesuaikan kitaran EMA dan nilai terendah RSI secara automatik mengikut turun naik pasaran. Sebagai contoh, menggunakan kitaran EMA yang lebih lama dalam pasaran yang bergelombang tinggi dan kitaran yang lebih pendek dalam pasaran yang bergelombang rendah. Ini boleh dilakukan dengan menambahkan ATR atau indikator kadar turun naik sejarah.
Analisis pelbagai kerangka masaMenambah pengesahan trend pada jangka masa yang lebih tinggi, contohnya, hanya masuk apabila arah trend yang berlawanan dengan jangka masa perdagangan semasa. Ini dapat membantu mengurangkan risiko perdagangan berlawanan.
Pengurusan keuntungan yang lebih baikPertimbangkan untuk melaksanakan strategi keuntungan bergelar, seperti menutup sebahagian daripada kedudukan apabila mencapai 1R dan membiarkan yang lain terus beroperasi untuk menangkap trend yang lebih besar. Kaedah ini dapat mengimbangi keperluan untuk mengunci keuntungan dan mengesan trend.
Tambah analisis volum: Penapis kuantiti dagangan dimasukkan ke dalam pengesahan isyarat dagangan, dan hanya masuk apabila kuantiti dagangan menyokong pergerakan harga. Ini membantu mengesahkan kekuatan dan kebolehpercayaan trend.
Pengoptimuman Pembelajaran MesinMenggunakan algoritma pembelajaran mesin untuk mengenal pasti keadaan pasaran yang berbeza secara automatik dan memilih kombinasi parameter strategi terbaik untuk setiap keadaan. Ini dapat meningkatkan kebolehpasaran strategi dalam keadaan pasaran yang berbeza.
Mempertimbangkan faktor musiman dan masa pasaranDi sesetengah pasaran, tempoh masa atau musim tertentu mungkin lebih sesuai untuk strategi trend-following ini. Analisis data sejarah untuk mengenal pasti masa perdagangan terbaik dapat meningkatkan prestasi strategi.
Strategi perdagangan penapisan trend indeks bergerak berganda dengan indeks yang agak kuat adalah sistem pemantauan trend yang dirancang secara menyeluruh yang menggabungkan beberapa elemen penting analisis teknikal: pengenalan trend, pengesahan momentum, pengurusan risiko dan kawalan kedudukan. Dengan menggunakan tiga EMA dari tiga kitaran yang berbeza untuk menentukan trend, dan berurusan dengan penapis RSI untuk mengelakkan kawasan pembelian / penjualan yang berlebihan, strategi ini memberikan cara yang seimbang untuk menangkap trend pasaran sambil mengawal risiko.
Kelebihan utama strategi ini terletak pada mekanisme pengesahan trend bertingkat dan sistem pengurusan risiko yang komprehensif, termasuk hentian dinamik, pengurusan kedudukan berasaskan risiko dan mekanisme keluar berganda. Walau bagaimanapun, ia juga menghadapi cabaran yang wujud seperti kepekaan parameter dan keterlambatan purata bergerak.
Dengan pengoptimuman lanjut, seperti penyesuaian parameter dinamik, analisis jangka masa berbilang dan strategi pengurusan keuntungan yang lebih baik, peniaga dapat meningkatkan daya serap dan keuntungan sistem ini. Secara keseluruhan, ini adalah kerangka strategi yang tersusun dengan baik yang sesuai digunakan oleh peniaga jangka menengah dan panjang sebagai asas yang kukuh untuk sistem perdagangan trend.
/*backtest
start: 2024-08-12 00:00:00
end: 2025-08-10 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("EMA20/50/200 + RSI Swing (Trend Filter)", overlay=true, initial_capital=100000, pyramiding=0,
commission_type=strategy.commission.percent, commission_value=0.05)
// ==== Inputs ====
lenFast = input.int(20, "EMA Fast", minval=1)
lenSlow = input.int(50, "EMA Slow", minval=1)
lenTrend = input.int(200, "EMA Trend", minval=1)
useLong = input.bool(true, "Enable Longs")
useShort = input.bool(false, "Enable Shorts")
// RSI filter
rsiLen = input.int(14, "RSI Length", minval=1)
useRsi = input.bool(true, "Use RSI Filter")
rsiMaxLong = input.float(70.0, "Max RSI for Long", step=0.1)
rsiMinShort = input.float(30.0, "Min RSI for Short", step=0.1)
// Entry confirmation: require close above/below fast & slow EMA
requireCloseConfirm = input.bool(true, "Require close above/below EMA20 & EMA50 for entry")
// Risk Management
riskType = input.string("ATR", "Stop Basis", options=["ATR","Swing"])
atrLen = input.int(14, "ATR Length", minval=1)
atrMult = input.float(2.0, "ATR Multiplier", step=0.1)
swingLen = input.int(5, "Swing Lookback (bars)", minval=1)
useTP = input.bool(true, "Use Take-Profit (R multiple)")
rr = input.float(2.0, "Reward/Risk (TP in R)", step=0.1, minval=0.1)
posSizePct = input.float(10, "Position Size % of Equity", step=0.5, minval=0.1, maxval=100)
exitOnOpposite = input.bool(true, "Exit on opposite EMA cross")
// ==== Indicators ====
emaFast = ta.ema(close, lenFast)
emaSlow = ta.ema(close, lenSlow)
emaTrend = ta.ema(close, lenTrend)
rsi = ta.rsi(close, rsiLen)
// ==== Conditions ====
trendUp = close > emaTrend
trendDown = close < emaTrend
crossUp = ta.crossover(emaFast, emaSlow)
crossDown = ta.crossunder(emaFast, emaSlow)
confirmLong = not requireCloseConfirm or (close > emaFast and close > emaSlow)
confirmShort = not requireCloseConfirm or (close < emaFast and close < emaSlow)
rsiOKLong = not useRsi or (rsi <= rsiMaxLong)
rsiOKShort = not useRsi or (rsi >= rsiMinShort)
longSignal = useLong and trendUp and crossUp and confirmLong and rsiOKLong
shortSignal = useShort and trendDown and crossDown and confirmShort and rsiOKShort
// ==== Stops & Take Profit helpers ====
getLongStop() =>
float stop = na
if riskType == "ATR"
stop := close - ta.atr(atrLen) * atrMult
else
stop := ta.lowest(low, swingLen)
stop
getShortStop() =>
float stop = na
if riskType == "ATR"
stop := close + ta.atr(atrLen) * atrMult
else
stop := ta.highest(high, swingLen)
stop
// ==== Position sizing ====
capital = strategy.equity
qtyPercent = posSizePct * 0.01
// ==== Entries & Exits ====
if (longSignal)
longStop = getLongStop()
riskPerShare = math.max(close - longStop, syminfo.mintick)
qty = math.floor((capital * qtyPercent) / riskPerShare)
strategy.entry("Long", strategy.long, qty)
tp = useTP ? close + riskPerShare * rr : na
strategy.exit("Long-Exit", "Long", stop=longStop, limit=tp)
if (shortSignal)
shortStop = getShortStop()
riskPerShare = math.max(shortStop - close, syminfo.mintick)
qty = math.floor((capital * qtyPercent) / riskPerShare)
strategy.entry("Short", strategy.short, qty)
tp = useTP ? close - riskPerShare * rr : na
strategy.exit("Short-Exit", "Short", stop=shortStop, limit=tp)
// Optional exit on opposite cross
if exitOnOpposite
if strategy.position_size > 0 and crossDown
strategy.close("Long", comment="Opposite cross")
if strategy.position_size < 0 and crossUp
strategy.close("Short", comment="Opposite cross")
// ==== Visuals ====
plot(emaFast, title="EMA Fast", linewidth=2)
plot(emaSlow, title="EMA Slow", linewidth=2)
plot(emaTrend, title="EMA Trend", color=color.new(color.gray, 0), linewidth=2)
// markers utan text-param
plotshape(longSignal, title="Long Signal", style=shape.triangleup, location=location.belowbar, color=color.new(color.lime, 0), size=size.tiny)
plotshape(shortSignal, title="Short Signal", style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)
bgcolor(trendUp ? color.new(color.green, 92) : trendDown ? color.new(color.red, 92) : na)
// ==== Alerts ====
alertcondition(longSignal, title="Long Signal", message="EMA20 crossed above EMA50 with price > EMA200 and RSI filter OK")
alertcondition(shortSignal, title="Short Signal", message="EMA20 crossed below EMA50 with price < EMA200 and RSI filter OK")
// ==== Notes panel ====
var label note = na
if barstate.islast
label.delete(note)
msg = "EMA20/50/200 + RSI Swing\n" +
"Long: TrendUp & CrossUp & (ConfirmClose=" + str.tostring(requireCloseConfirm) + ") & (RSI<=" + str.tostring(rsiMaxLong) + ")\n" +
"Short: TrendDown & CrossDown & (ConfirmClose=" + str.tostring(requireCloseConfirm) + ") & (RSI>=" + str.tostring(rsiMinShort) + ")\n" +
"Stops: " + riskType + (riskType=="ATR" ? " (" + str.tostring(atrLen) + ", x" + str.tostring(atrMult) + ")" : " (swing len=" + str.tostring(swingLen) + ")") +
(useTP ? " | TP=" + str.tostring(rr) + "R" : " | TP: off")
note := label.new(bar_index, high, msg, style=label.style_label_upper_left, textcolor=color.white, color=color.new(color.black, 20))