Multi Timeframe Dinamis Backtesting Strategi

Penulis:ChaoZhang, Tarikh: 2023-11-21 17:07:17
Tag:

img

Ringkasan

Strategi ini menggunakan mekanisme pengujian balik dinamik pelbagai jangka masa untuk menentukan trend harga dengan membandingkan harga tertinggi dan terendah dalam tempoh masa yang berbeza, dengan itu mencapai arbitraj berisiko rendah.

Logika Strategi

Strategi ini mendapatkan harga tertinggi (nhigh) dan harga terendah (nlow) di pelbagai kerangka masa dengan memanggil fungsi tersuai f_get_htfHighLow. Khususnya, berdasarkan input yang ditakrifkan pengguna seperti resolusi tempoh masa, pengganda tempoh masa HTFMultiplier, parameter pengujian belakang, dan offset, ia memanggil fungsi keselamatan untuk mendapatkan harga tertinggi dan terendah dalam pelbagai kerangka masa.

Sebagai contoh, penyesuaian 0 mendapatkan harga tertinggi dan terendah bar semasa, sementara penyesuaian 1 mendapatkan harga tersebut dari bar sebelumnya. Dengan membandingkan perubahan harga antara bar, arah trend ditentukan.

Jika kedua-dua harga tertinggi dan terendah naik, trend bullish dikenal pasti. Jika kedua-dua harga jatuh, trend bearish dilihat. Posisi lama atau pendek diambil berdasarkan arah trend untuk melaksanakan perdagangan arbitraj.

Kelebihan

  1. Keakuratan yang lebih baik melalui analisis pelbagai jangka masa
  2. Mengelakkan cat semula melalui pengujian belakang dinamik
  3. Parameter fleksibel untuk menyesuaikan perubahan pasaran
  4. Risiko yang berkurangan dengan kedudukan dalam trend yang jelas sahaja

Risiko

  1. Kesalahan penilaian pelbagai jangka masa
  2. Membaiki semula dari parameter backtesting yang tidak betul
  3. Kos tinggi dan tergelincir daripada perdagangan yang berlebihan

Penyelesaian:

  1. Mengoptimumkan tempoh masa untuk ketepatan
  2. Parameter ujian yang ketat untuk mengelakkan lukisan semula
  3. Keadaan kemasukan sederhana untuk mengawal kekerapan

Peluang Peningkatan

  1. Tambah ML untuk memanfaatkan AI untuk trend
  2. Memasukkan penapis turun naik untuk saiz kedudukan dinamik
  3. Memperkenalkan hentian untuk mengehadkan kerugian dengan berkesan

Kesimpulan

Logik strategi jelas, menggunakan pengujian balik dinamik pelbagai jangka masa untuk menentukan trend dan meminimumkan bias manusia. Dengan penyempurnaan melalui pengoptimuman parameter dan pengembangan ciri, ia menunjukkan potensi yang signifikan untuk meningkatkan kestabilan dan keuntungan yang layak untuk penyelidikan dan penjejakan lanjut.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-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("HTF High/Low Repaint Strategy", overlay=true, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true

resolution = input("3M", type=input.resolution)
HTFMultiplier = input(22, minval=1, step=1)
offset = input(0, minval=0, step=1)
lookahead = input(true)
gaps = false

f_secureSecurity_on_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_on)
f_secureSecurity_on_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)
f_secureSecurity_off_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_on)
f_secureSecurity_off_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_off)

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_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)=>
    derivedResolution = resolution == ""?f_multiple_resolution(HTFMultiplier):resolution
    nhigh_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh = lookahead and gaps ? nhigh_on_on :
             lookahead and not gaps ? nhigh_on_off :
             not lookahead and gaps ? nhigh_off_on :
             not lookahead and not gaps ? nhigh_off_off : na
    nlow = lookahead and gaps ? nlow_on_on :
             lookahead and not gaps ? nlow_on_off :
             not lookahead and gaps ? nlow_off_on :
             not lookahead and not gaps ? nlow_off_off : na
    [nhigh, nlow]
    
[nhigh, nlow] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)
[nhighlast, nlowlast] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset+1)
plot(nhigh , title="HTF High",style=plot.style_circles, color=color.green, linewidth=1) 
plot(nlow , title="HTF Low",style=plot.style_circles, color=color.red, linewidth=1)

buyCondition = nhigh > nhighlast and nlow > nlowlast
sellCondition = nhigh < nhighlast and nlow < nlowlast

strategy.entry("Buy", strategy.long, when= buyCondition and inDateRange, oca_name="oca_buy")
strategy.entry("Sell", strategy.short, when= sellCondition and inDateRange, oca_name="oca_sell")


Lebih lanjut