Strategi Pengesanan Trend Multitimeframe Berasaskan Supertrend

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

img

Ringkasan

Idea teras strategi ini adalah untuk menggabungkan pelbagai jangka masa untuk mengenal pasti trend pasaran, menggunakan penunjuk Supertrend dari jangka masa yang lebih tinggi sebagai penapis dan menjana isyarat beli dan jual dari jangka masa yang lebih rendah.

Logika Strategi

Strategi ini memulihkan nilai penunjuk Supertrend dari jangka masa yang lebih tinggi (default 4x daripada jangka masa semasa) dengan memanggil fungsi keselamatan. Indikator Supertrend terdiri daripada dua garis: garis Supertrend dan garis trend. Garis Supertrend di atas garis trend adalah isyarat kenaikan, sementara di bawah adalah isyarat penurunan.

Arah penunjuk Supertrend dari bingkai masa yang lebih tinggi berfungsi sebagai keadaan penapis. Isyarat perdagangan hanya dihasilkan apabila arah Supertrend dari kedua-dua bingkai masa sejajar. Itu bermakna isyarat hanya dicetuskan apabila kedua-dua bingkai masa memberikan isyarat ke arah yang sama.

Ini mengelakkan gangguan dari bunyi bising pasaran dalam jangka masa yang lebih pendek dan meningkatkan kebolehpercayaan isyarat.

Kelebihan

  • Menapis bunyi bising dari jangka masa yang lebih rendah menggunakan maklumat struktur pasaran dari tf yang lebih tinggi
  • Isyarat yang lebih boleh dipercayai daripada menggabungkan analisis pelbagai kerangka masa
  • Parameter Supertrend yang boleh disesuaikan untuk pengoptimuman strategi
  • Tetapan julat tarikh terbina dalam untuk mengehadkan tempoh backtest

Analisis Risiko

  • Isyarat yang tertinggal dari jangka masa yang lebih tinggi mungkin kehilangan peluang jangka pendek
  • Ketidaktepatan dalam penilaian struktur pasaran jangka masa yang lebih tinggi
  • Potensi isyarat yang salah dari Supertrend sendiri
  • Ketegangan tarikh backtest mungkin terlepas data penting dan menjejaskan ketepatan hasil

Penyelesaian:

  • Tunes halus tetapan jangka masa yang lebih tinggi untuk mengurangkan kelewatan isyarat
  • Tambah penunjuk lain untuk mengesahkan pertimbangan jangka masa yang lebih tinggi
  • Mengoptimumkan parameter Supertrend untuk meningkatkan kualiti isyarat
  • Secara beransur-ansur meluaskan tempoh masa backtest untuk menguji ketahanan

Arahan pengoptimuman

Strategi ini boleh ditingkatkan dalam beberapa bidang:

  1. Mengoptimumkan parameter Supertrend untuk kombinasi parameter terbaik
  2. Tambah penunjuk lain untuk membuat model pelbagai faktor
  3. Uji kombinasi jangka masa tinggi dan rendah yang berbeza
  4. Memasukkan mekanisme stop loss untuk mengawal risiko
  5. Menggunakan pembelajaran mesin untuk menyesuaikan parameter secara dinamik

Melalui pengoptimuman parameter, menggabungkan penunjuk, meningkatkan stop loss, dan memperkenalkan pembelajaran mesin, peningkatan prestasi yang ketara dapat dicapai untuk strategi pengesanan trend pelbagai jangka masa ini.

Kesimpulan

Strategi ini dengan bijak memanfaatkan pertimbangan trend jangka masa yang lebih tinggi untuk membimbing pelaksanaan perdagangan dalam jangka masa yang lebih rendah. Reka bentuk jangka masa berbilang seperti itu dapat menapis bunyi pasaran dengan berkesan dan mengenal pasti arah trend yang lebih jelas. Tetapan tarikh terbina dalam juga menjadikan pengujian kembali lebih fleksibel. Secara keseluruhan, ini adalah strategi penjejakan trend jangka masa berbilang yang direka dengan baik yang layak untuk penyelidikan dan penerapan 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 lanjut