Sumber daya yang dimuat... Pemuatan...

Sistem Trading Pullback EMA Dual dengan Optimisasi Stop-Loss Dinamis Berbasis ATR

Penulis:ChaoZhang, Tanggal: 2025-01-10 15:19:40
Tag:EMAATRSLTPMA

 Dual EMA Pullback Trading System with ATR-Based Dynamic Stop-Loss Optimization

Gambaran umum

Strategi ini adalah sistem perdagangan yang mengikuti tren berdasarkan stop-loss dinamis dual EMA dan ATR. Strategi ini menggunakan 38 periode dan 62 periode Eksponensial Moving Averages (EMA) untuk mengidentifikasi tren pasar, menentukan sinyal masuk melalui price crossovers dengan EMA cepat, dan menggabungkan indikator ATR untuk manajemen stop-loss dinamis. Strategi ini menawarkan mode perdagangan yang agresif dan konservatif untuk mengakomodasi pedagang dengan preferensi risiko yang berbeda.

Prinsip Strategi

Logika inti didasarkan pada elemen kunci berikut: 1. Penentuan Tren: Tren pasar diidentifikasi melalui posisi relatif EMA 38 periode dan 62 periode. 2. Sinyal Masuk: Sinyal panjang dihasilkan ketika harga pecah di atas EMA cepat selama tren naik; sinyal pendek terjadi ketika harga pecah di bawah EMA cepat selama tren turun. 3. Manajemen Risiko: Menggunakan sistem stop-loss dinamis berbasis ATR yang menyesuaikan tingkat stop saat harga bergerak menguntungkan, melindungi keuntungan sambil menghindari keluar dini. target stop-loss dan keuntungan persentase tetap juga diimplementasikan.

Keuntungan Strategi

  1. Superior Trend Following: Sistem EMA ganda secara efektif menangkap tren jangka menengah hingga panjang sambil menghindari perdagangan yang sering di berbagai pasar.
  2. Pengendalian Risiko Komprehensif: Menggabungkan berhenti tetap dan dinamis untuk membatasi risiko maksimal sambil melindungi keuntungan.
  3. Adaptabilitas tinggi: Menawarkan modus perdagangan agresif dan konservatif, dapat beradaptasi dengan kondisi pasar dan preferensi risiko pribadi.
  4. Umpan Balik Visual yang Jelas: Kondisi pasar dan sinyal perdagangan ditampilkan secara intuitif melalui bilah dan panah berwarna.

Risiko Strategi

  1. Risiko Pembalikan Tren: Dapat mengalami pemberhentian berturut-turut pada titik pembalikan tren. Perdagangan harus terbatas pada periode tren yang jelas.
  2. Risiko slippage: Harga eksekusi yang sebenarnya dapat menyimpang secara signifikan dari harga sinyal selama volatilitas tinggi.
  3. Sensitivitas Parameter: Kinerja strategi sangat dipengaruhi oleh periode EMA dan pemilihan multiplier ATR. Optimasi untuk kondisi pasar yang berbeda diperlukan.

Arah Optimasi Strategi

  1. Tambahkan Filter Kekuatan Tren: Gabungkan indikator kekuatan tren seperti ADX untuk masuk hanya selama tren yang jelas.
  2. Optimalkan Mekanisme Stop-Loss: Sesuaikan pengganda ATR secara dinamis berdasarkan volatilitas untuk berhenti yang lebih adaptif.
  3. Sertakan Konfirmasi Volume: Tingkatkan keandalan sinyal dengan memasukkan analisis volume di titik masuk.
  4. Klasifikasi Lingkungan Pasar: Sesuaikan secara dinamis parameter strategi berdasarkan kondisi pasar yang berbeda (trend/range).

Ringkasan

Strategi ini membangun sistem perdagangan yang mengikuti tren yang lengkap dengan menggabungkan sistem EMA ganda klasik dengan teknik stop-loss dinamis modern. Kekuatannya terletak pada kontrol risiko yang komprehensif dan kemampuan beradaptasi yang tinggi, meskipun pedagang masih perlu mengoptimalkan parameter dan mengelola risiko sesuai dengan kondisi pasar tertentu. Melalui arah optimasi yang disarankan, stabilitas dan profitabilitas strategi dapat ditingkatkan lebih lanjut.


/*backtest
start: 2024-12-10 00:00:00
end: 2025-01-08 08:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Scriptâ„¢ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © aalapsharma

//@version=5
strategy(title="CM_SlingShotSystem - Strategy", shorttitle="SlingShotSys_Enhanced_v5", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=1)

// Inputs
sae = input.bool(true, "Show Aggressive Entry Bars? (Highlight only)")
sce = input.bool(true, "Show Conservative Entry Bars? (Highlight only)")
st = input.bool(true, "Show Trend Arrows (Top/Bottom)?")
def = input.bool(false, "(Unused) Only Choose 1 - Either Conservative Entry Arrows or 'B'-'S' Letters")
pa = input.bool(true, "Show Conservative Entry Arrows?")
sl = input.bool(false, "Show 'B'-'S' Letters?")
useStopLoss = input.bool(true, "Use Stop-Loss?")
stopLossPerc = input.float(5.0, "Stop-Loss (%)", step=0.1)
useTakeProfit = input.bool(true, "Use Take-Profit?")
takeProfitPerc = input.float(20.0, "Take-Profit (%)", step=0.1)
useTrailingStop = input.bool(false, "Use ATR Trailing Stop?")
atrLength = input.int(14, "ATR Length", minval=1)
atrMult = input.float(2.0, "ATR Multiple for Trailing Stop", step=0.1)

// Calculations
emaSlow = ta.ema(close, 62)
emaFast = ta.ema(close, 38)
upTrend = emaFast >= emaSlow
downTrend = emaFast < emaSlow
pullbackUpT() => emaFast > emaSlow and close < emaFast
pullbackDnT() => emaFast < emaSlow and close > emaFast
entryUpT() => emaFast > emaSlow and close[1] < emaFast and close > emaFast
entryDnT() => emaFast < emaSlow and close[1] > emaFast and close < emaFast
entryUpTrend = entryUpT() ? 1 : 0
entryDnTrend = entryDnT() ? 1 : 0
atrValue = ta.atr(atrLength)

// Trailing Stop Logic (Improved)
var float trailStopLong = na
var float trailStopShort = na

if (strategy.position_size > 0)
    trailStopLong := math.max(close - (atrValue * atrMult), nz(trailStopLong[1], close))
    trailStopLong := strategy.position_avg_price > trailStopLong ? strategy.position_avg_price : trailStopLong
else
    trailStopLong := na

if (strategy.position_size < 0)
    trailStopShort := math.min(close + (atrValue * atrMult), nz(trailStopShort[1], close))
    trailStopShort := strategy.position_avg_price < trailStopShort ? strategy.position_avg_price : trailStopShort
else
    trailStopShort := na

// Plotting
col = emaFast > emaSlow ? color.lime : emaFast < emaSlow ? color.red : color.yellow
p1 = plot(emaSlow, "Slow MA (62)", linewidth=4, color=col)
p2 = plot(emaFast, "Fast MA (38)", linewidth=2, color=col)
fill(p1, p2, color=color.silver, transp=50)
barcolor((sae and pullbackUpT()) ? color.yellow : (sae and pullbackDnT()) ? color.yellow : na)
barcolor((sce and entryUpT()) ? color.aqua : (sce and entryDnT()) ? color.aqua : na)
plotshape(st and upTrend, title="Trend UP", style=shape.triangleup, location=location.bottom, color=color.lime)
plotshape(st and downTrend, title="Trend DOWN", style=shape.triangledown, location=location.top, color=color.red)
plotarrow((pa and entryUpTrend == 1) ? 1 : na, title="Up Entry Arrow", colorup=color.lime, maxheight=30, minheight=30)
plotarrow((pa and entryDnTrend == 1) ? -1 : na, title="Down Entry Arrow", colordown=color.red, maxheight=30, minheight=30)
plotchar(sl and entryUpTrend ? (low - ta.tr) : na, title="Buy Entry (Letter)", char='B', location=location.absolute, color=color.lime)
plotchar(sl and entryDnTrend ? (high + ta.tr) : na, title="Short Entry (Letter)", char='S', location=location.absolute, color=color.red)
plot(useTrailingStop and strategy.position_size > 0 ? trailStopLong : na, "Trailing Stop Long", color=color.green, style=plot.style_linebr)
plot(useTrailingStop and strategy.position_size < 0 ? trailStopShort : na, "Trailing Stop Short", color=color.red, style=plot.style_linebr)

// Function to calculate stop and limit prices
f_calcStops(_entryPrice, _isLong) =>
    _stopLoss = _isLong ? _entryPrice * (1.0 - stopLossPerc / 100.0) : _entryPrice * (1.0 + stopLossPerc / 100.0)
    _takeProfit = _isLong ? _entryPrice * (1.0 + takeProfitPerc / 100.0) : _entryPrice * (1.0 - takeProfitPerc / 100.0)
    [_stopLoss, _takeProfit]

// Entry and Exit Logic (Simplified using strategy.close)
if (entryUpT() and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)

if (entryDnT() and strategy.position_size == 0)
    strategy.entry("Short", strategy.short)

// Exit conditions based on Stop-loss and Take-profit
[slPrice, tpPrice] = f_calcStops(strategy.position_avg_price, strategy.position_size > 0)

if (strategy.position_size > 0)
    strategy.exit("Exit Long", "Long", stop=slPrice, limit=tpPrice, trail_price = trailStopLong, trail_offset = atrValue * atrMult)

if (strategy.position_size < 0)
    strategy.exit("Exit Short", "Short", stop=slPrice, limit=tpPrice, trail_price = trailStopShort, trail_offset = atrValue * atrMult)

// Close opposite position on new entry signal
if (entryUpT() and strategy.position_size < 0)
    strategy.close("Short", comment="Close Short on Long Signal")

if (entryDnT() and strategy.position_size > 0)
    strategy.close("Long", comment="Close Long on Short Signal")

Berkaitan

Lebih banyak