Pengesanan Trend dan Strategi Dagangan Jangka Pendek Berdasarkan Indikator ADX

Penulis:ChaoZhang, Tarikh: 2024-01-22 17:10:55
Tag:

img

Ringkasan

Strategi ini menggabungkan Super Trend, Pivot Points dan Average True Range (ATR) untuk membentuk garis stop loss dinamik, dan indikator Average Directional Movement Index (ADX) untuk menilai dan mengesan trend.

Prinsip

Super Trend digabungkan dengan Titik Pivot dan ATR stop loss menilai arah harga menembusi garis stop loss dinamik untuk menentukan arah pembukaan. Pada masa yang sama, penunjuk ADX menilai kekuatan trend dan hanya mengeluarkan isyarat perdagangan apabila trend cukup kuat.

Secara khusus, Titik Pivot pertama mendapatkan sokongan dan rintangan terkini, dan kemudian membentuk harga tengah dinamik dengan purata aritmetik dua hari sebelumnya. Kemudian ATR dikira dan dikalikan dengan faktor ATR, dan kemudian ditambah atau dikurangkan dari harga tengah dinamik untuk mendapatkan rel atas dan bawah. Apabila harga memecahkan rel atas, ia bullish. Apabila ia memecahkan rel bawah, ia bearish. Indikator ADX menilai kekuatan trend, dan hanya mengambil bahagian dalam perdagangan apabila trend cukup kuat.

Garis stop loss akan diselaraskan secara dinamik mengikut harga terkini dan nilai ATR, yang dapat mengesan trend dengan sangat baik.

Analisis Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Gunakan penunjuk Super Trend untuk mengesan arah trend untuk mengelakkan kunci keuntungan oleh pasaran berayun.

  2. Dengan bantuan penunjuk ADX untuk menilai kekuatan trend, elakkan kesilapan dalam perdagangan semasa penyatuan.

  3. Garis stop loss disesuaikan secara dinamik untuk memaksimumkan keuntungan kunci.

  4. Gabungkan RSI untuk mengelakkan overbuy dan oversell.

  5. Secara keseluruhan, tetapan parameter strategi adalah munasabah. Pilihan dframe mengambil kira kesinambungan. Tetapan mengambil keuntungan dan berhenti kerugian juga baik.

Analisis Risiko

Strategi ini juga mempunyai beberapa risiko:

  1. Indikator Super Trend dan MA boleh mengeluarkan isyarat yang bertentangan.

  2. Indikator ADX ditetapkan pada 14 kitaran, yang tidak cukup sensitif terhadap peristiwa tiba-tiba.

  3. Parameter RSI ditetapkan sebagai lalai, yang mungkin gagal sepenuhnya mengelakkan overbought dan oversold.

  4. Kesan peristiwa tiba-tiba tidak dipertimbangkan, seperti berita buruk / baik yang besar.

Penyelesaian yang sepadan:

  1. Sesuaikan kitaran MA untuk sepadan dengan penunjuk Super Trend.

  2. Cuba untuk memendekkan kitaran ADX untuk meningkatkan kepekaan terhadap peristiwa tiba-tiba.

  3. Mengoptimumkan parameter RSI untuk mencari nilai optimum.

  4. Tambah modul penapis berita untuk mengelakkan siaran berita utama.

Pengoptimuman

Strategi ini juga boleh dioptimumkan dalam aspek berikut:

  1. Tambah model pembelajaran mesin untuk menilai trend, membuat keputusan perdagangan lebih bijak.

  2. Cuba memperkenalkan penunjuk emosi alternatif dan bukannya ADX untuk menilai kekuatan trend.

  3. Meningkatkan modul stop loss adaptif untuk menjadikan stop loss lebih dinamik dan tepat.

  4. Keluarkan lebih banyak ciri dengan teknologi pembelajaran mendalam untuk mengoptimumkan keseluruhan strategi.

  5. Gunakan bahasa canggih seperti Python untuk pembangunan strategi untuk meningkatkan skalabiliti strategi.

Ringkasan

Secara keseluruhan, strategi ini sangat praktikal. Inti adalah untuk mengesan hala tuju trend dan mengambil bahagian apabila trend cukup kuat. Tetapan stop loss dan mengambil keuntungan juga sangat sesuai untuk memaksimumkan kunci keuntungan sambil mengelakkan kerugian. Sudah tentu, masih ada banyak ruang untuk pengoptimuman. Menambah pembelajaran mesin dan teknologi pembelajaran mendalam akan menjadikan strategi lebih berkesan dan dapat diperluas.


/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Bendre ADX STrend", overlay = true)

///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period")
AtrFactor=input(defval = 2, title = "ATR Factor")
AtrPd=input(defval = 21, title = "ATR Period")

StartDate = input(timestamp("1 Dec 2023"), title="Start Date")
EndDate = input(timestamp("12 Jan 2024"), title="End Date")
window()  => true

var float ph = na
var float pl = na
ph := ta.pivothigh(PPprd, PPprd)
pl :=ta.pivotlow(PPprd, PPprd)

float center = na
center := center[1]
// float lastpp = ph ? ph : pl ? pl : 0.0
float lastpp = na(ph) ? na(pl) ? na : pl : ph

if lastpp > 0
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

Up = center - (AtrFactor * ta.atr(AtrPd))
Dn = center + (AtrFactor * ta.atr(AtrPd))

var float TUp = na
var float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor ,  linewidth = 2, title = "PP SuperTrend")

bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl


///////
// ADX
//////

lenADX = 14
th = 14
TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = ta.sma(DX, lenADX)


//////
// MA
/////

lenMA = 21
srcMA = input(close, title="Source")
// offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
offsetMA = input(0, title="Offset")
outMA = ta.sma(srcMA, lenMA)

//
// RSI
//
length = input( 14 )
overSold = input( 30 )
overBought = input( 65 )
price = close
vrsi = ta.rsi(price, length)

//
// DMI - Direction Movement Index
// 
[diplus1, diminus1, adx] = ta.dmi(14, 14)

// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP 


if (buy and vrsi > overBought and adx > 19)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long, when = window())
    // strategy.close("Sell", "close Sell")

if (sell) and (strategy.position_size > 0)
    // strategy.entry("Sell", strategy.short)
    strategy.close("Buy", "Close Buy")

if(sell and vrsi < overSold and adx > 25)
    strategy.entry("Sell", strategy.short, when = window())

if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) )
    strategy.close("Sell", "close Sell")

// if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold)
//     strategy.entry("Sell", strategy.short, when = window())

// if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0  and (buy))
//     strategy.close("Sell", "close Sell")





Lebih lanjut