Pelacakan tren dan strategi perdagangan jangka pendek berdasarkan indikator ADX

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

img

Gambaran umum

Strategi ini menggabungkan Super Trend, Pivot Points dan Average True Range (ATR) untuk membentuk garis stop loss yang dinamis, dan indikator Average Directional Movement Index (ADX) untuk menilai dan melacak tren.

Prinsip

Super Trend dikombinasikan dengan Pivot Points dan ATR stop loss menilai arah harga menembus garis stop loss dinamis untuk menentukan arah pembukaan. Pada saat yang sama, indikator ADX menilai kekuatan tren dan hanya mengeluarkan sinyal perdagangan ketika tren cukup kuat.

Secara khusus, Pivot Points pertama mendapatkan dukungan dan resistensi terbaru, dan kemudian membentuk harga tengah dinamis dengan rata-rata aritmatika dua hari sebelumnya. Kemudian ATR dihitung dan dikalikan dengan faktor ATR, dan kemudian ditambahkan atau dikurangi dari harga tengah dinamis untuk mendapatkan rel atas dan bawah. Ketika harga menembus rel atas, itu bullish. Ketika menembus rel bawah, itu bearish. Indikator ADX menilai kekuatan tren, dan hanya berpartisipasi dalam perdagangan ketika tren cukup kuat.

Garis stop loss akan disesuaikan secara dinamis sesuai dengan harga terbaru dan nilai ATR, yang dapat melacak tren dengan sangat baik.

Analisis Keuntungan

Strategi ini memiliki keuntungan berikut:

  1. Gunakan indikator Super Trend untuk melacak arah tren yang berjalan untuk menghindari penguncian keuntungan oleh pasar yang berosilasi.

  2. Dengan bantuan indikator ADX untuk menilai kekuatan tren, hindari kesalahan dalam perdagangan selama konsolidasi.

  3. Garis stop loss diatur secara dinamis untuk memaksimalkan keuntungan lock-in.

  4. Gabungkan RSI untuk menghindari overbuy dan oversell.

  5. Secara keseluruhan, pengaturan parameter strategi wajar. Pilihan dframe mempertimbangkan kontinuitas. Pengaturan mengambil keuntungan dan stop loss juga baik.

Analisis Risiko

Strategi ini juga memiliki beberapa risiko:

  1. Indikator Super Trend dan MA dapat mengeluarkan sinyal yang bertentangan.

  2. Indikator ADX diatur untuk 14 siklus, yang tidak cukup sensitif terhadap kejadian tiba-tiba.

  3. Parameter RSI ditetapkan sebagai default, yang mungkin gagal untuk sepenuhnya menghindari overbought dan oversold.

  4. Dampak dari peristiwa tiba-tiba tidak dipertimbangkan, seperti berita buruk / baik besar.

Solusi yang sesuai:

  1. Sesuaikan siklus MA agar sesuai dengan indikator Super Trend.

  2. Cobalah untuk memperpendek siklus ADX untuk meningkatkan sensitivitas terhadap kejadian mendadak.

  3. Optimalkan parameter RSI untuk menemukan nilai optimal.

  4. Tambahkan modul filter berita untuk menghindari rilis berita utama.

Optimalisasi

Strategi ini juga dapat dioptimalkan dalam aspek berikut:

  1. Tambahkan model pembelajaran mesin untuk menilai tren, membuat keputusan perdagangan lebih cerdas.

  2. Cobalah untuk memperkenalkan indikator emosional alternatif alih-alih ADX untuk menilai kekuatan tren.

  3. Meningkatkan modul stop loss adaptif untuk membuat stop loss lebih dinamis dan akurat.

  4. Ekstrak lebih banyak fitur dengan teknologi pembelajaran mendalam untuk mengoptimalkan keseluruhan strategi.

  5. Gunakan bahasa canggih seperti Python untuk pengembangan strategi untuk meningkatkan skalabilitas strategi.

Ringkasan

Secara keseluruhan, strategi ini sangat praktis. Inti adalah untuk melacak arah trend berjalan dan berpartisipasi ketika tren cukup kuat. Pengaturan stop loss dan take profit juga sangat tepat untuk memaksimalkan penguncian keuntungan sambil menghindari kerugian. Tentu saja, masih ada banyak ruang untuk optimasi. Menambahkan teknologi pembelajaran mesin dan pembelajaran mendalam akan membuat strategi lebih efektif 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 banyak