Strategi DI Mengikuti Tren Multi-Kerangka Waktu


Tanggal Pembuatan: 2023-11-07 16:31:07 Akhirnya memodifikasi: 2023-11-07 16:31:07
menyalin: 0 Jumlah klik: 644
1
fokus pada
1617
Pengikut

Strategi DI Mengikuti Tren Multi-Kerangka Waktu

Ringkasan

Strategi ini didasarkan pada rata-rata indikator tren DI+ dan DI-, menggunakan indikator DI dari dua frame waktu yang berbeda untuk menentukan arah tren, dan kemudian melakukan lebih banyak shorting. Jika DI + dari frame waktu yang lebih besar dan frame waktu yang lebih kecil sama-sama lebih tinggi dari DI-dianggap sebagai tren bullish, melakukan lebih banyak; Jika kedua frame waktu DI-dianggap sebagai tren bearish, lebih tinggi dari DI +.

Prinsip

Strategi ini didasarkan pada prinsip-prinsip berikut:

  1. Menghitung DI+ dan DI- │ dengan mengambil harga tinggi, harga tutup, harga rendah, menghitung DI+ dan DI- │

  2. Bandingkan dua kerangka waktu DI+ dan DI-。 masing-masing di kerangka waktu utama (seperti 1 jam) dan kerangka waktu yang lebih besar (seperti garis matahari) menghitung DI+ dan DI-, dan bandingkan hubungan besar dan kecil。

  3. Penilaian arah tren. Ketika DI + dari bingkai waktu yang lebih besar dan bingkai waktu yang lebih kecil lebih besar dari DI - , penilaian sebagai tren multihead; Ketika kedua bingkai waktu DI - lebih besar dari DI +, penilaian sebagai tren kosong.

  4. Sinyal perdagangan △ sinyal multihead untuk dua frame waktu DI+>DI-, lakukan banyak; sinyal head kosong untuk dua frame waktu DI->DI+, lakukan kosong △

  5. Setting Stop Loss. Berdasarkan perhitungan stop loss pada ATR, trend tracking stop loss dapat dilakukan.

  6. Kondisi Keluar: Stop loss trigger atau posisi kosong saat harga berbalik.

Analisis Keunggulan

Strategi ini memiliki keuntungan sebagai berikut:

  1. Dengan menggunakan dua frame waktu DI untuk menilai tren, beberapa terobosan palsu dapat disaring.

  2. ATR secara dinamis melacak stop loss, sehingga dapat melindungi keuntungan maksimal dan menghindari stop loss yang terlalu kecil.

  3. Stop loss yang tepat waktu dapat dikontrol.

  4. Perdagangan berdasarkan tren memungkinkan untuk terus menangkap peluang tren.

  5. Peraturan yang jelas dan mudah dipahami, mudah untuk dioperasikan secara langsung.

Risiko dan Solusi

Strategi ini juga memiliki risiko sebagai berikut:

  1. DI terlambat, mungkin kehilangan waktu masuk. Parameter dapat dioptimalkan sesuai, atau digabungkan dengan indikator lain.

  2. Penghakiman dua kerangka waktu mungkin ada perbedaan di atas dan di bawah. Anda dapat menambahkan sinyal verifikasi kerangka waktu.

  3. Stop loss yang terlalu radikal dapat menyebabkan perdagangan yang terlalu sering.

  4. Dalam situasi yang bergejolak dapat terjadi perdagangan yang lebih sering.

  5. Optimasi parameter bergantung pada data historis, mungkin ada terlalu banyak optimasi di disk. Harus hati-hati dalam mengevaluasi ketergantungan parameter.

Arah optimasi

Strategi ini dapat dioptimalkan dengan:

  1. Optimalkan parameter perhitungan DI untuk mencari kombinasi parameter yang optimal.

  2. Menambahkan filter indikator lain untuk meningkatkan akurasi sinyal. Seperti MACD, KDJ, dll.

  3. Optimalkan strategi stop loss untuk menyesuaikan diri dengan kondisi pasar yang lebih luas.

  4. Menambahkan filter waktu transaksi untuk menghindari berita penting.

  5. Uji kekuatan parameter dari berbagai varietas untuk meningkatkan adaptasi.

  6. Menambahkan komponen pembelajaran mesin, menggunakan data historis untuk melatih model penilaian.

Meringkaskan

Strategi ini secara keseluruhan adalah strategi pelacakan tren yang khas, menggunakan indikator DI untuk menentukan arah tren, mengatur stop loss untuk mengunci keuntungan, dan terus mendapatkan keuntungan dalam tren. Keunggulan strategi ini adalah bahwa ide strategi jelas dan mudah dioperasikan secara langsung.

Kode Sumber Strategi
/*backtest
start: 2022-10-31 00:00:00
end: 2023-11-06 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/
// © DojiEmoji

//@version=5
strategy("DI+/- multi TF Strat [KL]", overlay=true, pyramiding=1, initial_capital=1000000000, default_qty_type=strategy.percent_of_equity, default_qty_value=5)
var string GROUP_ALERT    = "Alerts"
var string GROUP_SL       = "Stop loss"
var string GROUP_ORDER    = "Order size"
var string GROUP_TP       = "Profit taking"
var string GROUP_HORIZON  = "Time horizon of backtests"
var string GROUP_IND      = "Directional IndicatorDI+ DI-"

// ADX Indicator {
adx_len = input(14, group=GROUP_IND, tooltip="Typically 14")
tf1 = input.timeframe("", title="DI +/- in Timeframe 1", group=GROUP_IND, tooltip="Main: DI+ > DI-")
tf2 = input.timeframe("1D", title="DI +/- in Timeframe 2", group=GROUP_IND, tooltip="Confirmation: DI+ > DI-")
// adx_thres = input(20, group=GROUP_IND)   //threshold not used in this strategy

get_ADX(_high, _close, _low) =>
// (high, close, mid) -> [plus_DM, minus_DM]
    // Based on TradingView user BeikabuOyaji's implementation
    _tr = math.max(math.max(_high - _low, math.abs(_high - nz(_close[1]))), math.abs(_low - nz(_close[1])))
    smooth_tr = 0.0
    smooth_tr := nz(smooth_tr[1]) - nz(smooth_tr[1]) / adx_len + _tr

    smooth_directional_mov_plus = 0.0
    smooth_directional_mov_plus := nz(smooth_directional_mov_plus[1]) - nz(smooth_directional_mov_plus[1]) / adx_len + (_high - nz(_high[1]) > nz(_low[1]) - _low ? math.max(_high - nz(_high[1]), 0) : 0)

    smooth_directional_mov_minus = 0.0
    smooth_directional_mov_minus := nz(smooth_directional_mov_minus[1]) - nz(smooth_directional_mov_minus[1]) / adx_len + (nz(_low[1]) - _low > _high - nz(_high[1]) ? math.max(nz(_low[1]) - _low, 0) : 0)

    plus_DM = smooth_directional_mov_plus / smooth_tr * 100
    minus_DM = smooth_directional_mov_minus / smooth_tr * 100
    // DX = math.abs(plus_DM - minus_DM) / (plus_DM + minus_DM) * 100   // DX not used in this strategy
    [plus_DM, minus_DM]

// DI +/- from timeframes 1 and 2
[plus_DM_tf1, minus_DM_tf1] = get_ADX(request.security(syminfo.tickerid, tf1, high), request.security(syminfo.tickerid, tf1, close),request.security(syminfo.tickerid, tf1, low))
[plus_DM_tf2, minus_DM_tf2] = get_ADX(request.security(syminfo.tickerid, tf2, high),request.security(syminfo.tickerid, tf2, close),request.security(syminfo.tickerid, tf2, low))
// } end of block: ADX Indicator


var string ENUM_LONG      = "LONG"
var string LONG_MSG_ENTER = input.string("Long entered", title="Alert MSG for buying (Long position)", group=GROUP_ALERT)
var string LONG_MSG_EXIT  = input.string("Long closed", title="Alert MSG for closing (Long position)", group=GROUP_ALERT)
backtest_timeframe_start = input(defval=timestamp("01 Apr 2020 13:30 +0000"), title="Backtest Start Time", group=GROUP_HORIZON)
within_timeframe         = true

// Signals for entry
_uptrend_confirmed = plus_DM_tf1 > minus_DM_tf1 and plus_DM_tf2 > minus_DM_tf2
entry_signal_long = _uptrend_confirmed

plotshape(_uptrend_confirmed, style=shape.triangleup, location=location.bottom, color=color.green)
plotshape(not _uptrend_confirmed, style=shape.triangledown, location=location.bottom, color=color.red)

// Trailing stop loss ("TSL") {
tsl_multi                 = input.float(2.0, title="ATR Multiplier for trailing stoploss", group=GROUP_SL)
SL_buffer                 = ta.atr(input.int(14, title="Length of ATR for trailing stoploss", group=GROUP_SL)) * tsl_multi
TSL_source_long           = low
var stop_loss_price_long  = float(0)
var pos_opened_long       = false

stop_loss_price_long := pos_opened_long ? math.max(stop_loss_price_long, TSL_source_long - SL_buffer) : TSL_source_long - SL_buffer

// MAIN: {
if pos_opened_long and TSL_source_long <= stop_loss_price_long
    pos_opened_long := false
    alert(LONG_MSG_EXIT, alert.freq_once_per_bar)
    strategy.close(ENUM_LONG, comment=close < strategy.position_avg_price ? "stop loss" : "take profit")

// (2) Update the stoploss to latest trailing amt.
if pos_opened_long
    strategy.exit(ENUM_LONG, stop=stop_loss_price_long, comment="SL")

// (3) INITIAL ENTRY:
if within_timeframe and entry_signal_long
    pos_opened_long := true
    alert(LONG_MSG_ENTER, alert.freq_once_per_bar)
    strategy.entry(ENUM_LONG, strategy.long, comment="long")

// Plotting: 
TSL_transp_long = pos_opened_long and within_timeframe ? 0 : 100
plot(stop_loss_price_long, color=color.new(color.green, TSL_transp_long))

// CLEAN UP: Setting variables back to default values once no longer in use
if ta.change(strategy.position_size) and strategy.position_size == 0
    pos_opened_long := false

if not pos_opened_long
    stop_loss_price_long := float(0)

// } end of MAIN block