Dinamis Self-Adaptive Kaufman Moving Rata-rata Trend Pelacakan Strategi

Penulis:ChaoZhang, Tanggal: 2024-02-26 16:36:30
Tag:

img

Gambaran umum

Strategi ini dirancang berdasarkan Kaufman Adaptive Moving Average (KAMA) untuk menyesuaikan posisi perdagangan secara dinamis dan melacak tren pasar secara otomatis.

  1. Menghitung ukuran langkah perdagangan secara dinamis (dalam pips) dan menyesuaikan dengan volatilitas pasar
  2. Menghasilkan sinyal beli dan jual berdasarkan arah KAMA
  3. Atur jarak stop loss setelah sinyal dipicu, dan sesuaikan dengan pergerakan harga
  4. Konfirmasi opsional bar dekat untuk menyaring sinyal palsu

Melalui penerapan fungsi-fungsi ini, strategi berusaha untuk mendapatkan keuntungan tambahan dari tren sambil mengendalikan risiko.

Logika Strategi

Strategi ini bekerja berdasarkan indikator Kaufman Adaptive Moving Average. KAMA menghitung rasio momentum harga terhadap volatilitas untuk menyesuaikan secara dinamis berat dan kelancaran rata-rata bergerak, yang memungkinkannya untuk merespons perubahan harga lebih cepat.

Ketika KAMA melintasi di atas garis stop loss ke bawah, itu menunjukkan pembalikan tren dan memicu sinyal beli. Ketika KAMA melintasi di bawah garis stop loss ke atas, itu menunjukkan pembalikan tren dan memicu sinyal jual. Setelah memasuki posisi, strategi menghitung jarak stop loss dinamis berdasarkan ATR dan menetapkan garis stop loss yang menguntungkan. Ketika KAMA bergerak ke arah yang menguntungkan, garis stop loss juga menyesuaikan sesuai, bergerak ke posisi yang lebih menguntungkan untuk mengunci lebih banyak keuntungan.

Dengan cara ini, strategi dapat melacak tren, secara bertahap memindahkan garis stop loss sampai dipicu atau sinyal terbalik dipicu untuk menutup posisi.

Keuntungan

Dibandingkan dengan strategi rata-rata bergerak tradisional, strategi ini memiliki keuntungan berikut:

  1. KAMA memiliki sensitivitas tinggi dan dapat menangkap tren harga lebih cepat;
  2. Jarak stop loss dinamis mengunci lebih banyak keuntungan karena menyesuaikan dengan tren;
  3. Opsional bar menutup konfirmasi menyaring sinyal palsu dan mengurangi entri yang tidak perlu.

Secara umum, strategi ini responsif, dapat dikontrol, dan sistem pelacakan tren yang khas.

Risiko

Strategi ini juga membawa beberapa risiko:

  1. Risiko pembalikan tren. KAMA dapat beradaptasi secara fleksibel terhadap fluktuasi harga tetapi mungkin tidak merespons secara tepat waktu terhadap pembalikan tren yang tiba-tiba.
  2. Jika jarak stop loss dinamis diatur terlalu luas, mungkin terlalu agresif dan gagal mengunci keuntungan tepat waktu.
  3. Menggunakan konfirmasi dekat bar membantu mengurangi sinyal palsu tetapi tidak dapat menghilangkannya sepenuhnya.

Untuk mengelola risiko ini, metode seperti mengoptimalkan jarak stop loss dan menetapkan persentase stop loss maksimum dapat digunakan.

Arahan Optimasi

Arah-arah yang mungkin untuk mengoptimalkan strategi meliputi:

  1. Mengoptimalkan parameter KAMA: menyesuaikan panjang rata-rata bergerak, fine-tune smoothness;
  2. Mengoptimalkan kehilangan stop dinamis: menguji jarak stop loss optimal dan ukuran langkah berdasarkan produk yang berbeda;
  3. Tambahkan indikator penyaringan: memasukkan indikator tren lainnya untuk mengkonfirmasi sinyal perdagangan dan meningkatkan keandalan.

Sebagai contoh, MACD dapat ditambahkan sebagai indikator konfirmasi tambahan, yang mengharuskan MACD Dif positif dan berkembang di samping salib emas KAMA. Ini dapat menyaring beberapa sinyal palsu dan menghindari entri berulang yang tidak perlu.

Kesimpulan

Dengan menggunakan stop loss dinamis untuk melacak tren dan memaksimalkan keuntungan tren, ditambah dengan kemampuan penyesuaian indikator KAMA untuk dengan cepat merespons perubahan pasar yang cepat, strategi ini dapat menjadi sistem pelacakan tren yang efisien setelah beberapa optimasi, cocok untuk perdagangan jangka menengah hingga panjang.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)

// Function to calculate pips with higher precision
getPips(price) =>
    difc = syminfo.mintick
    hlpips = price / difc
    math.round(hlpips / syminfo.mintick) * syminfo.mintick

// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )

tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)

// Function to calculate the TMA
gettma() =>
    mom = math.abs(ta.change(src, length))
    volatility = math.sum(math.abs(ta.change(src)), length)
    er = volatility != 0 ? mom / volatility : 0
    fastAlpha = 2 / (fastLength + 1)
    slowAlpha = 2 / (slowLength + 1)
    alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
    kama = 0.0
    kama := alpha * src + (1 - alpha) * nz(kama[1], src)
    await = awaitBarConfirmation ? barstate.isconfirmed : true
    maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
    thma = kama
    hma_dif = (thma - thma[2])/2
    colour = hma_dif > 0 ? color.green : color.red
    isGreen = hma_dif > 0
    [thma, isGreen, colour]

// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1

// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na

[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

plot(thma, title='KAMA', linewidth=2, color=colour)

if ta.crossover(thma, psl) and strategy.position_size < 0
    strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)

if ta.crossunder(thma, psl) and strategy.position_size > 0
    strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)

if isGreen and strategy.position_size <= 0
    if na(psl)
        psl := close + getPips(pips)
    strategy.entry("Buy", strategy.long, alert_message=buyMess)
    lastSignal := 1

if not isGreen and strategy.position_size >= 0
    if na(psl)
        psl := close - getPips(pips)
    strategy.entry("Sell", strategy.short, alert_message=sellMess)
    lastSignal := -1

if (thma >= lastPsl or na(lastPsl)) and thma > psl
    psl := psl + getPips(pips)
    lastPsl := psl

if (thma <= lastPsl or na(lastPsl)) and thma < psl
    psl := psl - getPips(pips)
    lastPsl := psl

plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)


Lebih banyak