Strategi Tren Momentum ADX

Penulis:ChaoZhangTanggal: 2024-01-16 15:57:17
Tag:

img

Gambaran umum

Strategi ini menggunakan indikator ADX untuk menentukan tren pasar, dikombinasikan dengan indikator DMI untuk menentukan arah, menggunakan kemiringan ADX untuk mengukur kekuatan tren, menetapkan tingkat kunci ADX untuk menyaring pasar non-trending, dan menggunakan moving average untuk menyaring sinyal perdagangan.

Logika Strategi

  1. Menghitung indikator ADX, DI+, dan DI-.
  2. Kemiringan ADX > 0 menunjukkan tren meningkat; tingkat kunci ditetapkan menjadi 23 untuk menyaring pasar non-trend.
  3. DI+ di atas DI- menandakan momentum bullish mengatasi momentum bearish, memberikan sinyal beli.
  4. Ketika filter rata-rata bergerak diaktifkan, hanya menghasilkan sinyal beli ketika close berada di atas rata-rata bergerak.
  5. Tutup posisi ketika kemiringan ADX < 0, menunjukkan tren memudar.

Analisis Keuntungan

  1. Filter MA mengurangi perdagangan kebisingan di pasar non-trending.
  2. Kemiringan ADX secara akurat menentukan kekuatan tren.
  3. DI menunjukkan arah dikombinasikan dengan ADX untuk kekuatan membentuk sistem perdagangan tren yang kuat.
  4. Harapkan penarikan yang lebih rendah dan faktor keuntungan yang lebih tinggi daripada strategi MA sederhana.

Analisis Risiko

  1. Hasil ADX bervariasi secara signifikan dengan parameter input yang berbeda.
  2. DMI dapat memberikan sinyal palsu sebelum arah ditentukan dengan jelas.
  3. Ada beberapa keterlambatan, mengurangi efisiensi strategi.

Arahan Optimasi

  1. Optimalkan parameter ADX untuk hasil terbaik.
  2. Tambahkan stop loss untuk membatasi kerugian pada perdagangan tunggal.
  3. Cobalah menggabungkan indikator lain untuk menyaring sinyal, misalnya RSI, Bollinger Bands.

Ringkasan

Strategi ini sepenuhnya memanfaatkan kekuatan ADX dalam menentukan tren dan momentum, dikombinasikan dengan DMI untuk analisis arah, membentuk sistem trend berikut yang lengkap. Filter MA secara efektif mengurangi kebisingan. Peraturan parameter lebih lanjut dan kombinasi indikator dapat meningkatkan ketahanan dan efisiensi. Singkatnya, dengan menggabungkan analisis tren, momentum dan arah, strategi ini berpotensi untuk mencapai pengembalian yang kuat.


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

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh with inspiration from @9e52f12edd034d28bdd5544e7ff92e 
//The intent behind this study is to look at ADX when it has an increasing slope and is above a user-defined key level (23 default). 
//This is to identify when it is trending.
//It then looks at the DMI levels.  If D+ is above D- and the ADX is sloping upwards and above the key level, it triggers a buy condition.  Opposite for short.
//Can use a user-defined moving average to filter long/short if desried.
// NOTE: THIS IS MEANT TO BE USED IN CONJUNCTION WITH MY "ATX TRIGGER" INDICATOR FOR VISUALIZATION. MAKE SURE SETTINGS ARE THE SAME FOR BOTH.

strategy("ADX | DMI Trend", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.04)

// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
// ADX Info
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(23, title="Keylevel for ADX")
adxLookback = input(3, title="Lookback Period for Slope")

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 200, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
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 = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    close

// == USE BUILT-IN DMI FUNCTION TO DETERMINE ADX AND BULL/BEAR STRENGTH
[diplus, diminus, adx] = dmi(dilen, adxlen)

buySignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus > diminus  and close >= maFilterCheck
// buySignalValue = valuewhen(buySignal, close, 0)
shortSignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus < diminus  and close <= maFilterCheck
// shortSignalValue = valuewhen(shortSignal, close, 0)
sellCoverSignal = adx[0]-adx[adxLookback] < 0

// == ENTRY & EXIT CRITERIA
// Triggers to be TRUE for it to fire of the BUY Signal : (opposite for the SELL signal).
// (1): Price is over the 200 EMA line. (EMA level configurable by the user)
// (2): "D+" is OVER the "D-" line
// (3): RSI 7 is under 30 (for SELL, RSI 7 is over 70)
// 1* = The ultimate is to have a combination line of 3 EMA values, EMA 14, EMA 50 and EMA 200 - And if price is over this "combo" line, then it's a strong signal

// == STRATEGY ENTRIES/EXITS == 
strategy.entry("Long", strategy.long, when = buySignal)
strategy.close("Long", when = sellCoverSignal)
strategy.entry("Short", strategy.short, when = shortSignal)
strategy.close("Short", when = sellCoverSignal)
    
// == ALERTS == 
// alertcondition(buySignal, title='ADX Trigger Buy', message='ADX Trigger Buy')
// alertcondition(sellSignal, title='ADX Trigger Sell', message='ADX Trigger Sell')

Lebih banyak