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.
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.
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")