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

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

img

Обзор

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

Логика стратегии

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

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

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

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

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

Руководство по оптимизации

  1. Оптимизируйте параметры ADX для достижения наилучших результатов.
  2. Добавьте стоп-лосс к лимиту по одиночным сделкам.
  3. Попробуйте комбинировать другие индикаторы для фильтрации сигналов, например, RSI, Bollinger Bands.

Резюме

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


/*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')

Больше