Strategi Tren Dinamis ADX

Penulis:ChaoZhang, Tanggal: 2024-15-15 15:32:45
Tag:

img

Gambaran umum

Strategi Tren Dinamis ADX adalah strategi perdagangan kuantitatif yang menggunakan indikator ADX untuk menentukan kekuatan dan arah tren pasar. Ini menghasilkan sinyal beli dan jual dengan menghitung Indeks Arah Rata-rata (ADX) untuk menilai apakah ada tren di pasar dan dengan menghitung Indikator Arah Positif (DI +) dan Indikator Arah Negatif (DI-) untuk menentukan arah tren.

Logika Perdagangan

Strategi ini pertama-tama menggunakan indikator ADX untuk menentukan apakah ada tren di pasar. Ketika ADX berada di atas tingkat kunci yang ditentukan oleh pengguna (default 23), itu menandakan bahwa tren pasar relatif kuat. Ketika nilai ADX saat ini lebih tinggi dari nilai ADX n hari yang lalu (n adalah periode pencarian kembali yang ditentukan oleh pengguna, default 3 hari), itu menandakan bahwa ADX meningkat dan tren terbentuk di pasar.

Strategi kemudian menggunakan DI + dan DI- untuk menentukan arah tren pasar. Ketika DI + lebih tinggi dari DI-, itu menandakan tren naik di pasar. Ketika DI + lebih rendah dari DI-, itu menandakan tren menurun di pasar.

Akhirnya, strategi ini menggabungkan analisis ADX dan DI untuk menghasilkan sinyal beli dan jual khusus:

  1. Ketika ADX naik dan berada di atas tingkat kunci dan DI + lebih tinggi dari DI-, sinyal beli dihasilkan
  2. Ketika ADX naik dan berada di atas tingkat kunci dan DI + lebih rendah dari DI-, sinyal jual dihasilkan
  3. Ketika ADX berputar untuk menurun, sinyal posisi datar dihasilkan

Strategi ini juga menyediakan fitur seperti penyaringan rata-rata bergerak dan rentang waktu backtesting yang dapat disesuaikan.

Analisis Keuntungan

Strategi Tren Dinamis ADX memiliki keuntungan berikut:

  1. Secara otomatis mendeteksi keberadaan tren pasar, menghindari perdagangan yang tidak efektif
  2. Otomatis menentukan arah tren pasar untuk tren berikut
  3. Logika yang jelas untuk membeli pada keberadaan tren dan meratakan pada hilangnya tren
  4. Filter rata-rata bergerak yang dapat dikonfigurasi menghindari pecah palsu
  5. Jangka waktu backtesting yang dapat disesuaikan untuk pengujian historis
  6. Parameter indikator yang dapat disesuaikan untuk optimalisasi di berbagai produk

Analisis Risiko

Strategi ini juga memiliki beberapa risiko:

  1. Indikator ADX memiliki efek keterlambatan, mungkin kehilangan peluang tren awal
  2. Keandalan arah tren pada DI dapat menghasilkan sinyal palsu karena DI sensitif
  3. Filter rata-rata bergerak mungkin kehilangan peluang jangka pendek
  4. Kerangka waktu backtesting yang tidak tepat dapat menyebabkan overfit
  5. Parameter indikator yang tidak tepat dapat mempengaruhi kinerja strategi

Untuk mengurangi risiko, hal berikut dapat dipertimbangkan:

  1. Memperpendek parameter ADX untuk mengurangi keterlambatan
  2. Hapus atau sesuaikan filter DI untuk mencegah sinyal palsu
  3. Singkatkan periode rata-rata bergerak
  4. Memperluas jangka waktu backtesting untuk pengujian sampel penuh
  5. Optimalkan parameter untuk menemukan pengaturan terbaik

Peluang Peningkatan

Strategi dapat ditingkatkan dari aspek berikut:

  1. Pengujian portofolio di beberapa saham untuk mendiversifikasi risiko saham tunggal
  2. Tambahkan logika stop loss ke kontrol per trade loss
  3. Gabungkan dengan indikator lain untuk verifikasi sinyal untuk meningkatkan akurasi
  4. Memperkenalkan algoritma pembelajaran mesin untuk generasi sinyal beli/jual
  5. Tambahkan modul pengaturan parameter otomatis untuk penyesuaian dinamis

Kesimpulan

ADX Dynamic Trend Strategy menggunakan ADX untuk menentukan keberadaan tren dan DI untuk arah tren. Ini menghasilkan sinyal perdagangan ketika tren ada dan meratakan posisi ketika tren menghilang. Logika jelas. Dengan mendeteksi dan melacak tren secara otomatis, perdagangan yang tidak efektif dapat dihindari sampai batas tertentu di pasar non-trending. Dengan peningkatan yang tepat, strategi ini dapat menjadi alat yang kuat untuk perdagangan kuantitatif jangka menengah hingga panjang.


/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 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