ADX Dynamic Average Trend Indicator Strategy


Tarikh penciptaan: 2024-01-15 15:32:45 Akhirnya diubah suai: 2024-01-15 15:32:45
Salin: 0 Bilangan klik: 584
1
fokus pada
1617
Pengikut

ADX Dynamic Average Trend Indicator Strategy

Gambaran keseluruhan

Strategi penunjuk trend ADX adalah strategi perdagangan kuantitatif yang menggunakan penunjuk ADX untuk menentukan kekuatan trend pasaran dan arah trend. Strategi ini menentukan sama ada terdapat trend di pasaran dengan mengira indeks arah rata-rata ((ADX) dan menentukan arah trend dengan mengira penunjuk arah positif ((DI +) dan penunjuk arah negatif ((DI -)) untuk menghasilkan isyarat beli dan jual.

Prinsip Strategi

Strategi ini mula-mula menggunakan indikator ADX untuk menentukan sama ada terdapat trend di pasaran. Apabila ADX lebih tinggi daripada nilai utama yang ditetapkan oleh pengguna (default 23), menunjukkan bahawa trend pasaran lebih kuat. Apabila nilai semasa ADX lebih tinggi daripada nilai n hari sebelum ADX (n hari yang ditetapkan oleh pengguna, default 3 hari), menunjukkan bahawa ADX sedang naik dan trend pasaran sedang terbentuk.

Kemudian strategi menggunakan DI+ dan DI- untuk menentukan arah trend pasaran. Apabila DI+ lebih tinggi daripada DI- menandakan bahawa pasaran berada dalam trend naik; apabila DI+ lebih rendah daripada DI- menandakan bahawa pasaran berada dalam trend menurun.

Akhirnya, analisis strategi menilai keadaan ADX dan DI, menghasilkan isyarat beli dan jual yang spesifik:

  1. Apabila ADX naik, lebih tinggi daripada nilai kritikal, dan DI+ lebih tinggi daripada DI-, menghasilkan isyarat beli
  2. Apabila ADX naik, lebih tinggi daripada nilai kritikal, dan DI+ lebih rendah daripada DI-, menghasilkan isyarat menjual
  3. Apabila ADX bertukar ke bawah, menghasilkan isyarat kedudukan terhad

Strategi ini juga menyediakan ciri-ciri seperti penapisan purata bergerak dan julat masa pengembalian yang disesuaikan, yang boleh dikonfigurasi mengikut keperluan.

Analisis kelebihan

Strategi penunjuk trend ADX mempunyai kelebihan berikut:

  1. Mengesan trend pasaran secara automatik untuk mengelakkan perdagangan tidak sah
  2. Mengesan arah trend pasaran secara automatik dan mengesan trend
  3. Memberi logik yang jelas untuk membeli semasa trend / melonggarkan apabila trend hilang
  4. Penapis purata bergerak yang boleh dikonfigurasi untuk mengelakkan penembusan palsu
  5. Julat masa pengesanan semula boleh dikonfigurasi untuk ujian sejarah
  6. Penunjuk dan parameter boleh disesuaikan dan boleh dioptimumkan untuk pelbagai jenis

Analisis risiko

Strategi ini mempunyai beberapa risiko:

  1. Indeks ADX tertinggal, mungkin terlepas peluang awal trend
  2. Penghakiman multifungsi bergantung kepada penunjuk DI, penunjuk DI sensitif, mungkin menghasilkan isyarat yang salah
  3. Penapisan purata bergerak mungkin terlepas peluang garis pendek
  4. Julat masa pengesanan yang tidak betul boleh menyebabkan overfit
  5. Tetapan parameter penunjuk yang tidak betul boleh menjejaskan kesan strategi

Untuk mengurangkan risiko, pertimbangkan perkara berikut:

  1. Meningkatkan parameter ADX dengan betul untuk mengurangkan ketinggalan
  2. Sesuaikan atau hapuskan penapis DI untuk mengelakkan isyarat salah
  3. Memendekkan kitaran purata bergerak dengan betul
  4. Memperluas jangka masa pengesanan semula untuk ujian sampel penuh
  5. Optimumkan parameter penunjuk untuk mencari tetapan terbaik

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Uji gabungan bersama-sama dengan pelbagai saham untuk menyebarkan risiko saham tunggal
  2. Tambah logik stop loss untuk mengawal kerugian tunggal
  3. Digabungkan dengan petunjuk lain untuk pengesahan gabungan untuk meningkatkan ketepatan isyarat
  4. Memperkenalkan algoritma pembelajaran mesin untuk menentukan isyarat jual beli
  5. Tambah modul pengoptimuman parameter automatik untuk menyesuaikan parameter dinamik

ringkaskan

Strategi penunjuk trend ADX menggunakan strategi ADX untuk menilai kewujudan trend dan DI untuk menilai arah trend, menghasilkan isyarat perdagangan apabila terdapat trend, strategi strategi jelas. Strategi ini dapat menilai trend secara automatik, menjejaki trend, dan ke tahap tertentu mengelakkan perdagangan tidak berkesan di pasaran bukan trend. Dengan pengoptimuman tertentu, strategi ini dapat menjadi alat yang kuat untuk mengukur perdagangan dalam garis panjang dan menengah.

Kod 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')