Strategi Momentum Berdasarkan DEMA dan EMA Crossover dengan Filter Volatilitas ATR

Penulis:ChaoZhang, Tanggal: 2024-01-08 14:14:57
Tag:

img

I. Ringkasan Strategi

Strategi ini disebut Momentum Strategy Based on DEMA and EMA Crossover with ATR Volatility Filter. Strategi ini menghasilkan sinyal perdagangan jangka pendek dengan mendeteksi crossover DEMA dan EMA dikombinasikan dengan indeks volatilitas ATR. Ketika DEMA melintasi di bawah EMA sementara ATR naik, itu memperpendek sekuritas. Ketika DEMA kembali melintasi di atas EMA, itu menutup posisi.

II. Logika Strategi

  1. Menghitung indikator DEMA. DEMA adalah Double Exponential Moving Average menggunakan dual EMA, yang dapat menyaring kebisingan pasar jangka pendek dan meningkatkan akurasi sinyal.

  2. EMA adalah rata-rata bergerak eksponensial yang bereaksi lebih cepat terhadap perubahan harga.

  3. Menghitung indeks volatilitas ATR. ATR mengukur volatilitas pasar dan tingkat risiko. Meningkatnya ATR mewakili meningkatnya volatilitas dan kemungkinan lebih tinggi dari penarikan jangka pendek.

  4. Ketika DEMA melintasi di bawah EMA dan ATR naik di atas ambang batas, itu menandakan awal penurunan jangka pendek dan peningkatan risiko pasar.

  5. Ketika DEMA kembali melintasi di atas EMA, itu menandakan dukungan harga dan bouncing ke atas.

III. Keuntungan

  1. Kombinasi dua EMA dan EMA dapat secara efektif meningkatkan akurasi sinyal.

  2. Filter volatilitas ATR menghilangkan perdagangan whipsaw berisiko rendah.

  3. Periode kepemilikan pendek cocok untuk pelacakan momentum jangka pendek dan menghindari lindung nilai yang berkepanjangan.

  4. Logika yang sederhana dan jelas, mudah dipahami dan diterapkan.

IV. Risiko

  1. Parameter ATR yang tidak tepat dapat kehilangan peluang perdagangan.

  2. Butuh untuk memantau kedua sinyal panjang dan pendek secara bersamaan, meningkatkan kesulitan operasi.

  3. Dipengaruhi oleh volatilitas pasar jangka pendek.

Solusi: Optimasi parameter melalui backtesting. Sederhanakan logika untuk fokus pada satu sisi. Relaksasi tingkat stop loss dengan tepat.

V. Arahan Optimalisasi

  1. Mengoptimalkan parameter untuk DEMA dan EMA untuk menemukan kombinasi terbaik.

  2. Mengoptimalkan periode lookback ATR untuk menentukan benchmark volatilitas optimal.

  3. Tambahkan indikator lain seperti BOLL Band untuk meningkatkan akurasi sinyal.

  4. Memperkenalkan aturan stop loss dan mengambil keuntungan untuk mengunci keuntungan yang lebih konsisten.

VI. Kesimpulan

Strategi ini membangun sistem perdagangan jangka pendek yang sederhana namun efektif menggunakan DEMA, EMA crossover dan indeks volatilitas ATR. Logika yang bersih dan kemudahan pengoperasiannya membuatnya cocok untuk perdagangan momentum frekuensi tinggi. Optimasi parameter dan logika lebih lanjut berpotensi menghasilkan kinerja yang lebih stabil.


/*backtest
start: 2023-12-08 00:00:00
end: 2024-01-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Qorbanjf

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Qorbanjf

//@version=4
strategy("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", overlay=true)

// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)

//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)

// get ATR VALUE
atr = atr(14)

//ATRP (Average True Price in precentage)

// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1)
slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1)
minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00)

// ATR Logic
// atrValue = atr(atrLookback)
// atrp = (atrValue/close)*100
// plot(atrp, color=color.white, linewidth=2, transp = 30)

atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100

// Moving Average Logic
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))


// Determine percentage of open profit
var entry = 0.0
distanceProfit = low - entry
distanceProfitPercent = distanceProfit / entry

//Determin if we have a long entry signal OR a sell position signal
profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent
shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr)
exitSignal = profitSignal and strategy.position_size !=0 and  crossover(dema1, ema1)


// === INPUT BACKTEST RANGE ===
//FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
//FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
//FromYear  = input(defval = 2017, title = "From Year", minval = 2000)
//ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
//ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
//ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

//Invert trade direction & flipping 
//tradInvert = input(defval = false, title = "invert trade direction")
//MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1)
//plots=input(false, title="Show plots?")

// Get stop loss (in pips AND percentage distance)
shortStop = highest(high, 4) - (atr * slMulti)
shortStopPercent = close - (close * slMulti)

// Save long stop & target prices (used for drawing data to the chart & deetermining profit)
var shortStopSaved = 0.0
var shortTargetSaved = 0.0
enterShort = false
if shortSignal
    shortStopSaved := slType ? shortStop : shortStopPercent
    enterShort:= true
    entry := close


// long conditions 
//enterLong = crossover(dema1, ema1) and atrp < maFilter
//exitSignal => crossunder(dema1, ema1)

//Enter trades when conditions are met
strategy.entry("short", strategy.short, when=enterShort, comment="SHORT")

//place exit orders (only executed after trades are active)
strategy.exit(id="Short exit",
 from_entry="short",
 limit=exitSignal ? close : na,
 stop=shortStopSaved,
 when=strategy.position_size > 0,
 comment="end short")
 

//short strategy
//goShort() => crossunder(dema1, ema1) and atrp > maFilter
//KillShort() => crossover(dema1, ema1) 
//strategy.entry("SHORT", strategy.short, when = goShort())
//strategy.close("COVER", when = KillShort())


Lebih banyak