Sumber daya yang dimuat... Pemuatan...

Multi-EMA Trend Following Strategy dengan Filter Volatilitas Dinamis

Penulis:ChaoZhang, Tanggal: 2025-01-17 15:00:37
Tag:EMATRATR

 Multi-EMA Trend Following Strategy with Dynamic Volatility Filter

Gambaran umum

Strategi ini adalah sistem perdagangan cerdas yang menggabungkan tren berikut dengan penyaringan volatilitas. Ini mengidentifikasi tren pasar menggunakan Exponential Moving Averages (EMA), menentukan waktu masuk melalui True Range (TR) dan filter volatilitas dinamis, dan mengelola risiko menggunakan mekanisme stop-loss / take-profit dinamis berbasis volatilitas. Strategi ini mendukung dua mode perdagangan: Scalp dan Swing, yang dapat beralih secara fleksibel berdasarkan lingkungan pasar dan gaya perdagangan yang berbeda.

Prinsip Strategi

Logika inti mencakup komponen kunci berikut: 1. Identifikasi Tren: Menggunakan EMA 50 periode sebagai filter tren, hanya mengambil posisi panjang di atas EMA dan posisi pendek di bawah EMA. 2. Volatility Filtering: Menghitung EMA True Range (TR) dan menggunakan koefisien filter yang dapat disesuaikan (default 1.5) untuk menyaring kebisingan pasar. 3. Ketentuan Masuk: Menggabungkan analisis tiga lilin berturut-turut, yang membutuhkan pergerakan harga untuk menunjukkan karakteristik kontinuitas dan akselerasi. Stop-Loss/Take-Profit: ditetapkan berdasarkan TR saat ini dalam mode scalp dan berdasarkan puncak/rendah sebelumnya dalam mode swing, mencapai manajemen risiko yang dinamis.

Keuntungan Strategi

  1. Kemampuan Beradaptasi yang Kuat: Beradaptasi dengan lingkungan pasar yang berbeda melalui kombinasi penyaringan volatilitas dinamis dan mengikuti tren.
  2. Manajemen Risiko yang Komprehensif: Menyediakan mekanisme stop-loss/take-profit yang dinamis untuk kedua mode perdagangan, memungkinkan pilihan yang fleksibel berdasarkan karakteristik pasar.
  3. Peraturan Parameter yang Baik: Parameter kunci seperti koefisien filter dan periode tren dapat dioptimalkan sesuai dengan karakteristik instrumen perdagangan.
  4. Visualisasi yang sangat baik: Menyediakan penanda sinyal beli / jual yang jelas dan tampilan tingkat stop-loss / take-profit untuk pemantauan perdagangan yang mudah.

Risiko Strategi

  1. Risiko Pembalikan Tren: Mungkin mengalami berhenti berturut-turut pada titik perubahan tren.
  2. Risiko pecah palsu: Dapat memicu sinyal palsu selama peningkatan volatilitas tiba-tiba.
  3. Sensitivitas Parameter: Pengaturan koefisien filter yang tidak benar dapat menyebabkan terlalu banyak atau terlalu sedikit sinyal.
  4. Dampak slippage: Mungkin menghadapi slippage yang signifikan di pasar cepat, mempengaruhi kinerja strategi.

Arah Optimasi Strategi

  1. Tambahkan Filter Kekuatan Tren: Dapat memperkenalkan indikator seperti ADX untuk mengevaluasi kekuatan tren dan meningkatkan efektivitas tren.
  2. Mengoptimalkan Stop-Loss / Take-Profit: Dapat mempertimbangkan untuk memperkenalkan trailing stop untuk melindungi lebih banyak keuntungan.
  3. Meningkatkan Mode Swing: Dapat menambahkan lebih banyak kondisi khusus perdagangan swing untuk meningkatkan kapasitas kepemilikan jangka menengah hingga panjang.
  4. Tambahkan Analisis Volume: Gabungkan perubahan volume untuk mengkonfirmasi validitas breakout.

Ringkasan

Strategi ini membangun sistem perdagangan yang lengkap dengan menggabungkan secara organik mengikuti tren, penyaringan volatilitas, dan manajemen risiko dinamis. Kekuatannya terletak pada kemampuan beradaptasi, risiko yang dapat dikontrol, sambil memberikan potensi optimasi yang signifikan. Melalui pengaturan parameter yang tepat dan pemilihan mode perdagangan yang tepat, strategi dapat mempertahankan kinerja yang stabil di lingkungan pasar yang berbeda. Pedagang disarankan untuk melakukan backtesting menyeluruh dan optimasi parameter sebelum perdagangan langsung, dan melakukan penyesuaian yang sesuai berdasarkan karakteristik instrumen perdagangan tertentu.


/*backtest
start: 2024-12-17 00:00:00
end: 2025-01-15 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

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

//@version=5
strategy("Scalp Slayer (I)", overlay=true)

// Input Parameters
filterNumber = input.float(1.5, "Filter Number", minval=1.0, maxval=10.0, tooltip="Higher = More aggressive Filter, Lower = Less aggressive")
emaTrendPeriod = input.int(50, "EMA Trend Period", minval=1, tooltip="Period for the EMA used for trend filtering")
lookbackPeriod = input.int(20, "Lookback Period for Highs/Lows", minval=1, tooltip="Period for determining recent highs/lows")
colorTP = input.color(title='Take Profit Color', defval=color.orange)
colorSL = input.color(title='Stop Loss Color', defval=color.red)

// Inputs for visibility
showBuyLabels = input.bool(true, title="Show Buy Labels")
showSellLabels = input.bool(true, title="Show Sell Labels")

// Alert Options
alertOnCondition = input.bool(true, title="Alert on Condition Met", tooltip="Enable to alert when condition is met")

// Trade Mode Toggle
tradeMode = input.bool(false, title="Trade Mode (ON = Swing, OFF = Scalp)", tooltip="Swing-mode you can use your own TP/SL.")

// Calculations
tr = high - low
ema = filterNumber * ta.ema(tr, 50)
trendEma = ta.ema(close, emaTrendPeriod)  // Calculate the EMA for the trend filter

// Highest and lowest high/low within lookback period for swing logic
swingHigh = ta.highest(high, lookbackPeriod)
swingLow = ta.lowest(low, lookbackPeriod)

// Variables to track the entry prices and SL/TP levels
var float entryPriceLong = na
var float entryPriceShort = na
var float targetPriceLong = na
var float targetPriceShort = na
var float stopLossLong = na
var float stopLossShort = na
var bool tradeActive = false

// Buy and Sell Conditions with Trend Filter
buyCondition = close > trendEma and  // Buy only if above the trend EMA
      close[2] > open[2] and close[1] > open[1] and close > open and 
      (math.abs(close[2] - open[2]) > math.abs(close[1] - open[1])) and 
      (math.abs(close - open) > math.abs(close[1] - open[1])) and 
      close > close[1] and close[1] > close[2] and tr > ema

sellCondition = close < trendEma and  // Sell only if below the trend EMA
       close[2] < open[2] and close[1] < open[1] and close < open and 
       (math.abs(close[2] - open[2]) > math.abs(close[1] - open[1])) and 
       (math.abs(close - open) > math.abs(close[1] - open[1])) and 
       close < close[1] and close[1] < close[2] and tr > ema

// Entry Rules
if (buyCondition and not tradeActive)
    entryPriceLong := close  // Track entry price for long position
    stopLossLong := tradeMode ? ta.lowest(low, lookbackPeriod) : swingLow  // Scalping: recent low, Swing: lowest low of lookback period
    targetPriceLong := tradeMode ? close + tr : swingHigh  // Scalping: close + ATR, Swing: highest high of lookback period
    tradeActive := true

if (sellCondition and not tradeActive)
    entryPriceShort := close  // Track entry price for short position
    stopLossShort := tradeMode ? ta.highest(high, lookbackPeriod) : swingHigh  // Scalping: recent high, Swing: highest high of lookback period
    targetPriceShort := tradeMode ? close - tr : swingLow  // Scalping: close - ATR, Swing: lowest low of lookback period
    tradeActive := true

// Take Profit and Stop Loss Logic
signalBuyTPPrint = (not na(entryPriceLong) and close >= targetPriceLong)
signalSellTPPrint = (not na(entryPriceShort) and close <= targetPriceShort)

signalBuySLPrint = (not na(entryPriceLong) and close <= stopLossLong)
signalSellSLPrint = (not na(entryPriceShort) and close >= stopLossShort)

if (signalBuyTPPrint or signalBuySLPrint)
    entryPriceLong := na  // Reset entry price for long position
    targetPriceLong := na  // Reset target price for long position
    stopLossLong := na  // Reset stop-loss for long position
    tradeActive := false

if (signalSellTPPrint or signalSellSLPrint)
    entryPriceShort := na  // Reset entry price for short position
    targetPriceShort := na  // Reset target price for short position
    stopLossShort := na  // Reset stop-loss for short position
    tradeActive := false

// Plot Buy and Sell Labels with Visibility Conditions
plotshape(showBuyLabels and buyCondition, "Buy", shape.labelup, location=location.belowbar, color=color.green, text="BUY", textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and sellCondition, "Sell", shape.labeldown, location=location.abovebar, color=color.red, text="SELL", textcolor=color.white, size=size.tiny)

// Plot Take Profit Flags
plotshape(showBuyLabels and signalBuyTPPrint, title="Take Profit (buys)", text="TP", style=shape.flag, location=location.abovebar, color=colorTP, textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and signalSellTPPrint, title="Take Profit (sells)", text="TP", style=shape.flag, location=location.belowbar, color=colorTP, textcolor=color.white, size=size.tiny)

// Plot Stop Loss "X" Marker
plotshape(showBuyLabels and signalBuySLPrint, title="Stop Loss (buys)", text="X", style=shape.xcross, location=location.belowbar, color=colorSL, textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and signalSellSLPrint, title="Stop Loss (sells)", text="X", style=shape.xcross, location=location.abovebar, color=colorSL, textcolor=color.white, size=size.tiny)

// Alerts

alertcondition(buyCondition and alertOnCondition, title="Buy Alert", message='{"content": "Buy {{ticker}} at {{close}}"}')
alertcondition(sellCondition and alertOnCondition, title="Sell Alert", message='{"content": "Sell {{ticker}} at {{close}}"}')
alertcondition(signalBuyTPPrint and alertOnCondition, title="Buy TP Alert", message='{"content": "Buy TP {{ticker}} at {{close}}"}')
alertcondition(signalSellTPPrint and alertOnCondition, title="Sell TP Alert", message='{"content": "Sell TP {{ticker}} at {{close}}"}')
alertcondition(signalBuySLPrint and alertOnCondition, title="Buy SL Alert", message='{"content": "Buy SL {{ticker}} at {{close}}"}')
alertcondition(signalSellSLPrint and alertOnCondition, title="Sell SL Alert", message='{"content": "Sell SL {{ticker}} at {{close}}"}')

if buyCondition
    strategy.entry("Enter Long", strategy.long)
else if sellCondition
    strategy.entry("Enter Short", strategy.short)

Berkaitan

Lebih banyak