Эта стратегия сочетает в себе индекс направленного движения (DMI) и скользящую среднюю величину корпуса (HMA), чтобы определить направление рынка с помощью DMI и подтвердить силу тренда с помощью HMA без управления рисками.
Вычислить истинный диапазон, DIPlus, DIMinus и ADX.
Вычислить быстрые и медленные скользящие средние (HMA).
Запускать длинный вход, когда DIPlus пересекает DIMinus и быстрая HMA пересекает медленную HMA.
Включает короткий вход, когда DIMinus пересекает ниже DIPlus и быстрая HMA пересекает ниже медленной HMA.
Положите длинные/короткие ордера на сигналы входа.
Двойное подтверждение от индикатора тренда DMI и Hull MA обеспечивает точность в отслеживании тенденции рынка и избегает ошибок.
Ключевой риск исходит из отсутствия стоп-лосса, неспособности контролировать потери при огромных колебаниях на рынке.
Возможные решения включают добавление движущейся стоп-потери, оптимизация параметров смеси и т.д.
Добавьте ATR, отслеживающий стоп-потеря на основе истинного диапазона.
Оптимизируйте периоды корпуса, чтобы найти лучшее сочетание.
Динамический порог для длинных/коротких сигналов.
Добавьте фильтр импульса для обеспечения непрерывности тренда.
Комбинация DMI и HMA отличается простотой и эффективностью в определении трендов.
/*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)