Strategi Kombinasi DMI dan HMA

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

img

Gambaran umum

Strategi ini menggabungkan Indeks Gerak Arah (DMI) dan Rata-rata Gerak Hull (HMA) untuk mengidentifikasi arah pasar dengan DMI dan mengkonfirmasi kekuatan tren dengan HMA, tanpa manajemen risiko.

Logika Strategi

  1. Menghitung True Range, DIPlus, DIMinus dan ADX.

  2. Menghitung Hull Moving Averages (HMA) yang cepat dan lambat.

  3. Trigger entri panjang ketika DIPlus melintasi DIMinus dan HMA cepat melintasi HMA lambat.

  4. Trigger entry pendek ketika DIMinus melintasi di bawah DIPlus dan HMA cepat melintasi di bawah HMA lambat.

  5. Tempatkan pesanan panjang/pendek pada sinyal masuk.

Analisis Keuntungan

Konfirmasi ganda dari indikator tren DMI dan Hull MA memastikan akurasi dalam menangkap tren pasar dan menghindari whipsaws.

Analisis Risiko

Risiko utama berasal dari tidak ada stop loss, gagal mengendalikan kerugian ketika perubahan pasar besar terjadi.

Solusi yang mungkin termasuk menambahkan stop loss bergerak, mengoptimalkan campuran parameter dll.

Arahan Optimasi

  1. Tambahkan stop loss ATR berdasarkan True Range.

  2. Optimalkan periode Hull untuk menemukan campuran terbaik.

  3. Batas dinamis untuk sinyal panjang/pendek.

  4. Tambahkan filter momentum untuk memastikan kontinuitas tren.

Ringkasan

Kombinasi DMI dan HMA melakukan luar biasa dalam mengidentifikasi tren dengan kesederhanaan dan efisiensi.


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