
Strategi ini menggabungkan indikator super trend, titik pivot, dan garis hentian dinamik yang dibentuk oleh purata gelombang sebenar, dan indeks arah purata, untuk menilai dan mengesan trend. Strategi ini sesuai untuk perdagangan garis pendek, yang dapat menangkap lanjutan trend selepas pengumpulan cakera tengah, dan kawalan penarikan balik juga dilakukan dengan baik.
Penunjuk super trend menggabungkan titik-titik pusat dan ATR berhenti, menentukan arah harga menembusi garis berhenti dinamik untuk menentukan arah pembinaan kedudukan. Pada masa yang sama, penunjuk ADX menentukan kekuatan trend, dan hanya menghantar isyarat perdagangan apabila trend cukup kuat.
Secara khusus, titik-titik pivot pertama kali mendapat rintangan sokongan terkini, kemudian membentuk harga pertengahan dinamik dengan purata aritmetik dua hari sebelumnya. Kemudian ATR dikira dan dikalikan dengan faktor ATR, kemudian ditambah dengan harga pertengahan dinamik, untuk mendapatkan naik dan turun.
Garis Hentian akan menyesuaikan secara dinamik mengikut harga terkini dan nilai ATR, yang dapat mengesan trend dengan baik.
Strategi ini mempunyai kelebihan berikut:
Menggunakan penunjuk hypertrend untuk mengesan arah trend, mengelakkan keuntungan yang terkunci oleh pasaran yang bergolak.
Menggunakan indikator ADX untuk menilai kekuatan trend, mengelakkan perdagangan yang salah semasa penyusunan.
Pengaturan dinamik garisan hentian kerugian untuk mengunci keuntungan maksimum.
Ia juga boleh digunakan untuk menjimatkan wang.
Secara keseluruhannya, parameter strategi yang ditetapkan adalah munasabah, penentuan dframe mempertimbangkan kesinambungan, dan tetapan stop-loss juga bagus.
Strategi ini mempunyai beberapa risiko:
Penunjuk Super Trend dan penunjuk MA mungkin memberi isyarat bertentangan.
Indeks ADX ditetapkan pada 14 kitaran, kurang sensitif terhadap kejadian yang tidak dijangka.
Parameter RSI ditetapkan sebagai nilai lalai dan mungkin tidak dapat mengelakkan pembelian dan penjualan sepenuhnya.
Tidak mengambil kira kesan daripada kejadian yang tidak dijangka, seperti berita yang menguntungkan/berkesan.
Penyelesaian:
Menyesuaikan kitaran MA agar ia sepadan dengan penunjuk supertrend.
Cuba untuk memendekkan kitaran ADX dan meningkatkan sensitiviti terhadap kejadian yang tidak dijangka.
Mengoptimumkan parameter RSI untuk mencari nilai terbaik.
Untuk mengelakkan siaran berita penting, anda boleh menyertai modul penapisan berita.
Strategi ini juga boleh dioptimumkan dalam beberapa aspek:
Menambah trend penilaian model pembelajaran mesin untuk membuat keputusan perdagangan lebih bijak.
Cuba untuk memperkenalkan ADX sebagai alternatif kepada trend seperti sentimen.
Tambahan modul penangguhan yang beradaptasi untuk membuat penangguhan lebih dinamik dan tepat.
Mengambil lebih banyak ciri dan mengoptimumkan strategi keseluruhan dengan menggunakan teknologi pembelajaran mendalam.
Menggunakan bahasa canggih seperti Python untuk membangunkan strategi dan meningkatkan skalabiliti strategi.
Strategi ini sangat praktikal secara keseluruhan, terasnya adalah untuk mengesan arah trend, dan mengambil bahagian apabila trend cukup kuat. Pengaturan hentian dan hentian juga dibuat dengan baik untuk mengunci keuntungan dan mengelakkan kerugian.
/*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")