Strategi Momentum Berdasarkan DEMA dan EMA Crossover dengan Penapis Volatiliti ATR

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

img

I. Ringkasan Strategi

Strategi ini dinamakan Momentum Strategy Based on DEMA and EMA Crossover with ATR Volatility Filter. Ia menghasilkan isyarat perdagangan jangka pendek dengan mengesan crossover DEMA dan EMA digabungkan dengan indeks turun naik ATR. Apabila DEMA melintasi di bawah EMA sementara ATR naik, ia memendekkan keselamatan. Apabila DEMA melintasi semula di atas EMA, ia menutup kedudukan.

II. Logik Strategi

  1. Mengira penunjuk DEMA. DEMA adalah purata bergerak eksponensial berganda menggunakan EMA berganda, yang boleh menapis bunyi pasaran jangka pendek dan meningkatkan ketepatan isyarat.

  2. Mengira penunjuk EMA. EMA adalah purata bergerak eksponen yang bertindak balas lebih cepat terhadap perubahan harga.

  3. Mengira indeks turun naik ATR. ATR mengukur turun naik pasaran dan tahap risiko. Meningkat ATR mewakili peningkatan turun naik dan kemungkinan penurunan jangka pendek yang lebih tinggi.

  4. Apabila DEMA melintasi di bawah EMA dan ATR naik di atas ambang, ia menandakan permulaan trend penurunan jangka pendek dan peningkatan risiko pasaran.

  5. Apabila DEMA melintasi semula di atas EMA, ia menandakan sokongan harga dan lompatan ke atas.

III. Kelebihan

  1. Gabungan EMA dan EMA berganda dapat meningkatkan ketepatan isyarat dengan berkesan.

  2. Penapis turun naik ATR menghapuskan perdagangan whipsaw berisiko rendah.

  3. Tempoh pemegang yang pendek sesuai dengan penjejakan momentum jangka pendek dan mengelakkan lindung nilai yang berpanjangan.

  4. Logik yang mudah dan jelas, mudah difahami dan dilaksanakan.

IV. Risiko

  1. Parameter ATR yang tidak betul boleh kehilangan peluang perdagangan.

  2. Perlu memantau kedua-dua isyarat panjang dan pendek pada masa yang sama, meningkatkan kesukaran operasi.

  3. Dipengaruhi oleh turun naik pasaran jangka pendek.

Penyelesaian: pengoptimuman parameter melalui backtesting. Sederhanakan logik untuk memberi tumpuan kepada satu sisi. Relaksasi tahap stop loss dengan sewajarnya.

V. Arahan pengoptimuman

  1. Mengoptimumkan parameter untuk DEMA dan EMA untuk mencari kombinasi terbaik.

  2. Mengoptimumkan tempoh melihat balik ATR untuk menentukan penanda aras turun naik yang optimum.

  3. Tambah penunjuk lain seperti BOLL Band untuk meningkatkan ketepatan isyarat.

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

VI. Kesimpulan

Strategi ini membina sistem perdagangan jangka pendek yang mudah namun berkesan menggunakan DEMA, persilangan EMA dan indeks turun naik ATR. Logik yang bersih dan kemudahan operasi menjadikannya sesuai untuk perdagangan momentum frekuensi tinggi.


/*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 lanjut