Стратегия индикатора динамического среднего тренда ADX


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

Стратегия индикатора динамического среднего тренда ADX

Обзор

Стратегия динамического среднего трендового индикатора ADX - это количественная торговая стратегия, которая использует индикатор ADX для определения силы и направления тренда на рынке. Стратегия определяет, есть ли тенденция на рынке, рассчитывая средний индекс направления ((ADX) и определяет направление тренда, рассчитывая положительный индикатор ((DI +) и отрицательный индикатор ((DI -), что приводит к сигналам покупки и продажи.

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

Эта стратегия сначала использует индикатор ADX, чтобы определить, есть ли тенденция на рынке. ADX выше ключевого значения, установленного пользователем (по умолчанию 23), означает, что рынок находится в тенденции. Когда текущее значение ADX выше значения n дней до ADX (по умолчанию 3 дня), означает, что ADX растет, и рыночная тенденция формируется.

Затем стратегия использует DI+ и DI- для определения направления рыночной тенденции. Когда DI+ выше DI-, рынок находится в восходящей тенденции; когда DI+ ниже DI-, рынок находится в нисходящей тенденции.

Наконец, анализируя ситуацию с ADX и DI, мы получили конкретные сигналы о покупке и продаже:

  1. Когда ADX повышается, выше критического значения, и DI+ выше DI-, создается сигнал покупки
  2. Когда ADX повышается, выше критического значения, и DI+ ниже DI-, создается сигнал продажи
  3. Когда ADX переходит в снижение, создается сигнал о равновесии

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

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

Стратегия динамического среднего трендового индикатора ADX имеет следующие преимущества:

  1. Автоматическое определение рыночных тенденций, чтобы избежать недействительных сделок
  2. Автоматически определяет направление рыночных тенденций и отслеживает их
  3. Обеспечение четкой логики покупки при наличии тренда / ликвидации при исчезновении тренда
  4. Настраиваемая фильтрация подвижных средних для предотвращения ложных прорывов
  5. Конфигурируемые временные диапазоны отслеживания для исторического тестирования
  6. Показатели и параметры могут быть настроены и оптимизированы для разных сортов

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

Однако эта стратегия также несет в себе некоторые риски:

  1. Индекс ADX отстает и может упустить возможность в начале тренда
  2. Многопространственное суждение зависит от показателя DI, который чувствителен и может дать ошибочный сигнал.
  3. Фильтрация скользящих средних может пропустить короткую линию
  4. Неправильный диапазон времени отслеживания может привести к пересоответствию
  5. Неправильная настройка параметров индикатора может повлиять на эффективность стратегии

Чтобы снизить риск, можно рассмотреть следующие моменты:

  1. Сокращение параметров ADX, чтобы уменьшить задержку
  2. Настройка или удаление фильтра DI для предотвращения ошибочных сигналов
  3. Сокращение циклов скользящих средних
  4. Расширение диапазона времени отсчета для полного тестирования
  5. Оптимизация параметров индикатора для поиска оптимальных настроек

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

Эта стратегия может быть оптимизирована в следующих аспектах:

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

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

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

Исходный код стратегии
/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 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')