Strategi mengikuti tren berdasarkan indikator SMA multi-periode


Tanggal Pembuatan: 2024-02-04 14:50:24 Akhirnya memodifikasi: 2024-02-04 14:50:24
menyalin: 0 Jumlah klik: 680
1
fokus pada
1617
Pengikut

Strategi mengikuti tren berdasarkan indikator SMA multi-periode

Ringkasan

Strategi ini memungkinkan penilaian dan pelacakan tren dengan menggunakan kombinasi rata-rata SMA dari beberapa periode yang berbeda. Gagasan utamanya adalah: membandingkan arah naik dan turun dari SMA dari periode yang berbeda, menilai tren; melakukan lebih banyak ketika SMA berperiode pendek melewati SMA berperiode panjang; dan melakukan pengurangan ketika SMA berperiode pendek melewati SMA berperiode panjang.

Prinsip Strategi

  1. Garis rata-rata SMA menggunakan lima periode yang berbeda, yaitu 10 siklus, 20 siklus, 50 siklus, 100 siklus, dan 200 siklus.
  2. Bandingkan arah naik dan turun dari 5 garis rata-rata, untuk menentukan arah tren. Misalnya, ketika rata-rata SMA 10 siklus, 20 siklus, 100 siklus dan 200 siklus naik secara bersamaan, untuk menentukan tren naik; ketika rata-rata rata-rata turun secara bersamaan, untuk menentukan tren turun.
  3. Membandingkan nilai SMA periode yang berbeda, membentuk sinyal perdagangan. Misalnya, ketika 10 siklus SMA melakukan lebih ketika melewati 20 siklus SMA, membentuk sinyal masuk; Ketika 10 siklus SMA di bawah melewati 20 siklus SMA, membuat ruang, membentuk sinyal masuk.
  4. Menggunakan ZeroLagEMA sebagai sinyal konfirmasi masuk dan keluar. Bila siklus cepat ZeroLagEMA melakukan lebih banyak saat melewati siklus lambat; Bila memakai lebih banyak posisi. Cara penilaian sinyal kosong adalah sebaliknya.

Keunggulan Strategis

  1. Menggunakan berbagai kombinasi rata-rata SMA untuk periode yang berbeda, Anda dapat secara efektif menilai arah tren pasar.
  2. Perbandingan nilai SMA berkala dapat menghasilkan sinyal perdagangan, membentuk aturan masuk dan keluar kuantitatif.
  3. Zero LagEMA filter dapat menghindari transaksi yang tidak perlu dan meningkatkan stabilitas strategi.
  4. Menggabungkan penilaian tren dan sinyal perdagangan, memungkinkan pelacakan tren dalam perdagangan.

Risiko Strategis dan Solusi

  1. Ketika pasar memasuki fase penyusunan getaran, sinyal rata-rata SMA mungkin sering berselisih, membawa lebih banyak risiko perdagangan yang tidak valid dan kerugian.
    • Solusi: Tingkatkan parameter filter ZeroLagEMA untuk menghindari masuknya sinyal yang tidak valid.
  2. Karena merujuk pada SMA yang memiliki lebih banyak siklus, sinyal dianggap memiliki keterlambatan dan tidak dapat bereaksi tepat waktu terhadap perubahan harga yang drastis dalam jangka pendek.
    • Solusi: Menggabungkan indikator yang lebih sensitif seperti MACD dan lain-lain untuk membantu penilaian.

Arah optimasi strategi

  1. Optimalkan parameter siklus SMA untuk menemukan kombinasi parameter optimal.
  2. Menambahkan strategi stop loss, seperti pelacakan stop loss, untuk lebih mengontrol kerugian tunggal.
  3. Menambahkan mekanisme manajemen posisi yang memungkinkan strategi untuk meningkatkan posisi saat tren kuat dan mengurangi posisi saat goyah.
  4. Dengan lebih banyak penilaian indikator tambahan, seperti MACD, KDJ, dan lain-lain, meningkatkan stabilitas keseluruhan strategi.

Meringkaskan

Strategi ini melalui kombinasi beberapa siklus SMA rata-rata, mencapai penilaian yang efektif terhadap arah tren pasar, dan menghasilkan sinyal perdagangan kuantitatif. Pada saat yang sama, aplikasi ZeroLagEMA meningkatkan keberhasilan strategi.

Kode Sumber Strategi
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Forex MA Racer - SMA Performance /w ZeroLag EMA Trigger", shorttitle = "FX MA Racer (5x SMA, 2x zlEMA)", overlay=false )

// === INPUTS ===
hr0             = input(defval = true, title = "=== SERIES INPUTS ===")
smaSource       = input(defval = close, title = "SMA Source")
sma1Length      = input(defval = 10, title = "SMA 1 Length")
sma2Length      = input(defval = 20, title = "SMA 2 Length")
sma3Length      = input(defval = 50, title = "SMA 3 Length")
sma4Length      = input(defval = 100, title = "SMA 4 Length")
sma5Length      = input(defval = 200, title = "SMA 5 Length")
smaDirSpan      = input(defval = 4, title = "SMA Direction Span")
zlmaSource      = input(defval = close, title = "ZeroLag EMA Source")
zlmaFastLength  = input(defval = 9, title = "ZeroLag EMA Fast Length")
zlmaSlowLength  = input(defval = 21, title = "ZeroLag EMA Slow Length")
hr1             = input(defval = true, title = "=== PLOT TIME LIMITER ===")
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth      = input(defval = 02, title = "Start From Month", minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day", minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour", minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute", minval = 0,step = 1)
hr2             = input(defval = true, title = "=== TRAILING STOP ===")
useStop     = input(defval = false, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === SERIES SETUP ===
// Fast ZeroLag EMA
zema1=ema(zlmaSource, zlmaFastLength)
zema2=ema(zema1, zlmaFastLength)
d1=zema1-zema2
zlemaFast=zema1+d1

// Slow ZeroLag EMA
zema3=ema(zlmaSource, zlmaSlowLength)
zema4=ema(zema3, zlmaSlowLength)
d2=zema3-zema4
zlemaSlow=zema3+d2

// Simple Moving Averages
period10 = sma(close, sma1Length)
period20 = sma(close, sma2Length)
period50 = sma(close, sma3Length)
period100 = sma(close, sma4Length)
period200 = sma(close, sma5Length)
// === /SERIES SETUP ===

// === PLOT ===
// colors of plotted MAs
p1 = (close < period10) ? #FF0000 : #00FF00
p2 = (close < period20) ? #FF0000 : #00FF00
p3 = (close < period50) ? #FF0000 : #00FF00
p4 = (close < period100) ? #FF0000 : #00FF00
p5 = (close < period200) ? #FF0000 : #00FF00

plot(period10, title='10 Period', color = p1, linewidth=1)
plot(period20, title='20 Period', color = p2, linewidth=2)
plot(period50, title='50 Period', color = p3, linewidth=4)
plot(period100, title='100 Period', color = p4, linewidth=6)
plot(period200, title='200 Period', color = p5, linewidth=10)
// === /PLOT ===

//BFR = BRFIB ? (maFast+maSlow)/2 : abs(maFast - maSlow)

// === STRATEGY ===
// calculate SMA directions
direction10 = rising(period10, smaDirSpan) ? +1 : falling(period10, smaDirSpan) ? -1 : 0
direction20 = rising(period20, smaDirSpan) ? +1 : falling(period20, smaDirSpan) ? -1 : 0
direction50 = rising(period50, smaDirSpan) ? +1 : falling(period50, smaDirSpan) ? -1 : 0
direction100 = rising(period100, smaDirSpan) ? +1 : falling(period100, smaDirSpan) ? -1 : 0
direction200 = rising(period200, smaDirSpan) ? +1 : falling(period200, smaDirSpan) ? -1 : 0

// conditions
// SMA Direction Trigger
dirUp = direction10 > 0 and direction20 > 0 and direction100 > 0 and direction200 > 0
dirDn = direction10 < 0 and direction20 < 0 and direction100 < 0 and direction200 < 0

longCond = (period10>period20) and (period20>period50) and (period50>period100) and  dirUp//and (close > period10) and (period50>period100) //and (period100>period200)
shortCond = (period10<period20) and (period20<period50) and dirDn//and (period50<period100) and (period100>period200)

longExit = crossunder(zlemaFast, zlemaSlow) or crossunder(period10, period20)
shortExit = crossover(zlemaFast, zlemaSlow) or crossover(period10, period20)


// entries and exits
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit


if( true )
    // entries
    strategy.entry("long", strategy.long, when = longCond)
    strategy.entry("short", strategy.short, when = shortCond)

        
    // trailing stop
    if (useStop)
        strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
        strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)

    // exits
    strategy.close("long", when = longExit)
    strategy.close("short", when = shortExit)
// === /STRATEGY ===