Aliran Rangka Berbilang Masa Mengikuti Strategi DI


Tarikh penciptaan: 2023-11-07 16:31:07 Akhirnya diubah suai: 2023-11-07 16:31:07
Salin: 0 Bilangan klik: 644
1
fokus pada
1617
Pengikut

Aliran Rangka Berbilang Masa Mengikuti Strategi DI

Gambaran keseluruhan

Strategi ini adalah berdasarkan purata trend indikator DI+ dan DI-, menggunakan indikator DI dari dua bingkai masa yang berbeza untuk menentukan arah trend, dan kemudian melakukan lebih banyak shorting. Apabila bingkai masa yang lebih besar dan bingkai masa yang lebih kecil DI+ lebih tinggi daripada DI-dianggap sebagai trend bullish, melakukan lebih banyak; apabila kedua-dua bingkai masa DI-lebih tinggi daripada DI+, dipertimbangkan sebagai trend menurun, shorting.

Prinsip

Strategi ini berdasarkan kepada prinsip-prinsip berikut:

  1. Hitung DI+ dan DI- dengan mengambil harga tinggi, harga tutup, dan harga rendah untuk mengira DI+ dan DI-

  2. Bandingkan dua bingkai masa DI+ dan DI-。 pada bingkai masa utama (seperti 1 jam) dan bingkai masa yang lebih besar (seperti garis matahari) mengira DI+ dan DI-, dan bandingkan hubungan besar dan kecil.

  3. Menentukan arah trend. Apabila DI + pada bingkai masa yang lebih besar dan bingkai masa yang lebih kecil adalah lebih besar daripada DI- maka ia dianggap sebagai trend multihead; apabila kedua-dua bingkai masa DI- lebih besar daripada DI +, ia dianggap sebagai trend kosong.

  4. Menerima isyarat perdagangan. Isyarat multihead untuk dua bingkai masa DI+>DI-, buat banyak; isyarat kosong untuk dua bingkai masa DI->DI+, buat kosong.

  5. Tetapkan Stop Loss. Berdasarkan ATR, stop loss dikira dan trend tracking stop loss dilaksanakan.

  6. Syarat Keluar: Hentikan kedudukan apabila berlaku pemicu kerugian atau perubahan harga.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Menggunakan dua kerangka masa DI untuk menilai trend, anda boleh menyaring beberapa penembusan palsu.

  2. ATR secara dinamik mengesan hentian kerugian untuk melindungi keuntungan maksimum dan mengelakkan hentian kerugian yang terlalu kecil.

  3. Hentikan kerugian tepat pada masanya, dan anda boleh mengawal kerugian anda.

  4. Berdagang mengikut trend, anda boleh terus menangkap peluang trend.

  5. Peraturan yang jelas dan mudah difahami, mudah untuk dikendalikan.

Risiko dan Penyelesaian

Strategi ini juga mempunyai risiko:

  1. DI terdapat ketinggalan, mungkin terlepas masa masuk. Parameter boleh dioptimumkan dengan sewajarnya, atau digabungkan dengan petunjuk lain.

  2. Penghakiman dua bingkai masa mungkin mempunyai perbezaan di atas dan di bawah. Isyarat pengesahan bingkai masa boleh ditambah.

  3. Stop loss yang terlalu radikal boleh menyebabkan perdagangan yang terlalu kerap.

  4. Ia mungkin berlaku dalam keadaan yang tidak menentu. Anda boleh mengurangkan kekerapan perdagangan dengan menambah syarat penapisan.

  5. Pengoptimuman parameter bergantung pada data sejarah, dan mungkin terdapat pengoptimuman yang berlebihan di cakera.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dengan:

  1. Mengoptimumkan parameter pengiraan DI untuk mencari kombinasi parameter terbaik.

  2. Menambah penapis untuk penunjuk lain untuk meningkatkan ketepatan isyarat seperti MACD, KDJ dan lain-lain.

  3. Mengoptimumkan strategi hentian kerugian, menyesuaikan diri dengan lebih banyak keadaan pasaran. Boleh diubah menjadi hentian bergerak atau hentian hentian.

  4. Menambah penapisan semasa transaksi untuk mengelakkan berita penting.

  5. Uji kekuatan parameter pelbagai jenis untuk meningkatkan adaptasi.

  6. Menambah komponen pembelajaran mesin, model penilaian latihan menggunakan data sejarah.

ringkaskan

Strategi ini secara keseluruhannya adalah strategi pengesanan trend yang tipikal, menggunakan petunjuk DI untuk menentukan arah trend, menetapkan stop loss untuk mengunci keuntungan, dan terus mendapat keuntungan dalam trend. Keuntungan strategi ini adalah bahawa strategi strategi jelas dan mudah untuk beroperasi secara langsung.

Kod 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