Strategi Trend Dinamik ADX

Penulis:ChaoZhang, Tarikh: 2024-01-15 15:32:45
Tag:

img

Ringkasan

Strategi Trend Dinamik ADX adalah strategi perdagangan kuantitatif yang menggunakan penunjuk ADX untuk menentukan kekuatan dan arah trend pasaran. Ia menjana isyarat beli dan jual dengan mengira Indeks Arah Purata (ADX) untuk menilai sama ada trend wujud di pasaran dan dengan mengira Penunjuk Arah Positif (DI +) dan Penunjuk Arah Negatif (DI-) untuk menentukan arah trend.

Logik Perdagangan

Strategi pertama menggunakan penunjuk ADX untuk menentukan sama ada trend wujud di pasaran. Apabila ADX berada di atas tahap utama yang ditakrifkan oleh pengguna (default 23), ia memberi isyarat bahawa trend pasaran agak kuat. Apabila nilai ADX semasa lebih tinggi daripada nilai ADX n hari yang lalu (n adalah tempoh melihat kembali yang ditakrifkan oleh pengguna, lalai 3 hari), ia memberi isyarat bahawa ADX meningkat dan trend terbentuk di pasaran.

Strategi ini kemudian menggunakan DI + dan DI- untuk menentukan arah trend pasaran. Apabila DI + lebih tinggi daripada DI-, ia menandakan trend kenaikan di pasaran. Apabila DI + lebih rendah daripada DI-, ia menandakan trend penurunan di pasaran.

Akhirnya, strategi menggabungkan analisis ADX dan DI untuk menjana isyarat beli dan jual khusus:

  1. Apabila ADX meningkat dan di atas tahap utama dan DI + lebih tinggi daripada DI-, isyarat beli dihasilkan
  2. Apabila ADX meningkat dan di atas tahap utama dan DI + adalah lebih rendah daripada DI-, isyarat jual dihasilkan
  3. Apabila ADX bertukar untuk mengurangkan, isyarat kedudukan rata dihasilkan

Strategi ini juga menyediakan ciri-ciri seperti penapisan purata bergerak dan julat masa backtesting yang boleh disesuaikan.

Analisis Kelebihan

Strategi Trend Dinamik ADX mempunyai kelebihan berikut:

  1. Mengesan secara automatik kewujudan trend pasaran, mengelakkan perdagangan yang tidak berkesan
  2. Menentukan arah trend pasaran secara automatik untuk trend berikut
  3. Logik yang jelas untuk membeli pada trend kewujudan dan rata pada trend hilang
  4. Penapisan purata bergerak yang boleh dikonfigurasikan mengelakkan pecah palsu
  5. Julat masa backtesting yang boleh disesuaikan untuk ujian sejarah
  6. Parameter penunjuk yang boleh diselaraskan untuk pengoptimuman di seluruh produk yang berbeza

Analisis Risiko

Strategi ini juga mempunyai beberapa risiko:

  1. Indikator ADX mempunyai kesan kelewatan, mungkin kehilangan peluang trend awal
  2. Kepercayaan arah trend pada DI boleh menghasilkan isyarat palsu kerana DI sensitif
  3. Penapis purata bergerak mungkin terlepas peluang jangka pendek
  4. Rangka masa backtesting yang tidak betul boleh menyebabkan overfitting
  5. Parameter penunjuk yang tidak betul boleh mempengaruhi prestasi strategi

Untuk mengurangkan risiko, perkara berikut boleh dipertimbangkan:

  1. Memendekkan parameter ADX untuk mengurangkan ketinggalan
  2. Hapuskan atau sesuaikan penapis DI untuk mengelakkan isyarat palsu
  3. Memendekkan tempoh purata bergerak
  4. Memperluas jangka masa backtesting untuk ujian sampel penuh
  5. Mengoptimumkan parameter untuk mencari tetapan terbaik

Peluang Peningkatan

Strategi ini boleh ditingkatkan dari aspek berikut:

  1. Ujian portfolio di pelbagai stok untuk mempelbagaikan risiko stok tunggal
  2. Tambah logik stop loss untuk kawalan setiap kerugian perdagangan
  3. Gabungkan dengan penunjuk lain untuk pengesahan isyarat untuk meningkatkan ketepatan
  4. Memperkenalkan algoritma pembelajaran mesin untuk penjanaan isyarat beli/jual
  5. Tambah modul penyusunan parameter automatik untuk pelarasan dinamik

Kesimpulan

ADX Dynamic Trend Strategy menggunakan ADX untuk menentukan kewujudan trend dan DI untuk arah trend. Ia menghasilkan isyarat perdagangan apabila trend wujud dan meratakan kedudukan apabila trend hilang. Logiknya jelas. Dengan mengesan dan mengesan trend secara automatik, perdagangan yang tidak berkesan dapat dielakkan hingga tahap tertentu di pasaran bukan trend. Dengan peningkatan yang betul, strategi ini boleh 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 lanjut