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.
Mengira Julat Benar, DIPlus, DIMinus dan ADX.
Mengira purata bergerak Hull yang cepat dan perlahan (HMA).
Trigger entri panjang apabila DIPlus melintasi DIMinus dan HMA pantas melintasi HMA perlahan.
Memicu kemasukan pendek apabila DIMinus melintasi di bawah DIPlus dan HMA pantas melintasi di bawah HMA perlahan.
Letakkan pesanan panjang/pendek pada isyarat masuk.
Pengesahan berganda dari penunjuk trend DMI dan Hull MA memastikan ketepatan dalam menangkap trend pasaran dan mengelakkan whipsaws.
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.
Tambah ATR kehilangan berhenti yang mengikut Julat Benar.
Mengoptimumkan tempoh Hull untuk mencari campuran terbaik.
Sempadan dinamik untuk isyarat panjang/pendek.
Tambah penapis momentum untuk memastikan kesinambungan trend.
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)