Стратегия тренда ADX Momentum


Дата создания: 2024-01-16 15:57:17 Последнее изменение: 2024-01-16 15:57:17
Копировать: 0 Количество просмотров: 762
1
Подписаться
1617
Подписчики

Стратегия тренда ADX Momentum

Обзор

Стратегия основана на показателях ADX, чтобы определить тенденцию рынка, в сочетании с показателями DMI, чтобы определить пустоту, использовать наклон ADX, чтобы определить силу тренда, установить фильтр ключевых значений ADX для не трендовых рынков, а также фильтр торговых сигналов с помощью движущихся средних.

Стратегический принцип

  1. Вычислить показатели ADX, DI+, DI-
  2. Склонность ADX>0, указывающая на тенденцию к росту; ключевое значение установлено на 23, используется для фильтрации не трендовых рынков.
  3. DI+ выше, чем DI-, что означает, что многоголовое силы больше, чем воздушные силы, чтобы посмотреть многоголовый сигнал.
  4. При включенной фильтрации движущихся средних, только при закрытии цены выше движущейся средней, образуется многоголовый сигнал.
  5. Когда ADX скользит , то это указывает на отступление тренда.

Анализ преимуществ

  1. Помощная MA-фильтрация снижает шум торговли на не трендовых рынках.
  2. ADX имеет склонность к рассудительности, позволяя точно оценивать развитие тренда.
  3. Диагностика DI сочетается с оценкой ADX, что создает более полную систему принятия решений по торговле тенденциями.
  4. В то же время, по мнению экспертов, убыток от вывода и убыток от прибыли может быть выше, чем у простой стратегии скользящей средней.

Анализ рисков

  1. Показатели ADX устанавливают различные параметры, что приводит к большим различиям в результатах.
  2. DMI пока не определил полное направление полёта, возможно, появятся ошибочные сигналы.
  3. Есть определенная задержка, которая снижает эффективность стратегии.

Направление оптимизации

  1. Оптимизируйте комбинацию параметров ADX, чтобы найти оптимальные параметры.
  2. Увеличение стратегии “стоп-лосс”, чтобы избежать увеличения убытков.
  3. Попробуйте сочетать фильтрующие сигналы с другими индикаторами, например, RSI, Брин-Бенд.

Подвести итог

Эта стратегия использует преимущества ADX для определения тенденций и силы тенденции, в сочетании с DMI для определения направления, чтобы создать полную систему отслеживания тенденций. При этом подвижная средняя эффективно фильтрует шум в не трендовых рынках.

Исходный код стратегии
/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh with inspiration from @9e52f12edd034d28bdd5544e7ff92e 
//The intent behind this study is to look at ADX when it has an increasing slope and is above a user-defined key level (23 default). 
//This is to identify when it is trending.
//It then looks at the DMI levels.  If D+ is above D- and the ADX is sloping upwards and above the key level, it triggers a buy condition.  Opposite for short.
//Can use a user-defined moving average to filter long/short if desried.
// NOTE: THIS IS MEANT TO BE USED IN CONJUNCTION WITH MY "ATX TRIGGER" INDICATOR FOR VISUALIZATION. MAKE SURE SETTINGS ARE THE SAME FOR BOTH.

strategy("ADX | DMI Trend", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.04)

// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
// ADX Info
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(23, title="Keylevel for ADX")
adxLookback = input(3, title="Lookback Period for Slope")

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 200, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    close

// == USE BUILT-IN DMI FUNCTION TO DETERMINE ADX AND BULL/BEAR STRENGTH
[diplus, diminus, adx] = dmi(dilen, adxlen)

buySignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus > diminus  and close >= maFilterCheck
// buySignalValue = valuewhen(buySignal, close, 0)
shortSignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus < diminus  and close <= maFilterCheck
// shortSignalValue = valuewhen(shortSignal, close, 0)
sellCoverSignal = adx[0]-adx[adxLookback] < 0

// == ENTRY & EXIT CRITERIA
// Triggers to be TRUE for it to fire of the BUY Signal : (opposite for the SELL signal).
// (1): Price is over the 200 EMA line. (EMA level configurable by the user)
// (2): "D+" is OVER the "D-" line
// (3): RSI 7 is under 30 (for SELL, RSI 7 is over 70)
// 1* = The ultimate is to have a combination line of 3 EMA values, EMA 14, EMA 50 and EMA 200 - And if price is over this "combo" line, then it's a strong signal

// == STRATEGY ENTRIES/EXITS == 
strategy.entry("Long", strategy.long, when = buySignal)
strategy.close("Long", when = sellCoverSignal)
strategy.entry("Short", strategy.short, when = shortSignal)
strategy.close("Short", when = sellCoverSignal)
    
// == ALERTS == 
// alertcondition(buySignal, title='ADX Trigger Buy', message='ADX Trigger Buy')
// alertcondition(sellSignal, title='ADX Trigger Sell', message='ADX Trigger Sell')