Tren Mengikuti Strategi Berdasarkan Rata-rata Bergerak Adaptif

Penulis:ChaoZhang, Tanggal: 2024-01-30 16:30:20
Tag:

img

Gambaran umum

Strategi ini menggunakan indikator Kaufman Adaptive Moving Average (KAMA) untuk merancang sistem perdagangan yang mengikuti tren. Ini dapat melacak tren dengan cepat ketika mereka terbentuk dan menyaring kebisingan selama pasar bergolak. Pada saat yang sama, sistem ini juga mengintegrasikan Parabolic SAR (PSAR) dan Average True Range Trailing Stop sebagai mekanisme stop loss dengan kemampuan kontrol risiko yang kuat.

Logika Strategi

  • Panjang indikator KAMA disesuaikan secara dinamis berdasarkan volatilitas pasar baru-baru ini. Ketika perubahan harga lebih besar dari kebisingan baru-baru ini, jendela EMA menjadi lebih pendek. Ketika perubahan harga lebih kecil dari kebisingan baru-baru ini, jendela EMA menjadi lebih panjang. Hal ini memungkinkan KAMA untuk dengan cepat melacak tren sambil menyaring kebisingan selama pasar bergolak.

  • Sistem ini terutama menilai arah tren berdasarkan KAMA tercepat (KAMA 1). Ia pergi panjang ketika KAMA 1 menunjuk ke atas dan pergi pendek ketika KAMA 1 menunjuk ke bawah. Untuk menyaring istirahat palsu, filter KAMA diatur. Sinyal perdagangan hanya dihasilkan ketika perubahan KAMA 1 melebihi satu standar deviasi fluktuasi baru-baru ini.

  • Untuk stop loss, sistem menyediakan tiga metode stop loss opsional: pembalikan KAMA, pembalikan PSAR, dan trailing stop ATR. Investor dapat memilih satu atau kombinasi untuk digunakan.

Analisis Keuntungan

  • Desain unik dari indikator KAMA memungkinkan sistem untuk dengan cepat menangkap tren baru, menghentikan perdagangan selama pasar bergolak, secara efektif mengontrol frekuensi perdagangan, dan mengurangi slippage yang tidak perlu dan biaya komisi.

  • Sistem ini memiliki beberapa mekanisme stop loss yang terintegrasi. Investor dapat memilih skema stop loss yang tepat sesuai dengan preferensi risiko pribadi mereka untuk secara efektif mengendalikan kerugian tunggal.

  • Sistem ini sepenuhnya didasarkan pada indikator dan garis stop loss, menghindari masalah kesalahan masuk yang umum disebabkan oleh pergeseran transaksi.

  • Beberapa pengaturan parameter dan kombinasi kondisi memberikan ruang yang besar untuk kustomisasi sistem. Pengguna dapat mengoptimalkan sesuai dengan produk dan frekuensi yang berbeda.

Analisis Risiko

  • Sistem ini tidak mempertimbangkan risiko sistemik dan tidak dapat secara efektif mengendalikan kerugian dalam kondisi pasar yang ekstrem.

  • Sistem PARAMETERS mungkin perlu disesuaikan sesuai dengan produk dan frekuensi yang berbeda, jika tidak akan menghasilkan hasil yang terlalu agresif atau terlalu konservatif.

  • Jika hanya mengandalkan indikator KAMA untuk stop loss, mudah untuk terjebak dalam whipsaws selama pasar goyah. Ini perlu dikombinasikan dengan PSAR atau ATR trailing stop untuk memecahkan.

Arahan Optimasi

  • Tambahkan indikator penyaringan tren seperti ADX atau volatilitas tersirat untuk menghindari menghasilkan sinyal yang salah selama tahap bergolak dan transisi tren.

  • Mengoptimalkan dan backtest PARAMETER untuk produk individu dan frekuensi tetap untuk meningkatkan stabilitas. Dimensi optimasi termasuk kombinasi parameter KAMA, parameter stop loss, dll.

  • Cobalah model pembelajaran mesin alih-alih optimasi parameter. Pelajari jaringan saraf atau model pohon keputusan dengan banyak data historis untuk menilai waktu masuk dan keluar dan stop loss.

  • Cobalah untuk bermigrasi strategi ke produk lain seperti cryptocurrency. Ini mungkin memerlukan penyesuaian PARAMETERS atau penambahan indikator tambahan lainnya.

Ringkasan

Strategi ini mengintegrasikan KAMA untuk penilaian tren dan beberapa metode stop loss untuk secara efektif melacak arah tren dan mengendalikan risiko. Keunikan indikator KAMA memungkinkan strategi untuk dengan cepat menentukan arah tren yang muncul dan menghindari masalah pecah palsu. PARAMETER yang dapat disesuaikan dan dioptimalkan memberikan pengguna ruang besar untuk penyesuaian yang dipersonalisasi. Dengan mengoptimalkan PARAMETER dan mengintegrasikan model MACHINE LEARNING untuk produk dan frekuensi individu, kinerja strategi dapat ditingkatkan lebih lanjut.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © BenHampson
// @version=4
// Credit to:
// - ChuckBanger for much of the KAMA code
// - cheatcountry for the KAMA Filter code
// - millerrh for much of the ATR Stop code
// - racer8 for much of the Position Sizing code

// I have combined aspects of their work and built upon it to form a strategy I like. 
// The KAMA, with its filter, is used for entry.
// An ATR trailing stop loss, PSAR, and the KAMA can all optionally be used as exits, or you can use a combination of the three.

strategy(title="KAMA Strategy - Kaufman's Adaptive Moving Average", shorttitle="KAMA Strategy", overlay=true)

src = input(title="Source", type=input.source, defval=close)

// Exits
KAMA1SL = input(title = 'KAMA 1 Stop Loss', type = input.bool, defval = true)
ATRTSL = input(title = 'ATR Trailing Stop Loss', type = input.bool, defval = false)
PSARSL = input(title = 'PSAR Stop Loss', type = input.bool, defval = false)

// KAMA 1 (Fastest)
length1 = input(title="KAMA 1: Length", type=input.integer, defval=14)
fastLength1 = input(title="KAMA 1: Fast KAMA Length", type=input.integer, defval=2)
slowLength1 = input(title="KAMA 1: Slow KAMA Length", type=input.integer, defval=20)

length2 = input(title="KAMA 2: Length 2", type=input.integer, defval=15)
fastLength2 = input(title="KAMA 2: Fast KAMA Length", type=input.integer, defval=3)
slowLength2 = input(title="KAMA 2: Slow KAMA Length", type=input.integer, defval=22)

length3 = input(title="KAMA 3: Length 3", type=input.integer, defval=16)
fastLength3 = input(title="KAMA 3: Fast KAMA Length", type=input.integer, defval=4)
slowLength3 = input(title="KAMA 3: Slow KAMA Length", type=input.integer, defval=24)

length4 = input(title="KAMA 4: Length", type=input.integer, defval=17)
fastLength4 = input(title="KAMA 4: Fast KAMA Length", type=input.integer, defval=5)
slowLength4 = input(title="KAMA 4: Slow KAMA Length", type=input.integer, defval=26)

// KAMA 5 (Medium)
length5 = input(title="KAMA 5: Length", type=input.integer, defval=18)
fastLength5 = input(title="KAMA 5: Fast KAMA Length", type=input.integer, defval=6)
slowLength5 = input(title="KAMA 5: Slow KAMA Length", type=input.integer, defval=28)

length6 = input(title="KAMA 6: Length", type=input.integer, defval=19)
fastLength6 = input(title="KAMA 6: Fast KAMA Length", type=input.integer, defval=7)
slowLength6 = input(title="KAMA 6: Slow KAMA Length", type=input.integer, defval=30)

length7 = input(title="KAMA 7: Length", type=input.integer, defval=20)
fastLength7 = input(title="KAMA 7: Fast KAMA Length", type=input.integer, defval=8)
slowLength7 = input(title="KAMA 7: Slow KAMA Length", type=input.integer, defval=32)

// KAMA 8 (Slowest)
length8 = input(title="KAMA 8: Length", type=input.integer, defval=21)
fastLength8 = input(title="KAMA 8: Fast KAMA Length", type=input.integer, defval=9)
slowLength8 = input(title="KAMA 8: Slow KAMA Length", type=input.integer, defval=34)

// Kaufman's Adaptive Moving Average
getKAMA(src, length1, fastLength1, slowLength1) =>
    mom = abs(change(src, length1))
    volatility = sum(abs(change(src)), length1)
    
    // Efficiency Ratio
    er = volatility != 0 ? mom / volatility : 0
    
    fastAlpha = 2 / (fastLength1 + 1)
    slowAlpha = 2 / (slowLength1 + 1)
    
    // KAMA Alpha
    sc = pow((er * (fastAlpha - slowAlpha)) + slowAlpha, 2)
    
    kama = 0.0
    kama := sc * src + (1 - sc) * nz(kama[1])
    kama

kama1 = getKAMA(src, length1, fastLength1, slowLength1)
kama2 = getKAMA(src, length2, fastLength2, slowLength2)
kama3 = getKAMA(src, length3, fastLength3, slowLength3)
kama4 = getKAMA(src, length4, fastLength4, slowLength4)
kama5 = getKAMA(src, length5, fastLength5, slowLength5)
kama6 = getKAMA(src, length6, fastLength6, slowLength6)
kama7 = getKAMA(src, length7, fastLength7, slowLength7)
kama8 = getKAMA(src, length8, fastLength8, slowLength8)

//If the kama1 has increased...
kama1delta = kama1[0] - kama1[1]
kama3delta = kama3[0] - kama3[1]
kama8delta = kama8[0] - kama8[1]

// KAMA Plots
plot(kama1, title="KAMA 1", color=#e91e63, display=display.all, linewidth=2)
plot(kama2, title="KAMA 2", color=color.red, display=display.all)
plot(kama3, title="KAMA 3", color=color.red, display=display.all)
plot(kama4, title="KAMA 4", color=color.orange, display=display.all)
plot(kama5, title="KAMA 5", color=color.orange, display=display.all)
plot(kama6, title="KAMA 6", color=color.yellow, display=display.all)
plot(kama7, title="KAMA 7", color=color.yellow, display=display.all)
plot(kama8, title="KAMA 8", color=color.white, display=display.all)



//========================================= KAMA FILTER ===========================================

// Copyright (c) 2019-present, Franklin Moormann (cheatcountry)
// Moving Average Adaptive Filter [CC] script may be freely distributed under the MIT license.

entryFilter = input(title="KAMA Entry Filter", type=input.float, defval=1, minval=0.01)
exitFilter = input(title="KAMA Exit Filter", type=input.float, defval=0.5, minval=0.01)

entryMAAF = entryFilter * stdev(kama1delta, length1)
exitMAAF = exitFilter * stdev(kama1delta, length1)
srcEma = ema(src, length1)



//========================================= TRAILING ATR STOP ====================================

// The following is an adaptation of Trailing ATR Stops by @millerrh
// He based it on scripts by @garethyeo & @SimpleCryptoLife

// Inputs

atrLookback = input(defval=14,title="Trailing ATR Lookback Period",type=input.integer)
multiplier = input(defval=3,title="Trailing ATR Multiplier",type=input.float, step=0.1, minval=0.5, maxval=4)
trailMode = input(title="Trail Mode", defval="Trailing", options=["Running", "Trailing"])
trigInput = input(title="Trigger Trailing Stop On", defval="Wick", options=["Close","Wick"]) 

// Calculate ATR
atrValue = atr(atrLookback)
atrMultiplied = atrValue * multiplier

// Plot the price minus the ATR
atrLow = low - atrMultiplied

// Calculate the low trailing ATRs every time. The trailing stop loss never goes down.
// Set them to something to start with
trailAtrLow = atrLow

// If the ATR Low has gone up AND it has gone above the trail, the low trailing ATR should also go up. If the ATR Low has gone up or down, but not below the trail, the ATR trail stays where it is
trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]

// Trigger stop based on candle close or low
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na

// Determine if price is below support
supportHit = trigSupport <= trailAtrLow

// If price is below support, reset the trailing ATR
trailAtrLow := supportHit ? atrLow : trailAtrLow

// Plot Lines
plotLow = ATRTSL ? trailAtrLow : na
plot(plotLow, title="ATR Low", color=color.white, transp=50, style=plot.style_linebr, linewidth=1, display=display.all)



//====================================== PSAR STOP ==========================================

start = input(0.02, "PSAR Start")
increment = input(0.02, "PSAR Increment")
maximum = input(0.2, "PSAR Max Value")
psar = sar(start, increment, maximum)
psarPlot  = PSARSL ? psar : na
plot(psarPlot, "Parabolic SAR", style=plot.style_cross, color=#3A6CA8, display=display.all)



//========================================= ENTRY & EXITS =====================================================

// Entry
long = kama1delta > 0 and kama1delta > entryMAAF
strategy.entry("Buy", true, when = long) 

// Close
longClose = (PSARSL ? crossunder(close, psar) : na) or (KAMA1SL ? kama1delta < 0 and abs(kama1delta) > exitMAAF : na) or (ATRTSL ? supportHit : na)
strategy.close("Buy", when = longClose, comment = "Sell")

Lebih banyak