Strategi Gabungan DMI dan HMA

Penulis:ChaoZhang, Tarikh: 2024-01-04 17:23:06
Tag:

img

Ringkasan

Strategi ini menggabungkan Indeks Pergerakan Arah (DMI) dan Purata Bergerak Hull (HMA) untuk mengenal pasti arah pasaran dengan DMI dan mengesahkan kekuatan trend dengan HMA, tanpa pengurusan risiko.

Logika Strategi

  1. Mengira Julat Benar, DIPlus, DIMinus dan ADX.

  2. Mengira purata bergerak Hull yang cepat dan perlahan (HMA).

  3. Trigger entri panjang apabila DIPlus melintasi DIMinus dan HMA pantas melintasi HMA perlahan.

  4. Memicu kemasukan pendek apabila DIMinus melintasi di bawah DIPlus dan HMA pantas melintasi di bawah HMA perlahan.

  5. Letakkan pesanan panjang/pendek pada isyarat masuk.

Analisis Kelebihan

Pengesahan berganda dari penunjuk trend DMI dan Hull MA memastikan ketepatan dalam menangkap trend pasaran dan mengelakkan whipsaws.

Analisis Risiko

Risiko utama datang daripada tiada stop loss, gagal untuk mengawal kerugian apabila perubahan pasaran besar berlaku.

Penyelesaian yang mungkin termasuk menambah kehilangan berhenti bergerak, mengoptimumkan campuran parameter dan lain-lain.

Arahan pengoptimuman

  1. Tambah ATR kehilangan berhenti yang mengikut Julat Benar.

  2. Mengoptimumkan tempoh Hull untuk mencari campuran terbaik.

  3. Sempadan dinamik untuk isyarat panjang/pendek.

  4. Tambah penapis momentum untuk memastikan kesinambungan trend.

Ringkasan

Gabungan DMI dan HMA berfungsi dengan cemerlang dalam mengenal pasti trend dengan kesederhanaan dan kecekapan.


/*backtest
start: 2022-12-28 00:00:00
end: 2024-01-03 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/
// © Tuned_Official
//@version=4
strategy(title="DMI + HMA - No Risk Management", overlay = false, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.025)

//Inputs
hullLen1 = input(title="Hull 1 length", type=input.integer, defval=29)
hullLen2 = input(title="Hull 2 length", type=input.integer, defval=2)
len = input(title="Length for DI", type=input.integer, defval=76)

//Calculations
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0

SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus

//Indicators
fasthull = hma(close, hullLen1)
slowhull = hma(close, hullLen2)
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)

//Plots
plot(DIPlus, color=color.green, title="DI+")
plot(DIMinus, color=color.red, title="DI-")
plot(ADX, color=color.black, title="ADX")

//conditions
go_long = crossover(DIPlus, DIMinus) and fasthull > slowhull //crossover(fasthull, slowhull) and DIPlus > DIMinus
go_short = crossover(DIMinus, DIPlus) and fasthull < slowhull //crossunder(fasthull, slowhull) and DIMinus > DIPlus

//Entry
if strategy.position_size < 0 or strategy.position_size == 0
    strategy.order("long", strategy.long, when=go_long)

if strategy.position_size > 0 or strategy.position_size == 0
    strategy.order("Short", strategy.short, when=go_short)

Lebih lanjut