Trend Mengikut Strategi Berdasarkan Purata Bergerak Adaptif

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

img

Ringkasan

Strategi ini menggunakan penunjuk Kaufman Adaptive Moving Average (KAMA) untuk merancang sistem perdagangan trend berikut. Ia boleh mengesan trend dengan cepat apabila mereka terbentuk dan menapis bunyi semasa pasaran yang bergolak. Pada masa yang sama, sistem ini juga mengintegrasikan Parabolic SAR (PSAR) dan Average True Range Trailing Stop sebagai mekanisme stop loss dengan keupayaan kawalan risiko yang kuat.

Logika Strategi

  • Panjang penunjuk KAMA disesuaikan secara dinamik berdasarkan turun naik pasaran baru-baru ini. Apabila perubahan harga lebih besar daripada bunyi bising baru-baru ini, tetingkap EMA menjadi lebih pendek. Apabila perubahan harga lebih kecil daripada bunyi bising baru-baru ini, tetingkap EMA menjadi lebih lama. Ini membolehkan KAMA dengan cepat mengesan trend sambil menapis bunyi bising semasa pasaran bergelombang.

  • Sistem ini terutamanya menilai arah trend berdasarkan KAMA terpantas (KAMA 1). Ia pergi lama apabila KAMA 1 menunjuk ke atas dan pergi pendek apabila KAMA 1 menunjuk ke bawah. Untuk menapis pecah palsu, penapis KAMA ditetapkan. Isyarat perdagangan hanya dihasilkan apabila perubahan di KAMA 1 melebihi satu penyimpangan standard turun naik baru-baru ini.

  • Untuk stop loss, sistem ini menyediakan tiga kaedah stop loss pilihan: pembalikan KAMA, pembalikan PSAR, dan pemberhentian trailing ATR. Pelabur boleh memilih satu atau gabungan untuk digunakan.

Analisis Kelebihan

  • Reka bentuk unik penunjuk KAMA membolehkan sistem dengan cepat menangkap trend baru, menghentikan perdagangan semasa pasaran yang bergelora, mengawal kekerapan perdagangan dengan berkesan, dan mengurangkan pergeseran dan kos komisen yang tidak perlu.

  • Sistem ini mempunyai pelbagai mekanisme stop loss terbina dalam. Pelabur boleh memilih skim stop loss yang sesuai mengikut pilihan risiko peribadi mereka untuk mengawal kerugian tunggal dengan berkesan.

  • Sistem ini sepenuhnya berasaskan penunjuk dan garis stop loss, mengelakkan masalah salah masuk biasa yang disebabkan oleh pertukaran transaksi.

  • Pelbagai tetapan parameter dan kombinasi keadaan menyediakan ruang yang besar untuk penyesuaian sistem. Pengguna boleh mengoptimumkan mengikut produk dan frekuensi yang berbeza.

Analisis Risiko

  • Sistem ini tidak mengambil kira risiko sistemik dan tidak dapat mengawal kerugian dengan berkesan dalam keadaan pasaran yang melampau.

  • Parameter sistem mungkin perlu diselaraskan mengikut produk dan kekerapan yang berbeza, jika tidak ia akan menghasilkan hasil yang terlalu agresif atau terlalu konservatif.

  • Jika hanya bergantung kepada penunjuk KAMA untuk menghentikan kerugian, mudah untuk terperangkap dalam whipsaws semasa pasaran yang bergolak. Ini perlu digabungkan dengan PSAR atau ATR trailing stop untuk menyelesaikan.

Arahan pengoptimuman

  • Tambah penapis trend seperti ADX atau turun naik tersirat untuk mengelakkan penjanaan isyarat yang salah semasa peringkat bergolak dan peralihan trend.

  • Mengoptimumkan dan backtest PARAMETER untuk produk individu dan frekuensi tetap untuk meningkatkan kestabilan. dimensi pengoptimuman termasuk kombinasi parameter KAMA, parameter stop loss, dll

  • Cuba model pembelajaran mesin dan bukannya pengoptimuman parameter. Latih rangkaian saraf atau model pokok keputusan dengan banyak data sejarah untuk menilai masa masuk dan keluar dan hentikan kerugian.

  • Cuba memindahkan strategi ke produk lain seperti cryptocurrency. Ini mungkin memerlukan penyesuaian PARAMETERS atau penambahan penunjuk tambahan lain.

Ringkasan

Strategi ini mengintegrasikan KAMA untuk penilaian trend dan pelbagai kaedah stop loss untuk mengesan arah trend dengan berkesan dan mengawal risiko. Keunikan penunjuk KAMA membolehkan strategi untuk menentukan arah trend yang muncul dengan cepat dan mengelakkan masalah pecah palsu. PARAMETER yang boleh disesuaikan dan dioptimumkan memberikan pengguna ruang yang besar untuk penyesuaian peribadi. Dengan mengoptimumkan PARAMETER dan mengintegrasikan model MACHINE LEARNING untuk produk dan frekuensi individu, prestasi strategi dapat ditingkatkan lagi.


/*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 lanjut