Sumber daya yang dimuat... Pemuatan...

EMA/SMA Trend Following dengan Swing Trading Strategy Combined Volume Filter and Percentage Take-Profit/Stop-Loss System

Penulis:ChaoZhang, Tanggal: 2024-12-11 15:12:35
Tag:EMASMA

img

Gambaran umum

Strategi ini adalah sistem perdagangan yang komprehensif yang menggabungkan mengikuti tren dengan metode perdagangan swing, memanfaatkan crossover EMA dan SMA, identifikasi swing high/low, penyaringan volume, dan mekanisme take-profit dan trailing stop-loss berbasis persentase.

Prinsip Strategi

Strategi ini menggunakan mekanisme penyaringan sinyal berlapis-lapis, dimulai dengan EMA ((10) dan SMA ((21) crossover untuk penentuan tren dasar, kemudian menggunakan 6-bar titik pivot kiri/kanan untuk waktu masuk, sementara membutuhkan volume di atas rata-rata bergerak 200 periode untuk memastikan likuiditas yang cukup. Sistem ini menggunakan 2% take profit dan 1% trailing stop-loss untuk manajemen risiko. Posisi panjang dimulai ketika harga melanggar di atas swing high dengan konfirmasi volume; posisi pendek diambil ketika harga melanggar di bawah swing low dengan konfirmasi volume.

Keuntungan Strategi

  1. Konfirmasi sinyal ganda mengurangi sinyal palsu melalui verifikasi tren, harga, dan ekspansi volume
  2. Pengelolaan laba/rugi yang fleksibel dengan menggunakan persentase berbasis take-profit dengan stop-loss trailing
  3. Sistem visualisasi yang komprehensif untuk pemantauan perdagangan dan sinyal
  4. Kemampuan penyesuaian yang tinggi dengan parameter kunci yang dapat disesuaikan
  5. Manajemen risiko sistematis melalui tingkat stop loss dan take profit yang ditetapkan sebelumnya

Risiko Strategi

  1. Potensi kegagalan palsu di pasar yang berbeda-beda
  2. Filter volume mungkin melewatkan beberapa sinyal yang valid
  3. Persentase tetap mengambil keuntungan mungkin keluar terlalu awal dalam tren yang kuat
  4. Sistem rata-rata bergerak memiliki keterlambatan yang melekat dalam pembalikan cepat
  5. Kebutuhan untuk mempertimbangkan dampak biaya perdagangan pada laba strategi

Arahan Optimasi

  1. Memperkenalkan penyesuaian volatilitas untuk penyesuaian dinamis take-profit/stop-loss
  2. Tambahkan penyaringan kekuatan tren untuk menghindari perdagangan dalam tren yang lemah
  3. Mengoptimalkan algoritma penyaringan volume dengan mempertimbangkan perubahan volume relatif
  4. Mengimplementasikan filter berbasis waktu untuk menghindari periode perdagangan yang tidak menguntungkan
  5. Pertimbangkan klasifikasi sistem pasar untuk adaptasi parameter

Ringkasan

Strategi ini membangun sistem perdagangan lengkap melalui moving average, price breakout, dan verifikasi volume, yang cocok untuk mengikuti tren jangka menengah hingga panjang. Kekuatannya terletak pada konfirmasi beberapa sinyal dan manajemen risiko yang komprehensif, meskipun kinerja di berbagai pasar membutuhkan perhatian. Melalui optimasi yang disarankan, terutama dalam kemampuan beradaptasi, strategi ini memiliki ruang untuk peningkatan stabilitas dan kinerja.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Strategy combining EMA/SMA Crossover, Swing High/Low, Volume Filtering, and Percentage TP & Trailing Stop
strategy("Swing High/Low Strategy with Volume, EMA/SMA Crossovers, Percentage TP and Trailing Stop", overlay=true)

// --- Inputs ---
source = close
TITLE = input(false, title='Enable Alerts & Background Color for EMA/SMA Crossovers')
turnonAlerts = input(true, title='Turn on Alerts?')
colorbars = input(true, title="Color Bars?")
turnonEMASMA = input(true, title='Turn on EMA1 & SMA2?')
backgroundcolor = input(false, title='Enable Background Color?')

// EMA/SMA Lengths
emaLength = input.int(10, minval=1, title='EMA Length')
smaLength = input.int(21, minval=1, title='SMA Length')
ema1 = ta.ema(source, emaLength)
sma2 = ta.sma(source, smaLength)

// Swing High/Low Lengths
leftBars = input.int(6, title="Left Bars for Swing High/Low", minval=1)
rightBars = input.int(6, title="Right Bars for Swing High/Low", minval=1)

// Volume MA Length
volMaLength = input.int(200, title="Volume Moving Average Length")

// Percentage Take Profit with hundredth place adjustment
takeProfitPercent = input.float(2.00, title="Take Profit Percentage (%)", minval=0.01, step=0.01) / 100

// Trailing Stop Loss Option
useTrailingStop = input.bool(true, title="Enable Trailing Stop Loss?")
trailingStopPercent = input.float(1.00, title="Trailing Stop Loss Percentage (%)", minval=0.01, step=0.01) / 100

// --- Swing High/Low Logic ---
pivotHigh(_leftBars, _rightBars) =>
    ta.pivothigh(_leftBars, _rightBars)

pivotLow(_leftBars, _rightBars) =>
    ta.pivotlow(_leftBars, _rightBars)

ph = fixnan(pivotHigh(leftBars, rightBars))
pl = fixnan(pivotLow(leftBars, rightBars))

// --- Volume Condition ---
volMa = ta.sma(volume, volMaLength)

// Declare exit conditions as 'var' so they are initialized
var bool longExitCondition = na
var bool shortExitCondition = na

// --- Long Entry Condition: Close above Swing High & Volume >= 200 MA ---
longCondition = (close > ph and volume >= volMa)
if (longCondition)
    strategy.entry("Long", strategy.long)

// --- Short Entry Condition: Close below Swing Low & Volume >= 200 MA ---
shortCondition = (close < pl and volume >= volMa)
if (shortCondition)
    strategy.entry("Short", strategy.short)

// --- Take Profit and Trailing Stop Logic ---

// For long position: Set take profit at the entry price + takeProfitPercent
longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercent)
shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercent)

// --- Long Exit Logic ---
if (useTrailingStop)
    // Trailing Stop for Long
    strategy.exit("Long Exit", "Long", stop=na, trail_offset=strategy.position_avg_price * trailingStopPercent, limit=longTakeProfitLevel)
else
    // Exit Long on Take Profit only
    strategy.exit("Long Exit", "Long", limit=longTakeProfitLevel)

// --- Short Exit Logic ---
if (useTrailingStop)
    // Trailing Stop for Short
    strategy.exit("Short Exit", "Short", stop=na, trail_offset=strategy.position_avg_price * trailingStopPercent, limit=shortTakeProfitLevel)
else
    // Exit Short on Take Profit only
    strategy.exit("Short Exit", "Short", limit=shortTakeProfitLevel)

// --- Plot Swing High/Low ---

plot(ph, style=plot.style_circles, linewidth=1, color=color.blue, offset=-rightBars, title="Swing High")
plot(ph, style=plot.style_line, linewidth=1, color=color.blue, offset=0, title="Swing High")
plot(pl, style=plot.style_circles, linewidth=1, color=color.red, offset=-rightBars, title="Swing High")
plot(pl, style=plot.style_line, linewidth=1, color=color.red, offset=0, title="Swing High")
// --- Plot EMA/SMA ---
plot(turnonEMASMA ? ema1 : na, color=color.green, title="EMA")
plot(turnonEMASMA ? sma2 : na, color=color.orange, title="SMA")

// --- Alerts ---
alertcondition(longCondition, title="Long Entry", message="Price closed above Swing High with Volume >= 200 MA")
alertcondition(shortCondition, title="Short Entry", message="Price closed below Swing Low with Volume >= 200 MA")

// --- Bar Colors for Visualization ---
barcolor(longCondition ? color.green : na, title="Long Entry Color")
barcolor(shortCondition ? color.red : na, title="Short Entry Color")
bgcolor(backgroundcolor ? (ema1 > sma2 ? color.new(color.green, 50) : color.new(color.red, 50)) : na)

Berkaitan

Lebih banyak