Strategi mengikuti tren berdasarkan kerangka waktu transendental


Tanggal Pembuatan: 2024-02-21 11:05:17 Akhirnya memodifikasi: 2024-02-21 11:05:17
menyalin: 0 Jumlah klik: 388
1
fokus pada
1214
Pengikut

Strategi mengikuti tren berdasarkan kerangka waktu transendental

Ringkasan

Gagasan inti dari strategi ini adalah untuk mengidentifikasi tren pasar dengan menggabungkan beberapa kerangka waktu, menggunakan indikator overshoot pada kerangka waktu yang lebih tinggi sebagai filter, dan mengirim sinyal beli dan jual pada kerangka waktu yang lebih rendah. Strategi ini bertujuan untuk memanfaatkan informasi struktur pasar yang disediakan oleh kerangka waktu yang lebih tinggi untuk meningkatkan kualitas keputusan perdagangan.

Prinsip Strategi

Strategi ini menggunakan fungsi keamanan untuk mendapatkan nilai indikator overshoot dari jangka waktu yang lebih tinggi (default 4 kali lipat dari jangka waktu saat ini). Indikator overshoot terdiri dari dua garis: garis overshoot dan garis tren.

Strategi ini menggunakan arah overtrend pada frame waktu tinggi sebagai kondisi penyaringan, dan hanya akan mengirimkan sinyal perdagangan jika arah overtrend pada frame waktu rendah sesuai dengan frame waktu tinggi. Artinya, strategi ini hanya akan melakukan over atau undertrend jika indikator overtrend pada kedua frame waktu mengirimkan sinyal identik.

Hal ini dapat menghindari gangguan dari kebisingan pasar time frame rendah, meningkatkan keandalan sinyal. Sementara menggunakan waktu frame tinggi untuk menilai struktur pasar, membuat keputusan keseluruhan yang benar.

Keunggulan Strategis

  • Menggunakan informasi struktur pasar yang disediakan oleh kerangka waktu tinggi untuk menyaring kebisingan kerangka waktu rendah dan meningkatkan kualitas keputusan perdagangan
  • Kombinasi analisis multi-frame waktu membuat sinyal perdagangan lebih dapat diandalkan
  • Parameter yang dapat disesuaikan untuk indikator overtrend, untuk mengoptimalkan strategi jual beli
  • Pengaturan rentang tanggal internal, yang membatasi rentang waktu pengamatan

Analisis risiko

  • Sinyal frekuensi tinggi terlambat, kemungkinan kehilangan kesempatan untuk short-circuit
  • Probabilitas kesalahan dalam menentukan struktur pasar dalam kerangka waktu yang tinggi
  • Indikator supertrend itu sendiri mungkin memberi sinyal yang salah.
  • Batas waktu pengembalian mungkin mengabaikan data penting dan mempengaruhi akurasi hasil tes

Solusi:

  • Sesuaikan pengaturan timeframe tinggi untuk mengurangi lag sinyal
  • Pertimbangan struktural kerangka waktu yang tinggi dikombinasikan dengan indikator lain
  • Optimalkan parameter indikator overtrend untuk meningkatkan kualitas sinyal
  • Peningkatan jangka waktu pengujian kembali dan pengujian keandalan strategi

Arah optimasi strategi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Optimalkan parameter indikator supertrend untuk menemukan kombinasi parameter terbaik
  2. Menambahkan indikator lain untuk dikombinasikan, membentuk model multi faktor
  3. Uji Kombinasi Kerangka Waktu Tinggi dan Rendah
  4. Meningkatkan mekanisme stop loss untuk mengendalikan risiko
  5. Menggabungkan algoritma pembelajaran mesin untuk menyesuaikan hyperparameter secara dinamis

Metode seperti pengoptimalan parameter, penggabungan indikator, perbaikan stop loss, dan pengenalan pembelajaran mesin dapat secara signifikan meningkatkan efektivitas strategi pelacakan tren multi-frame.

Meringkaskan

Strategi ini secara cerdik menggunakan penilaian tren dari kerangka waktu tinggi untuk membimbing eksekusi perdagangan kerangka waktu rendah. Desain kerangka waktu ganda ini dapat secara efektif menyaring kebisingan pasar dan mengidentifikasi arah tren yang lebih jelas.

Kode Sumber Strategi
/*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)