Trend mengikut strategi berdasarkan rangka masa transendental


Tarikh penciptaan: 2024-02-21 11:05:17 Akhirnya diubah suai: 2024-02-21 11:05:17
Salin: 0 Bilangan klik: 690
1
fokus pada
1617
Pengikut

Trend mengikut strategi berdasarkan rangka masa transendental

Gambaran keseluruhan

Idea teras strategi ini adalah untuk mengenal pasti trend pasaran dengan menggabungkan beberapa bingkai masa, menggunakan penunjuk melampau pada bingkai masa yang lebih tinggi sebagai penapis, dan menghantar isyarat beli dan jual pada bingkai masa yang lebih rendah. Strategi ini bertujuan untuk menggunakan maklumat struktur pasaran yang disediakan oleh bingkai masa yang tinggi untuk meningkatkan kualiti keputusan perdagangan.

Prinsip Strategi

Strategi ini menggunakan fungsi keselamatan untuk mendapatkan nilai penunjuk melampau pada jangka masa yang lebih tinggi (dengan default 4 kali lipat daripada jangka masa semasa). Penunjuk melampau terdiri daripada dua garis: garis melampau dan garis trend. Apabila garis melampau berada di atas garis trend, ia memberi isyarat bullish, dan di bawahnya, ia memberi isyarat bearish.

Strategi ini menggunakan arah overtrend pada jangka masa tinggi sebagai syarat penapisan, dan hanya memberi isyarat perdagangan apabila arah overtrend pada jangka masa rendah selaras dengan jangka masa tinggi. Iaitu, strategi ini hanya akan melakukan lebih atau kurang apabila indikator overtrend pada kedua-dua jangka masa memberi isyarat yang sama.

Ini dapat mengelakkan gangguan oleh bunyi pasaran timeframe rendah, meningkatkan kebolehpercayaan isyarat. Pada masa yang sama, menggunakan timeframe tinggi untuk menilai struktur pasaran, membuat keputusan keseluruhan yang betul.

Kelebihan Strategik

  • Menggunakan maklumat struktur pasaran yang disediakan oleh jangka masa yang tinggi untuk menyaring kebisingan dari jangka masa yang rendah dan meningkatkan kualiti keputusan perdagangan
  • Analisis pelbagai kerangka masa menjadikan isyarat dagangan lebih dipercayai
  • Parameter yang boleh disesuaikan untuk indikator overtrend, mengoptimumkan strategi jual beli
  • Tetapan julat tarikh terbina dalam yang mengehadkan julat masa pengesanan

Analisis risiko

  • Sinyal timeframe tinggi terlewat, mungkin kehilangan peluang sambungan pendek
  • Kerangka masa yang tinggi untuk menilai struktur pasaran
  • Penunjuk Supertrend sendiri boleh memberi isyarat yang salah
  • Batasan jangka masa pengesanan mungkin mengabaikan data penting, menjejaskan ketepatan keputusan ujian

Penyelesaian:

  • Sesuaikan tetapan bingkai masa tinggi dengan betul untuk mengurangkan kelewatan isyarat
  • Pertimbangan struktur jangka masa tinggi yang disahkan bersama-sama dengan petunjuk lain
  • Mengoptimumkan parameter penunjuk trend melampau untuk meningkatkan kualiti isyarat
  • Peningkatan jangka masa pengukuran dan pengujian strategi

Arah pengoptimuman strategi

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Mengoptimumkan parameter indikator hypertrend untuk mencari kombinasi parameter terbaik
  2. Tambah indikator lain dalam kombinasi untuk membentuk model pelbagai faktor
  3. Uji kombinasi jangka masa yang berbeza
  4. Menambah mekanisme kawalan kerugian untuk mengawal risiko
  5. Menggabungkan algoritma pembelajaran mesin untuk menyesuaikan hyperparameter secara dinamik

Kaedah-kaedah seperti pengoptimuman parameter, penggabungan penunjuk, penambahbaikan berhenti, dan pengenalan pembelajaran mesin dapat meningkatkan kesan strategi pengesanan trend pelbagai kerangka masa ini.

ringkaskan

Strategi ini menggunakan penghakiman trend pada bingkai masa yang tinggi untuk membimbing pelaksanaan perdagangan pada bingkai masa yang rendah. Reka bentuk bingkai masa berbilang ini dapat menyaring bunyi pasaran dengan berkesan dan mengenal pasti arah trend yang lebih jelas.

Kod 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)