Strategi Pengesanan Trend Purata Bergerak Kaufman

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

img

Ringkasan

Strategi ini direka berdasarkan Kaufman Adaptive Moving Average (KAMA) untuk menyesuaikan kedudukan dagangan secara dinamik dan mengesan trend pasaran secara automatik. Fungsi utama strategi termasuk:

  1. Mengira saiz langkah dagangan secara dinamik (dalam pip) dan menyesuaikan diri dengan turun naik pasaran
  2. Menghasilkan isyarat beli dan jual berdasarkan arah KAMA
  3. Tetapkan jarak stop loss selepas isyarat dicetuskan, dan sesuaikan dengan pergerakan harga
  4. Pengesahan pilihan bar dekat untuk menapis isyarat palsu

Melalui aplikasi fungsi ini, strategi cuba mendapatkan keuntungan tambahan dari trend sambil mengawal risiko.

Logika Strategi

Strategi ini berfungsi berdasarkan penunjuk Kaufman Adaptive Moving Average. KAMA mengira nisbah momentum harga kepada turun naik untuk menyesuaikan secara dinamik berat dan kelancaran purata bergerak, yang membolehkannya bertindak balas dengan lebih cepat terhadap perubahan harga.

Apabila KAMA melintasi di atas garis stop loss ke bawah, ia menunjukkan pembalikan trend dan mencetuskan isyarat beli. Apabila KAMA melintasi di bawah garis stop loss ke atas, ia mencadangkan pembalikan trend dan mencetuskan isyarat jual. Selepas memasuki kedudukan, strategi mengira jarak stop loss dinamik berdasarkan ATR dan menetapkan garis stop loss yang menguntungkan.

Dengan cara ini, strategi boleh mengesan trend, secara beransur-ansur memindahkan garis stop loss sehingga ia dicetuskan atau isyarat terbalik dicetuskan untuk menutup kedudukan.

Kelebihan

Berbanding dengan strategi purata bergerak tradisional, strategi ini mempunyai kelebihan berikut:

  1. KAMA mempunyai kepekaan yang tinggi dan dapat menangkap trend harga dengan lebih cepat;
  2. Jarak stop loss dinamik mengunci lebih banyak keuntungan kerana ia menyesuaikan dengan trend;
  3. Pilihan bar penutupan pengesahan menapis isyarat palsu dan mengurangkan entri yang tidak perlu.

Secara amnya, strategi ini responsif, boleh dikawal, dan sistem penjejakan trend biasa.

Risiko

Strategi ini juga membawa beberapa risiko:

  1. Risiko pembalikan trend. KAMA boleh menyesuaikan diri dengan fleksibel dengan turun naik harga tetapi mungkin tidak bertindak balas dengan tepat pada masa kepada pembalikan trend tiba-tiba.
  2. Jika jarak stop loss dinamik ditetapkan terlalu luas, ia mungkin terlalu agresif dan gagal mengunci keuntungan pada waktunya.
  3. Risiko isyarat palsu: Menggunakan pengesahan dekat bar membantu mengurangkan isyarat palsu tetapi tidak dapat menghapusnya sepenuhnya.

Untuk menguruskan risiko ini, kaedah seperti mengoptimumkan jarak stop loss dan menetapkan peratusan stop loss maksimum boleh digunakan.

Arahan pengoptimuman

Arah yang mungkin untuk mengoptimumkan strategi termasuk:

  1. Mengoptimumkan parameter KAMA: sesuaikan panjang purata bergerak, menyesuaikan kelancaran;
  2. Mengoptimumkan kehilangan berhenti dinamik: menguji jarak kehilangan berhenti optimum dan saiz langkah berdasarkan produk yang berbeza;
  3. Tambah penapis penunjuk: menggabungkan penunjuk trend lain untuk mengesahkan isyarat perdagangan dan meningkatkan kebolehpercayaan.

Sebagai contoh, MACD boleh ditambah sebagai penunjuk pengesahan tambahan, yang memerlukan MACD Dif positif dan berkembang bersama salib emas KAMA. Ini boleh menapis beberapa isyarat palsu dan mengelakkan kemasukan berulang yang tidak perlu.

Kesimpulan

Operasi keseluruhan strategi ini lancar. Dengan menggunakan stop loss dinamik untuk mengesan trend dan memaksimumkan keuntungan trend, ditambah dengan kemampuan penunjuk KAMA untuk bertindak balas dengan cepat terhadap perubahan pasaran yang cepat, strategi ini boleh menjadi sistem penjejakan trend yang cekap selepas beberapa pengoptimuman, sesuai 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 lanjut