Sumber dimuat naik... memuat...

Sistem Dagangan Pullback EMA Dual dengan Optimisasi Stop-Loss Dinamik berasaskan ATR

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

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

Ringkasan

Strategi ini adalah sistem perdagangan trend-mengikuti berdasarkan dua EMA dan ATR stop-loss dinamik. Ia menggunakan 38-period dan 62-period Exponential Moving Averages (EMA) untuk mengenal pasti trend pasaran, menentukan isyarat kemasukan melalui persilangan harga dengan EMA pantas, dan menggabungkan penunjuk ATR untuk pengurusan stop-loss dinamik. Strategi ini menawarkan kedua-dua mod perdagangan agresif dan konservatif untuk menampung peniaga dengan pilihan risiko yang berbeza.

Prinsip Strategi

Logik teras adalah berdasarkan unsur-unsur utama berikut: 1. Penentuan Trend: Trend pasaran dikenal pasti melalui kedudukan relatif EMA 38 tempoh dan 62 tempoh. Trend menaik disahkan apabila EMA cepat berada di atas EMA perlahan, dan sebaliknya. 2. Isyarat Masuk: Isyarat panjang dihasilkan apabila harga pecah di atas EMA pantas semasa aliran menaik; isyarat pendek berlaku apabila harga pecah di bawah EMA pantas semasa aliran menurun. Pengurusan Risiko: Menggunakan sistem stop-loss dinamik berasaskan ATR yang menyesuaikan tahap berhenti apabila harga bergerak dengan baik, melindungi keuntungan sambil mengelakkan keluar awal.

Kelebihan Strategi

  1. Mengikuti Trend Superior: Sistem EMA berganda berkesan menangkap trend jangka sederhana hingga panjang sambil mengelakkan perdagangan yang kerap di pasaran yang berbeza.
  2. Kawalan Risiko Komprehensif: Menggabungkan hentian tetap dan dinamik untuk mengehadkan risiko maksimum sambil melindungi keuntungan.
  3. Kebolehsesuaian Tinggi: Menawarkan kedua-dua mod perdagangan agresif dan konservatif, dapat disesuaikan dengan keadaan pasaran dan keutamaan risiko peribadi.
  4. Pendapat Visual yang jelas: Keadaan pasaran dan isyarat perdagangan secara intuitif dipaparkan melalui bar dan anak panah berwarna.

Risiko Strategi

  1. Risiko Pembalikan Trend: Boleh mengalami hentian berturut-turut pada titik pembalikan trend. Perdagangan harus terhad kepada tempoh trend yang jelas.
  2. Risiko tergelincir: Harga pelaksanaan sebenar boleh menyimpang dengan ketara dari harga isyarat semasa turun naik yang tinggi. Julat stop-loss harus diperluaskan dengan sewajarnya.
  3. Sensitiviti Parameter: Prestasi strategi sangat dipengaruhi oleh tempoh EMA dan pemilihan pengganda ATR. Pengoptimuman untuk keadaan pasaran yang berbeza diperlukan.

Arahan Pengoptimuman Strategi

  1. Tambah Penapis Kekuatan Trend: Sertakan penunjuk kekuatan trend seperti ADX untuk dimasukkan hanya semasa trend yang jelas.
  2. Mengoptimumkan Mekanisme Stop-Loss: Sesuaikan pengganda ATR secara dinamik berdasarkan turun naik untuk berhenti yang lebih adaptif.
  3. Sertakan Pengesahan Volume: Tingkatkan kebolehpercayaan isyarat dengan menggabungkan analisis jumlah di titik masuk.
  4. Klasifikasi persekitaran pasaran: Sesuaikan parameter strategi secara dinamik berdasarkan keadaan pasaran yang berbeza (trend/range).

Ringkasan

Strategi ini membina sistem perdagangan trend-mengikut yang lengkap dengan menggabungkan sistem EMA berganda klasik dengan teknik stop-loss dinamik moden. Kekuatannya terletak pada kawalan risiko yang komprehensif dan kemampuan beradaptasi yang tinggi, walaupun peniaga masih perlu mengoptimumkan parameter dan menguruskan risiko mengikut keadaan pasaran tertentu. Melalui arah pengoptimuman yang dicadangkan, kestabilan dan keuntungan strategi dapat ditingkatkan lagi.


/*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 lanjut