Strategi backtest dinamis multi-kerangka waktu


Tanggal Pembuatan: 2023-11-21 17:07:17 Akhirnya memodifikasi: 2023-11-21 17:07:17
menyalin: 1 Jumlah klik: 698
1
fokus pada
1617
Pengikut

Strategi backtest dinamis multi-kerangka waktu

Ringkasan

Strategi ini menggunakan mekanisme retrospeksi dinamis multi-frame time frame untuk menilai tren harga dengan membandingkan harga tertinggi dan terendah dari periode waktu yang berbeda, untuk mencapai risiko risiko rendah.

Prinsip Strategi

Strategi ini menggunakan fungsi khusus f_get_htfHighLow untuk mendapatkan harga tertinggi nhigh dan harga terendah nlow untuk periode waktu yang berbeda. Secara khusus, berdasarkan resolusi periode waktu yang ditetapkan pengguna, penggandaan periode waktu HTFMultiplier, parameter mundur lookahead dan gaps, dan offset offset, fungsi keamanan dipanggil untuk mendapatkan harga tertinggi dan terendah untuk periode waktu yang berbeda.

Misalnya, offset 0 untuk mendapatkan harga tertinggi dan terendah dari garis K saat ini; offset 1 untuk mendapatkan harga tertinggi dan terendah dari garis K sebelumnya. Dengan membandingkan perubahan harga antara dua garis K, menilai arah tren.

Jika harga tertinggi naik dan harga terendah naik, maka dianggap sebagai tren bullish; Jika harga tertinggi turun dan harga terendah turun, maka dianggap sebagai tren bearish. Berdagang longing atau shorting sesuai dengan arah tren.

Keunggulan Strategis

  1. Menggunakan analisis multi-frame waktu untuk meningkatkan akurasi penilaian
  2. Menggunakan mekanisme retrospeksi dinamis untuk menghindari repainting
  3. Fleksibilitas dalam mengatur kombinasi parameter yang berbeda untuk menyesuaikan diri dengan perubahan pasar
  4. Hanya membuka posisi saat tren jelas, dan mengontrol risiko secara efektif

Risiko Strategis

  1. Ada risiko kesalahan dalam perhitungan multi-frame waktu.
  2. Setel parameter regresi yang tidak benar dapat menyebabkan repainting
  3. Frekuensi transaksi mungkin terlalu tinggi, meningkatkan biaya transaksi dan risiko slippage

Solusi:

  1. Optimalkan parameter siklus waktu untuk meningkatkan akurasi penilaian
  2. Uji ulang parameter secara ketat, hindari repainting
  3. Sesuai dengan kondisi pembukaan posisi, kontrol frekuensi perdagangan

Arah optimasi strategi

  1. Menambahkan modul pembelajaran mesin untuk menilai tren menggunakan AI
  2. Posisi yang disesuaikan dengan volatilitas harga saham
  3. Mendaftarkan diri ke dalam mekanisme stop loss untuk mengendalikan risiko kerugian secara efektif

Meringkaskan

Strategi ini secara keseluruhan memiliki ide yang jelas, menggunakan multi-frame waktu untuk menentukan tren harga saham secara mundur, dan meminimalkan kesalahan penilaian manusia. Ini adalah strategi perdagangan terprogram yang khas. Dengan optimasi parameter dan fungsionalitas yang diperluas, stabilitas dan ruang keuntungan strategi dapat ditingkatkan lebih lanjut.

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