Strategi Dagangan Pivot SuperTrend yang Difilterkan ADX

Penulis:ChaoZhang, Tarikh: 2024-02-19 15:01:36
Tag:

img

Ringkasan

Strategi ini menggabungkan titik-titik pusingan SuperTrend dan penunjuk ADX untuk perdagangan frekuensi tinggi. Garis SuperTrend secara dinamik mengira tahap sokongan dan rintangan terkini untuk menentukan trend harga dan menjana isyarat perdagangan.

Logika Strategi

  1. Mengira garis sokongan dan rintangan pivot. Ambil harga penutupan dan tambah / tolak julat ATR di atas dan di bawah. Pecahan garis ini menandakan pembalikan trend.

  2. ADX menentukan kekuatan trend. Nilai ADX yang tinggi menunjukkan trend yang kuat.

  3. Gabungkan kedua-duanya untuk isyarat perdagangan. pergi panjang / pendek hanya pada rehat pivot dan ADX tinggi.

Analisis Kelebihan

Kelebihan strategi ini:

  1. Garis SuperTrend Dinamis dengan cepat mengenal pasti penembusan.

  2. Penapis ADX mengelakkan isyarat palsu semasa pasaran terhad julat.

  3. Nisbah risiko-balasan yang baik dan kawalan pengeluaran.

Analisis Risiko

Risiko strategi ini:

  1. Pergerakan jurang boleh membatalkan garis SuperTrend.

  2. Tetapan ambang ADX yang buruk memberi kesan kepada prestasi.

  3. Frekuensi perdagangan yang tinggi meningkatkan kos transaksi.

Penyelesaian:

  1. Mengoptimumkan parameter untuk membolehkan julat pecah yang lebih luas.

  2. Uji untuk nilai ADX yang lebih baik.

  3. Kurangkan kekerapan perdagangan.

Arahan pengoptimuman

Bidang yang perlu diperbaiki:

  1. Mengoptimumkan pengganda ATR untuk garis yang lebih kukuh.

  2. Uji parameter ADX yang berbeza.

  3. Tambah stop-loss untuk hadkan kerugian.

Kesimpulan

Strategi ini menggabungkan kekuatan SuperTrend dan ADX untuk mengenal pasti titik pembalikan trend yang berkemungkinan tinggi, disaring oleh ADX untuk kualiti.


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

//@version=4
strategy("STPP20 + ADX", overlay = true)

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

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period", minval = 1, maxval = 50)
AtrFactor=input(defval = 5, title = "ATR Factor", minval = 1, step = 0.1)
AtrPd=input(defval = 20, title = "ATR Period", minval=1)

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

float center = na
center := center[1]
float lastpp = ph ? ph : pl ? pl : na
if lastpp
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

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

float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? 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 = 25
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? 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 = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, lenADX)


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

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


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

if (buy)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long)


if (sell) and (strategy.position_size > 0)
    strategy.order("Sell", false, when = sell)

Lebih lanjut