Strategi Indikator Tren Rata-rata Dinamis ADX


Tanggal Pembuatan: 2024-01-15 15:32:45 Akhirnya memodifikasi: 2024-01-15 15:32:45
menyalin: 0 Jumlah klik: 584
1
fokus pada
1617
Pengikut

Strategi Indikator Tren Rata-rata Dinamis ADX

Ringkasan

Strategi indikator tren rata-rata dinamis ADX adalah strategi perdagangan kuantitatif yang menggunakan indikator ADX untuk menilai kekuatan tren pasar dan arah tren. Strategi ini menentukan apakah ada tren pasar dengan menghitung indeks arah rata-rata ((ADX) dan menentukan arah tren dengan menghitung indikator positif ((DI +) dan indikator negatif ((DI -), sehingga menghasilkan sinyal beli dan jual.

Prinsip Strategi

Strategi ini pertama-tama menggunakan indikator ADX untuk menentukan apakah ada tren di pasar. ADX lebih tinggi dari nilai kunci yang ditetapkan pengguna (default 23), yang berarti tren pasar lebih kuat. Ketika nilai saat ini ADX lebih tinggi dari nilai n hari sebelum ADX (default 3), yang berarti ADX naik, tren pasar sedang terbentuk.

Strategi kemudian menggunakan DI+ dan DI- untuk menentukan arah tren pasar. Ketika DI+ lebih tinggi dari DI-, pasar berada dalam tren naik; Ketika DI+ lebih rendah dari DI-, pasar berada dalam tren turun.

Akhirnya, analisis strategi menilai kondisi ADX dan DI, menghasilkan sinyal beli dan jual yang spesifik:

  1. Ketika ADX naik, lebih tinggi dari nilai kritis, dan DI+ lebih tinggi dari DI-, menghasilkan sinyal beli
  2. Ketika ADX naik, lebih tinggi dari nilai kritis, dan DI+ lebih rendah dari DI-, menghasilkan sinyal jual
  3. Ketika ADX bergeser ke bawah, menghasilkan sinyal imbang

Strategi ini juga menyediakan fitur seperti filter rata-rata bergerak dan rentang waktu pengembalian yang dapat dikonfigurasi sesuai kebutuhan.

Analisis Keunggulan

Strategi indikator tren ADX memiliki keuntungan sebagai berikut:

  1. Mengindikasikan adanya tren pasar secara otomatis dan menghindari transaksi yang tidak valid
  2. Mengindikasikan arah tren pasar secara otomatis dan melacak tren
  3. Memberikan logika yang jelas untuk membeli saat tren ada / posisi kosong saat tren hilang
  4. Filter moving average yang dapat dikonfigurasi untuk menghindari terobosan palsu
  5. Konfigurasi jangka waktu pengembalian untuk tes sejarah
  6. Indikator dan parameter dapat disesuaikan dan dapat dioptimalkan untuk varietas yang berbeda

Analisis risiko

Strategi ini juga memiliki beberapa risiko:

  1. Indeks ADX Terlambat, Mungkin Melewatkan Kesempatan di Awal Tren
  2. Penjelasan multispace bergantung pada indikator DI, indikator DI sensitif, dapat menghasilkan sinyal yang salah
  3. Filter rata-rata bergerak mungkin melewatkan peluang garis pendek
  4. Rentang waktu deteksi yang tidak tepat dapat menyebabkan overfitting
  5. Setting parameter indikator yang tidak tepat dapat mempengaruhi efek kebijakan

Untuk mengurangi risiko, pertimbangkan hal-hal berikut:

  1. Mempersingkat parameter ADX dengan tepat untuk mengurangi lag
  2. Sesuaikan atau hapus filter DI untuk mencegah sinyal yang salah
  3. Mempersingkat siklus rata-rata bergerak
  4. Perluasan jangka waktu pengamatan ulang, uji sampel penuh
  5. Optimalkan parameter indikator untuk mencari pengaturan optimal

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Bergabung dengan beberapa saham untuk melakukan pengujian portofolio, untuk menyebarkan risiko saham tunggal
  2. Menambahkan logika stop loss untuk mengendalikan kerugian tunggal
  3. Verifikasi kombinasi dengan indikator lain untuk meningkatkan akurasi sinyal
  4. Masukkan Algoritma Pembelajaran Mesin untuk Memahami Sinyal Beli dan Jual
  5. Tambahkan modul optimasi parameter otomatis untuk melakukan penyesuaian parameter secara dinamis

Meringkaskan

Strategi indikator tren rata-rata dinamis ADX menggunakan strategi ADX untuk menilai keberadaan tren dan DI untuk menilai arah tren, menghasilkan sinyal perdagangan ketika tren ada, strategi strategi jelas. Strategi ini dapat menilai tren secara otomatis, melacak tren, dan, sampai batas tertentu, menghindari perdagangan tidak efektif di pasar non-trend. Dengan beberapa pengoptimalan, strategi ini dapat menjadi alat yang kuat untuk mengukur perdagangan dalam jangka panjang.

Kode Sumber Strategi
/*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')