Trend DI Kerangka Masa Berganda Mengikuti Strategi

Penulis:ChaoZhang, Tarikh: 2023-11-07 16:31:07
Tag:

img

Ringkasan

Strategi ini menggunakan Indeks Arah Purata (DI +) dan Indeks Arah Negatif (DI-) pada dua bingkai masa untuk menentukan arah trend untuk perdagangan panjang dan pendek. Apabila DI + lebih tinggi daripada DI- pada bingkai masa yang lebih besar dan lebih kecil, ia menunjukkan trend menaik dan isyarat panjang dicetuskan. Apabila DI- lebih tinggi daripada DI + pada kedua bingkai, ia menunjukkan trend menurun dan isyarat pendek dicetuskan.

Cara Ia Bekerja

Strategi ini berdasarkan beberapa prinsip:

  1. Mengira DI + dan DI-. Dapatkan DI + dan DI- dengan menggunakan harga tinggi, dekat dan rendah.

  2. Bandingkan DI+ dan DI- pada dua jangka masa. Hitung DI+ dan DI- masing-masing pada jangka masa carta utama (contohnya 1 jam) dan jangka masa yang lebih besar (contohnya setiap hari). Bandingkan nilai antara kedua-dua jangka masa.

  3. Tentukan arah trend. Apabila DI + lebih besar daripada DI- pada kedua-dua bingkai masa yang lebih besar dan lebih kecil, ia menunjukkan trend menaik. Apabila DI - lebih besar daripada DI + pada kedua-dua bingkai, ia menunjukkan trend menurun.

  4. DI+>DI- pada kedua-dua bingkai memberikan isyarat panjang. DI->DI+ pada kedua-dua bingkai memberikan isyarat pendek.

  5. Tetapkan stop loss. Gunakan ATR untuk mengira stop loss dinamik untuk trend berikut.

  6. Syarat keluar. Keluar apabila stop loss dipukul atau harga terbalik.

Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Menggunakan dua kerangka masa DI menapis beberapa pelarian palsu.

  2. Hentian trailing ATR memaksimumkan perlindungan keuntungan dan mengelakkan hentian terlalu ketat.

  3. Stop loss tepat pada masanya mengawal kerugian pada perdagangan tunggal.

  4. Perdagangan dengan trend membolehkan terus menangkap trend.

  5. Peraturan mudah dan jelas, mudah dilaksanakan untuk perdagangan langsung.

Risiko dan Penyelesaian

Terdapat juga beberapa risiko:

  1. DI mempunyai kesan kelewatan, mungkin terlepas masa kemasukan. boleh mengoptimumkan parameter atau menambah penunjuk lain.

  2. Kerangka masa berganda mungkin mempunyai perbezaan antara TF yang lebih besar dan lebih kecil. Tambah lagi pengesahan kerangka masa.

  3. Stop loss yang terlalu agresif boleh menyebabkan perdagangan berlebihan.

  4. Whipsaw di pasaran sampingan boleh menyebabkan perdagangan yang kerap Tambah penapis untuk mengurangkan kekerapan perdagangan.

  5. Pengoptimuman parameter bergantung pada data sejarah dan mungkin terlalu banyak.

Arahan pengoptimuman

Strategi ini boleh ditingkatkan dalam aspek berikut:

  1. Mengoptimumkan parameter pengiraan DI untuk set parameter terbaik.

  2. Tambah penapis penunjuk lain untuk meningkatkan ketepatan isyarat, contohnya MACD, KDJ dll.

  3. Mempertingkatkan strategi stop loss untuk menyesuaikan lebih banyak keadaan pasaran, seperti penangguhan penangguhan atau pesanan menunggu.

  4. Tambah penapis sesi dagangan untuk mengelakkan peristiwa berita penting.

  5. Uji ketahanan parameter pada produk yang berbeza untuk meningkatkan kesesuaian.

  6. Memperkenalkan pembelajaran mesin untuk melatih model pada data sejarah.

Kesimpulan

Ringkasnya, ini adalah strategi trend berikut tipikal yang menggunakan DI untuk menentukan arah trend dan menetapkan stop loss untuk mengunci keuntungan di sepanjang trend. Kelebihannya terletak pada logiknya yang jelas dan kemudahan pelaksanaannya untuk perdagangan langsung.


/*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


Lebih lanjut