Динамическая стратегия ADX

Автор:Чао Чжан, Дата: 2024-01-15 15:32:45
Тэги:

img

Обзор

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

Логика торговли

Стратегия сначала использует индикатор ADX, чтобы определить, существует ли тенденция на рынке. Когда ADX выше ключевого уровня, определенного пользователем (по умолчанию 23), это сигнализирует о том, что рыночная тенденция относительно сильна. Когда текущее значение ADX выше, чем значение ADX n дней назад (n - определенный пользователем период обратной связи, по умолчанию 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, можно получить ложные сигналы, поскольку 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')

Больше