Sumber dimuat naik... memuat...

Multi-EMA Trend Following Strategy dengan Penapis Volatiliti Dinamik

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

 Multi-EMA Trend Following Strategy with Dynamic Volatility Filter

Ringkasan

Strategi ini adalah sistem perdagangan pintar yang menggabungkan trend berikut dengan penapisan turun naik. Ia mengenal pasti trend pasaran menggunakan Exponential Moving Averages (EMA), menentukan masa kemasukan melalui True Range (TR) dan penapisan turun naik dinamik, dan menguruskan risiko menggunakan mekanisme stop-loss / take-profit dinamik berdasarkan turun naik. Strategi ini menyokong dua mod perdagangan: Scalp dan Swing, yang boleh ditukar secara fleksibel berdasarkan persekitaran pasaran dan gaya perdagangan yang berbeza.

Prinsip Strategi

Logik teras merangkumi komponen utama berikut: 1. Pengesanan Trend: Menggunakan EMA 50 tempoh sebagai penapis trend, hanya mengambil kedudukan panjang di atas EMA dan kedudukan pendek di bawah EMA. 2. Penapisan Volatiliti: Mengira EMA Julat Benar (TR) dan menggunakan pekali penapisan yang boleh disesuaikan (default 1.5) untuk menapis bunyi pasaran. 3. Syarat kemasukan: Menggabungkan analisis tiga lilin berturut-turut, yang memerlukan pergerakan harga untuk menunjukkan ciri kesinambungan dan pecutan. 4. Stop-Loss/Take-Profit: Ditubuhkan berdasarkan TR semasa dalam mod kulit kepala dan berdasarkan tinggi/rendah sebelumnya dalam mod swing, mencapai pengurusan risiko yang dinamik.

Kelebihan Strategi

  1. Kebolehsesuaian yang kuat: Sesuaikan dengan persekitaran pasaran yang berbeza melalui gabungan penapisan turun naik dinamik dan mengikuti trend.
  2. Pengurusan Risiko yang Komprehensif: Menyediakan mekanisme stop-loss/take-profit yang dinamik untuk kedua-dua mod perdagangan, yang membolehkan pemilihan yang fleksibel berdasarkan ciri pasaran.
  3. Penyesuaian Parameter yang Baik: Parameter utama seperti pekali penapis dan tempoh trend boleh dioptimumkan mengikut ciri instrumen dagangan.
  4. Visualisasi yang sangat baik: Menyediakan penanda isyarat beli / jual yang jelas dan paparan tahap stop-loss / take-profit untuk pemantauan perdagangan yang mudah.

Risiko Strategi

  1. Risiko Pembalikan Trend: Boleh mengalami hentian berturut-turut pada titik perubahan trend.
  2. Risiko pecah palsu: Boleh mencetuskan isyarat palsu semasa peningkatan turun naik secara tiba-tiba.
  3. Sensitiviti Parameter: Tetapan pekali penapis yang tidak betul boleh menyebabkan terlalu banyak atau terlalu sedikit isyarat.
  4. Kesan Slippage: Mungkin menghadapi slippage yang ketara di pasaran pantas, yang mempengaruhi prestasi strategi.

Arahan Pengoptimuman Strategi

  1. Tambah Penapisan Kekuatan Trend: Dapat memperkenalkan penunjuk seperti ADX untuk menilai kekuatan trend dan meningkatkan keberkesanan trend.
  2. Mengoptimumkan Stop-Loss / Take-Profit: Boleh mempertimbangkan pengenalan hentian untuk melindungi lebih banyak keuntungan.
  3. Meningkatkan Mod Swing: Boleh menambah lebih banyak syarat khusus perdagangan swing untuk meningkatkan keupayaan memegang jangka sederhana hingga panjang.
  4. Tambah Analisis Volume: Gabungkan perubahan jumlah untuk mengesahkan kesahihan pecah.

Ringkasan

Strategi ini membina sistem dagangan yang lengkap dengan menggabungkan trend berikut, penapisan turun naik, dan pengurusan risiko dinamik. Kekuatannya terletak pada kemampuan beradaptasi, risiko yang boleh dikawal, sambil menyediakan potensi pengoptimuman yang signifikan. Melalui tetapan parameter yang betul dan pemilihan mod dagangan yang sesuai, strategi dapat mengekalkan prestasi yang stabil dalam persekitaran pasaran yang berbeza. Pedagang dinasihatkan untuk menjalankan pengujian balik dan pengoptimuman parameter yang menyeluruh sebelum perdagangan langsung, dan membuat penyesuaian yang sesuai berdasarkan ciri instrumen dagangan 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 lanjut