
Strategi ini adalah sistem perdagangan sinkron trend dan momentum yang komprehensif, yang mengidentifikasi peluang perdagangan berkemungkinan tinggi berdasarkan penilaian trend garis rata dan pengesahan momentum indeks ((RSI) yang agak kuat. Inti strategi mengikuti falsafah perdagangan “berjalan” dan hanya menunggu untuk membetulkan dan mencari titik masuk yang terbaik setelah mengesahkan arah trend utama pasaran.
Prinsip operasi strategi adalah berdasarkan empat modul utama: pengenalan trend, penilaian syarat kemasukan, pengurusan risiko dan pengoptimuman keuntungan.
Pengenalan Trend:
Syarat kemasukan:
Pengurusan Risiko:
Pengoptimuman keuntungan:
Dalam pelaksanaan strategi, pengiraan matematik yang tepat digunakan untuk menentukan saiz kedudukan terbaik, memastikan risiko setiap perdagangan dikawal pada tahap yang ditetapkan, sambil membenarkan penyesuaian parameter untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Strategi ini mempunyai kelebihan yang ketara:
Isyarat dagangan berkualiti tinggi: Dengan trend dan pengesahan momentum, hanya membuka kedudukan di arah kebarangkalian yang tinggi, meningkatkan peluang kemenangan secara ketara.long_trend_okdanlong_rsi_recoveryKombinasi syarat untuk memastikan kualiti isyarat dagangan.
Pengurusan risiko penyesuaianReka bentuk penutupan berasaskan ATR membolehkan strategi menyesuaikan parameter risiko secara automatik mengikut turun naik pasaran. Menggunakan penutupan yang lebih longgar dalam keadaan pasaran yang bergolak, dan menggunakan penutupan yang lebih ketat dalam keadaan pasaran yang tenang, untuk mengawal risiko yang optimum.
Pengurusan wang yang optimumMekanisme keuntungan berpecah-pecah ((50% kedudukan di 2.1R mendapat keuntungan, selebihnya menggunakan hentian yang diikuti) mewujudkan keseimbangan yang dapat memastikan keuntungan dan memaksimumkan trend menangkap.long_tp1_hitdanlong_trail_stopVariabel ekuivalen mengawal proses ini dengan tepat.
Peraturan yang jelasStrategi sepenuhnya kuantitatif, menghilangkan gangguan emosi dalam perdagangan, melaksanakan disiplin yang kuat. Semua keputusan perdagangan berdasarkan pengiraan matematik yang jelas dan syarat logik, mengelakkan penghakiman subjektif.
Keputusan Pembantu VisualStrategi menyediakan sistem maklum balas visual yang lengkap, termasuk warna latar belakang trend, penanda isyarat masuk dan penglihatan sasaran stop / profit, untuk memudahkan pedagang memahami dan memantau operasi strategi.
Parameter boleh disesuaikanParameter teras seperti kitaran EMA, nilai RSI, dan ATR boleh disesuaikan, membolehkan strategi menyesuaikan diri dengan keadaan pasaran yang berbeza dan pilihan risiko peribadi.
Walaupun terdapat banyak kelebihan, strategi ini mempunyai risiko yang berpotensi:
Trend mengiktiraf ketinggalanMenggunakan EMA sebagai alat penilaian trend terdapat ketidakselesaan yang wujud, mungkin terlepas beberapa peluang pada awal trend atau masih mengekalkan kedudukan arah asal pada akhir trend. Penyelesaian adalah mempertimbangkan untuk menambah indikator pengesahan trend jangka pendek atau menyesuaikan parameter EMA untuk meningkatkan sensitiviti.
Risiko penembusan palsu:Sinyal pembalikan RSI mungkin berlaku penembusan palsu, yang menyebabkan perdagangan yang salah. Untuk menghadapi risiko ini, syarat pengesahan boleh ditambah seperti perubahan jumlah dagangan atau pengesahan sinkronisasi indikator momentum lain.
Tidak sesuai untuk pasaran horizontalStrategi ini berprestasi terbaik di pasaran yang jelas trend, dan mungkin menghasilkan isyarat yang salah dan perdagangan yang merugikan yang kerap di peringkat penyusunan horisontal. Ia disyorkan untuk menangguhkan strategi apabila pasaran berada dalam pergerakan yang jelas di antara kawasan, yang dapat dikenali dengan menambah penapis kekuatan trend.
Kepekaan ParameterPrestasi strategi lebih sensitif terhadap pilihan parameter, terutamanya penyetempatan kitaran EMA dan paras paras RSI. Ia disyorkan untuk mengoptimumkan parameter dalam keadaan pasaran yang berbeza melalui pengesanan semula sejarah, untuk mengelakkan kecocokan berlebihan.
Risiko pengurusan danaPengurusan risiko peratusan tetap masih boleh menyebabkan kerugian berturut-turut berkumpul dalam keadaan pasaran yang melampau. Ia disyorkan untuk mempertimbangkan untuk melaksanakan mekanisme penyesuaian risiko dinamik, mengurangkan saiz kedudukan secara beransur-ansur selepas kerugian berturut-turut.
Berdasarkan analisis kod strategi, berikut adalah arah pengoptimuman yang mungkin:
Pengesahan sinkronisasi pelbagai tempoh masa: Mengintegrasikan trend dan isyarat momentum dari pelbagai tempoh masa, meningkatkan ketepatan keputusan perdagangan. Sebagai contoh, anda boleh memeriksa sama ada trend garis matahari selaras dengan momentum 4 jam, dan hanya berdagang jika arahnya selaras.
Penapisan intensiti trend meningkat: memperkenalkan penunjuk kekuatan trend seperti ADX (Indeks Arah Rata-rata), hanya membuka kedudukan apabila trend cukup kuat, untuk mengelakkan isyarat palsu trend lemah atau pasaran berlawanan arah. Kod boleh didapati diuptrenddandowntrendPenghakiman yang lebih ketara dalam keadaan.
Dinamik menyesuaikan parameter risikoBergantung kepada turun naik pasaran, kurva kepentingan hak akaun, atau indikator prestasi strategi, kadar risiko setiap perdagangan disesuaikan secara dinamik, meningkatkan risiko secara sederhana apabila strategi berfungsi dengan baik, dan mengurangkan risiko jika ia berfungsi dengan buruk.
Analisis persekitaran pasaran yang bersepadu: Memperkenalkan modul pengiktirafan persekitaran pasaran makro, seperti indeks kadar turun naik atau analisis struktur pasaran, menyesuaikan parameter strategi secara automatik atau pengaktifan pilihan mengikut peringkat pasaran yang berbeza.
Pengoptimuman mekanisme penangguhanStrategi semasa menggunakan 2.1R tetap sebagai titik berhenti pertama, dan boleh mempertimbangkan untuk menyesuaikan kedudukan berhenti secara dinamik berdasarkan rintangan sokongan atau kadar turun naik, untuk mengambil keuntungan di sekitar tahap harga kritikal.
Menambah penapis masa perdaganganMengambil kira penapis masa atau keadaan lalu lintas, mengelakkan masa-masa pergerakan rendah atau keadaan lalu lintas yang luar biasa, meningkatkan kualiti isyarat.
Pengoptimuman Pembelajaran Mesin: Menggunakan algoritma pembelajaran mesin untuk secara dinamik meramalkan kombinasi parameter yang optimum atau berat dagangan, menyesuaikan diri mengikut keadaan pasaran masa nyata.
Strategi perdagangan kuantitatif yang menggabungkan pengenalan trend, pengesahan dinamik, kawalan risiko yang tepat dan pengurusan dana pintar dalam satu sistem perdagangan lengkap. Dengan EMA, arah pasaran ditentukan secara selari, indikator dinamik RSI mengenal pasti masa masuk yang terbaik, sementara menggunakan mekanisme hentian dan keuntungan bergilir yang dinamik berdasarkan ATR, untuk mencapai keseimbangan risiko dan keuntungan yang optimum.
Kelebihan terbesar strategi ini adalah sistematik dan disiplinnya, menghilangkan gangguan emosi dalam proses perdagangan melalui peraturan kuantitatif yang jelas, sesuai untuk pedagang kuantitatif yang mengejar gaya perdagangan yang mantap. Pada masa yang sama, modul pengurusan risiko strategi ini memastikan kerugian tunggal terhad dan potensi keuntungan tidak terhad, sesuai dengan prinsip teras perdagangan yang berjaya.
Walaupun terdapat beberapa batasan yang wujud, seperti keterlambatan penilaian trend dan ketidakupayaan pasaran yang tidak sesuai, arah pengoptimuman yang dikemukakan di atas, seperti analisis kitaran masa yang banyak, penapisan kekuatan trend dan penyesuaian risiko dinamik, dapat meningkatkan lagi strategi yang kuat dan beradaptasi. Arah pembangunan masa depan harus memberi tumpuan kepada peningkatan kemampuan beradaptasi strategi, yang membolehkan ia mengekalkan prestasi yang stabil dalam keadaan pasaran yang berbeza.
Bagi pelabur yang mencari kaedah perdagangan yang sistematik, strategi ini menyediakan kerangka asas yang kukuh yang boleh disesuaikan dan dioptimumkan lebih lanjut berdasarkan keutamaan risiko dan pemahaman pasaran individu.
/*backtest
start: 2024-06-17 00:00:00
end: 2025-06-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/
//@version=5
strategy("Crypto Swing Trading Strategy (1-5 Day)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0, calc_on_every_tick=false, calc_on_order_fills=false)
// ============================================================================
// STRATEGY INPUTS
// ============================================================================
// Trend Filter Settings
ema_fast_length = input.int(50, title="Fast EMA Length", minval=1, group="Trend Filter")
ema_slow_length = input.int(200, title="Slow EMA Length", minval=1, group="Trend Filter")
// RSI Settings
rsi_length = input.int(14, title="RSI Length", minval=1, group="Momentum")
rsi_oversold = input.int(45, title="RSI Oversold Level", minval=1, maxval=50, group="Momentum")
rsi_overbought = input.int(70, title="RSI Overbought Level", minval=50, maxval=99, group="Momentum")
// ATR Settings
atr_length = input.int(14, title="ATR Length", minval=1, group="Risk Management")
atr_stop_mult = input.float(1.5, title="ATR Stop Loss Multiplier", minval=0.1, step=0.1, group="Risk Management")
atr_trail_mult = input.float(1.0, title="ATR Trailing Stop Multiplier", minval=0.1, step=0.1, group="Risk Management")
// Risk Management
risk_per_trade = input.float(1.0, title="Risk Per Trade (%)", minval=0.1, maxval=5.0, step=0.1, group="Risk Management")
reward_ratio = input.float(2.1, title="Initial Take Profit Ratio (R:R)", minval=1.0, step=0.1, group="Risk Management")
// Strategy Settings
pullback_distance = input.float(1.0, title="Max Distance from 50 EMA for Pullback (ATR)", minval=0.1, step=0.1, group="Entry Conditions")
enable_shorts = input.bool(true, title="Enable Short Trades", group="Strategy Settings")
enable_longs = input.bool(true, title="Enable Long Trades", group="Strategy Settings")
// ============================================================================
// INDICATOR CALCULATIONS
// ============================================================================
// Moving Averages
ema_fast = ta.ema(close, ema_fast_length)
ema_slow = ta.ema(close, ema_slow_length)
// RSI
rsi = ta.rsi(close, rsi_length)
// ATR
atr = ta.atr(atr_length)
// ============================================================================
// TREND IDENTIFICATION
// ============================================================================
// Primary trend based on EMA relationship
uptrend = ema_fast > ema_slow
downtrend = ema_fast < ema_slow
// ============================================================================
// ENTRY CONDITIONS
// ============================================================================
// Long Entry Conditions
long_trend_ok = uptrend and enable_longs
long_pullback = math.abs(close - ema_fast) <= (pullback_distance * atr) and close < ema_fast[1]
long_rsi_oversold = rsi[1] < rsi_oversold
long_rsi_recovery = rsi > rsi_oversold and rsi[1] <= rsi_oversold
long_entry_condition = long_trend_ok and long_pullback and long_rsi_oversold and long_rsi_recovery
// Short Entry Conditions
short_trend_ok = downtrend and enable_shorts
short_pullback = math.abs(close - ema_fast) <= (pullback_distance * atr) and close > ema_fast[1]
short_rsi_overbought = rsi[1] > rsi_overbought
short_rsi_decline = rsi < rsi_overbought and rsi[1] >= rsi_overbought
short_entry_condition = short_trend_ok and short_pullback and short_rsi_overbought and short_rsi_decline
// ============================================================================
// POSITION SIZING
// ============================================================================
// Calculate position size based on risk per trade and ATR stop distance
calculate_position_size(entry_price, stop_price, risk_percent) =>
risk_amount = strategy.equity * (risk_percent / 100)
stop_distance = math.abs(entry_price - stop_price)
position_size = stop_distance > 0 ? risk_amount / stop_distance : 0
position_size
// ============================================================================
// STRATEGY VARIABLES
// ============================================================================
var float long_entry_price = na
var float long_stop_price = na
var float long_tp1_price = na
var float long_trail_stop = na
var bool long_tp1_hit = false
var float short_entry_price = na
var float short_stop_price = na
var float short_tp1_price = na
var float short_trail_stop = na
var bool short_tp1_hit = false
// ============================================================================
// LONG TRADE MANAGEMENT
// ============================================================================
// Long Entry
if long_entry_condition and strategy.position_size == 0
long_entry_price := close
long_stop_price := close - (atr_stop_mult * atr)
long_tp1_price := close + (reward_ratio * (close - long_stop_price))
long_trail_stop := long_stop_price
long_tp1_hit := false
// Calculate position size
pos_size = calculate_position_size(long_entry_price, long_stop_price, risk_per_trade)
strategy.entry("Long", strategy.long, qty=pos_size)
strategy.exit("Long Stop", "Long", stop=long_stop_price)
// Long TP1 Management (Take 50% profit at 2:1 R:R)
if strategy.position_size > 0 and not long_tp1_hit and high >= long_tp1_price
long_tp1_hit := true
strategy.close("Long", qty_percent=50, comment="TP1 - 50%")
// Move stop to breakeven
long_trail_stop := long_entry_price
strategy.cancel("Long Stop")
// Long Trailing Stop (for remaining 50% position)
if strategy.position_size > 0 and long_tp1_hit
// Calculate new trailing stop
highest_since_tp1 = ta.highest(high, 1)
new_trail_stop = highest_since_tp1 - (atr_trail_mult * atr)
// Only move stop up, never down
if new_trail_stop > long_trail_stop
long_trail_stop := new_trail_stop
// Exit on trailing stop or trend reversal
if close <= long_trail_stop or not uptrend
strategy.close("Long", comment=not uptrend ? "Trend Reversal" : "Trailing Stop")
// ============================================================================
// SHORT TRADE MANAGEMENT
// ============================================================================
// Short Entry
if short_entry_condition and strategy.position_size == 0
short_entry_price := close
short_stop_price := close + (atr_stop_mult * atr)
short_tp1_price := close - (reward_ratio * (short_stop_price - close))
short_trail_stop := short_stop_price
short_tp1_hit := false
// Calculate position size
pos_size = calculate_position_size(short_entry_price, short_stop_price, risk_per_trade)
strategy.entry("Short", strategy.short, qty=pos_size)
strategy.exit("Short Stop", "Short", stop=short_stop_price)
// Short TP1 Management (Take 50% profit at 2:1 R:R)
if strategy.position_size < 0 and not short_tp1_hit and low <= short_tp1_price
short_tp1_hit := true
strategy.close("Short", qty_percent=50, comment="TP1 - 50%")
// Move stop to breakeven
short_trail_stop := short_entry_price
strategy.cancel("Short Stop")
// Short Trailing Stop (for remaining 50% position)
if strategy.position_size < 0 and short_tp1_hit
// Calculate new trailing stop
lowest_since_tp1 = ta.lowest(low, 1)
new_trail_stop = lowest_since_tp1 + (atr_trail_mult * atr)
// Only move stop down, never up
if new_trail_stop < short_trail_stop
short_trail_stop := new_trail_stop
// Exit on trailing stop or trend reversal
if close >= short_trail_stop or not downtrend
strategy.close("Short", comment=not downtrend ? "Trend Reversal" : "Trailing Stop")
// ============================================================================
// PLOTTING
// ============================================================================
// Plot EMAs
plot(ema_fast, title="EMA 50", color=color.blue, linewidth=2)
plot(ema_slow, title="EMA 200", color=color.red, linewidth=2)
// Color background based on trend
bgcolor(uptrend ? color.new(color.green, 95) : downtrend ? color.new(color.red, 95) : na, title="Trend Background")
// Plot RSI levels (scaled to price for visualization)
hline(rsi_overbought, title="RSI Overbought", color=color.red, linestyle=hline.style_dashed)
hline(rsi_oversold, title="RSI Oversold", color=color.green, linestyle=hline.style_dashed)
// Plot entry signals
plotshape(long_entry_condition, title="Long Entry", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.normal)
plotshape(short_entry_condition, title="Short Entry", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.normal)
// Plot stop losses and targets for current position
plot(strategy.position_size > 0 ? long_trail_stop : na, title="Long Trailing Stop", color=color.red, style=plot.style_stepline, linewidth=2)
plot(strategy.position_size < 0 ? short_trail_stop : na, title="Short Trailing Stop", color=color.red, style=plot.style_stepline, linewidth=2)
plot(strategy.position_size > 0 and not long_tp1_hit ? long_tp1_price : na, title="Long TP1", color=color.green, style=plot.style_cross, linewidth=2)
plot(strategy.position_size < 0 and not short_tp1_hit ? short_tp1_price : na, title="Short TP1", color=color.green, style=plot.style_cross, linewidth=2)
// ============================================================================
// INFORMATION DISPLAY (Using Labels instead of Table)
// ============================================================================
// Display key information using labels on the last bar
if barstate.islast
// Create info label with key metrics
trend_text = uptrend ? "UP" : downtrend ? "DOWN" : "SIDE"
position_text = strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "NONE"
info_text = "Trend: " + trend_text + "\nRSI: " + str.tostring(math.round(rsi, 1)) + "\nATR: " + str.tostring(math.round(atr, 2)) + "\nPosition: " + position_text
label.new(bar_index, high + atr, info_text,
color=uptrend ? color.new(color.green, 80) : downtrend ? color.new(color.red, 80) : color.new(color.gray, 80),
textcolor=color.white, style=label.style_label_down, size=size.normal)
// ============================================================================
// ALERTS
// ============================================================================
// Alert conditions
alertcondition(long_entry_condition, title="Long Entry Signal", message="LONG: Swing trading signal for {{ticker}} at {{close}}")
alertcondition(short_entry_condition, title="Short Entry Signal", message="SHORT: Swing trading signal for {{ticker}} at {{close}}")
alertcondition(strategy.position_size > 0 and long_tp1_hit, title="Long TP1 Hit", message="LONG TP1: First target hit for {{ticker}} at {{close}}")
alertcondition(strategy.position_size < 0 and short_tp1_hit, title="Short TP1 Hit", message="SHORT TP1: First target hit for {{ticker}} at {{close}}")
// ============================================================================
// STRATEGY SUMMARY
// ============================================================================
// This strategy implements the full swing trading approach described in the document:
// 1. Trend filtering using 50/200 EMA (only trade with the trend)
// 2. RSI momentum for entry timing (buy oversold in uptrend, sell overbought in downtrend)
// 3. ATR-based position sizing and stop losses (volatility-adjusted risk management)
// 4. Partial profit taking at 2:1 R:R (50% of position)
// 5. Trailing stops for remaining position using ATR
// 6. Trend reversal exits (close all when trend changes)
//
// Key Features:
// - Configurable parameters for different market conditions
// - Risk management with consistent 1% risk per trade
// - Visual indicators for trend, signals, and trade management
// - Information table showing key metrics
// - Alert system for automated notifications
//
// Recommended for: BTC, ETH, XRP on daily timeframes
// Holding period: 1-5 days typical