Strategi Pelacakan Tren Multitimeframe Berbasis Supertrend

Penulis:ChaoZhang, Tanggal: 2024-02-21 11:05:17
Tag:

img

Gambaran umum

Ide inti dari strategi ini adalah untuk menggabungkan beberapa kerangka waktu untuk mengidentifikasi tren pasar, menggunakan indikator Supertrend dari kerangka waktu yang lebih tinggi sebagai filter dan menghasilkan sinyal beli dan jual dari kerangka waktu yang lebih rendah.

Logika Strategi

Strategi ini mengambil nilai indikator Supertrend dari kerangka waktu yang lebih tinggi (default 4x dari kerangka waktu saat ini) dengan memanggil fungsi keamanan. Indikator Supertrend terdiri dari dua garis: garis Supertrend dan garis tren.

Arah indikator Supertrend dari kerangka waktu yang lebih tinggi berfungsi sebagai kondisi filter. Sinyal perdagangan hanya dihasilkan ketika arah Supertrend dari kedua kerangka waktu sejajar. Itu berarti sinyal hanya dipicu ketika kedua kerangka waktu memberikan sinyal ke arah yang sama.

Hal ini menghindari gangguan dari kebisingan pasar dalam kerangka waktu yang lebih pendek dan meningkatkan keandalan sinyal.

Keuntungan

  • Menyaring kebisingan dari kerangka waktu yang lebih rendah menggunakan informasi struktur pasar dari tf yang lebih tinggi
  • Sinyal yang lebih dapat diandalkan dari kombinasi analisis dari beberapa kerangka waktu
  • Parameter Supertrend yang dapat disesuaikan untuk optimasi strategi
  • Pengaturan rentang tanggal bawaan untuk membatasi periode backtest

Analisis Risiko

  • Sinyal yang tertinggal dari kerangka waktu yang lebih tinggi dapat kehilangan peluang jangka pendek
  • Ketidakakuratan dalam penilaian struktur pasar jangka panjang
  • Potensi sinyal yang salah dari Supertrend itu sendiri
  • Pembatasan tanggal backtest dapat menghilangkan data penting dan mempengaruhi akurasi hasil

Solusi:

  • Siapkan pengaturan jangka waktu yang lebih tinggi untuk mengurangi keterlambatan sinyal
  • Tambahkan indikator lain untuk mengkonfirmasi penilaian jangka waktu yang lebih tinggi
  • Mengoptimalkan parameter Supertrend untuk meningkatkan kualitas sinyal
  • Secara bertahap memperluas periode waktu backtest untuk menguji ketahanan

Arahan Optimasi

Strategi ini dapat ditingkatkan di beberapa bidang:

  1. Mengoptimalkan parameter Supertrend untuk kombinasi parameter terbaik
  2. Tambahkan indikator lain untuk membuat model multifaktor
  3. Uji kombinasi jangka waktu tinggi-rendah yang berbeda
  4. Menggabungkan mekanisme stop loss untuk mengendalikan risiko
  5. Menggunakan pembelajaran mesin untuk menyesuaikan parameter secara dinamis

Melalui optimasi parameter, menggabungkan indikator, meningkatkan stop loss, dan memperkenalkan pembelajaran mesin, peningkatan kinerja yang signifikan dapat dicapai untuk strategi pelacakan tren multi-timeframe ini.

Kesimpulan

Strategi ini dengan cerdas memanfaatkan penilaian tren jangka waktu yang lebih tinggi untuk memandu eksekusi perdagangan dalam jangka waktu yang lebih rendah. Desain jangka waktu multitime tersebut dapat secara efektif menyaring kebisingan pasar dan mengidentifikasi arah tren yang lebih jelas. Pengaturan tanggal bawaan juga membuat backtesting lebih fleksibel. Secara keseluruhan, ini adalah strategi pelacakan tren jangka waktu multitime yang dirancang dengan baik yang layak untuk penelitian dan aplikasi lebih lanjut.


/*backtest
start: 2023-02-14 00:00:00
end: 2024-02-20 00:00:00
period: 1d
basePeriod: 1h
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Higher TF - Repainting", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

HTFMultiplier = input(4, minval=1, step=1)

SupertrendMult = input(1)
SupertrendPd = input(4, minval=4, step=4)

backtestBars = input(title="Backtest from ", defval=10, minval=1, maxval=30)
backtestFrom = input(title="Timeframe", defval="years", options=["days", "months", "years"])

repaintOption = input(title="Repaint", defval="Yes", options=["Yes", "No - set lookahead false", "No - do not use security"])

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_getBackTestTimeFrom(backtestFrom, backtestBars)=>
    byDate = backtestFrom == "days"
    byMonth = backtestFrom == "months"
    byYear = backtestFrom == "years"
    
    date = dayofmonth(timenow)
    mth = month(timenow)
    yr = year(timenow)
    
    leapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,29)
    nonleapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,28)
    
    restMonths = array.new_int(10,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,30)
    array.set(leapYearDaysInMonth,2,31)
    array.set(leapYearDaysInMonth,3,30)
    array.set(leapYearDaysInMonth,4,31)
    array.set(leapYearDaysInMonth,5,31)
    array.set(leapYearDaysInMonth,6,30)
    array.set(leapYearDaysInMonth,7,31)
    array.set(leapYearDaysInMonth,8,30)
    array.set(leapYearDaysInMonth,9,31)
    
    array.concat(leapYearDaysInMonth,restMonths)
    array.concat(nonleapYearDaysInMonth,restMonths)
    isLeapYear = yr % 4 == 0 and (year%100 != 0 or year%400 == 0)
    numberOfDaysInCurrentMonth = isLeapYear ? array.get(leapYearDaysInMonth, mth-2) : array.get(nonleapYearDaysInMonth, mth-2)
    if(byDate)
        mth := (date - backtestBars) < 0 ? mth - 1 : mth
        yr := mth < 1 ? yr - 1 : yr
        mth := mth < 1 ? 1 : mth
        date := (date - backtestBars) < 0 ? numberOfDaysInCurrentMonth - backtestBars + date + 1 : date - backtestBars + 1
    if(byMonth)
        date := 1
        yr := (mth - (backtestBars%12)) < 0 ? yr - int(backtestBars/12) - 1 : yr - int(backtestBars/12)
        mth := mth - (backtestBars%12) + 1
    if(byYear)
        date := 1
        mth := 1
        yr := yr - backtestBars
    [date, mth, yr]


repaint = repaintOption == "Yes"
useSecurityLookahead = repaintOption == "No - set lookahead false"

[SupertrendRepaint, DirRepaint] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = true, gaps=true)
[SupertrendNoLookahead, DirNoLookahead] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = false, gaps=false)

[SupertrendRegular, DirRegular] = supertrend(SupertrendMult, SupertrendPd)

[date, mth, yr] = f_getBackTestTimeFrom(backtestFrom, backtestBars)
inDateRange = time >= timestamp(syminfo.timezone, yr, mth, date, 0, 0)

longCondition = repaint ? DirRepaint == -1 : useSecurityLookahead? DirNoLookahead == -1 : DirRegular == -1
shortCondition = repaint ? DirRepaint == 1 : useSecurityLookahead? DirNoLookahead == 1 : DirRegular == 1
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange)
strategy.entry("Sell", strategy.short, when=shortCondition and inDateRange)


Lebih banyak