Динамическая тенденция роста ADX в соответствии со стратегией

Автор:Чао Чжан, Дата: 2023-12-11 17:18:32
Тэги:

img

Обзор

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

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

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

В частности, входный сигнал состоит из следующих факторов:

  1. ADX превышает пороговое значение (например, 10)
  2. ADX стремительно растет вверх
  3. Цены пересекаются выше простой или экспоненциальной скользящей средней

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

Логика стоп-лосса аналогична: идти на короткие позиции, когда ADX быстро падает, и закрывать позиции, когда цена поднимается выше скользящих средних.

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

Наибольшее преимущество здесь заключается в своевременном захвате возникающих тенденций. Традиционный способ рассмотрения абсолютных значений ADX часто требует подтверждения выше 20 или 25 для вызова тренда, что упускает оптимальное время входа.

Кроме того, скользящие средние помогают эффективно отфильтровывать ложные сигналы, повышая стабильность стратегии.

Анализ рисков и оптимизации

Наибольший риск возникает из-за отставания самой ADX. Несмотря на то, что быстрое повышение снижает отставание, все еще существует некоторая задержка. Это приводит к потере некоторых быстро меняющихся рынков.

Кроме того, ADX не вполне оценивает тенденции и неизбежно время от времени ошибочно диагностирует их.

Есть еще большое пространство для оптимизации этой стратегии, в основном повышения точности ADX в улавливании тенденций. Можно исследовать такие методы, как машинное обучение, обучение моделей для прогнозирования распределения вероятности на основе изменений ADX. Также можно проверить другие аспекты, такие как настройка параметров, дополнительные индикаторы и т. Д.

Заключение

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


/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
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/
// © dhilipthegreat

//@version=4
//Rising ADX strategy

strategy(title="Rising ADX strategy", overlay=false)

adxlen = input(14, title="ADX Length", minval=1)
threshold = input(10, title="threshold", minval=5)

hline(threshold, color=color.black, linestyle=hline.style_dashed)

atype = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen=input(20, title="Moving average 1 ",minval=1, maxval=50)
avg = atype == 1 ? sma(close,malen) : atype == 2 ? ema(close,malen) : atype == 3 ? wma(close,malen) : atype == 4 ? hma(close,malen) : na

atype2 = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen2=input(20, title="Moving average 2",minval=1, maxval=200)
avg2 = atype2 == 1 ? sma(close,malen2) : atype2 == 2 ? ema(close,malen2) : atype2 == 3 ? wma(close,malen2) : atype2 == 4 ? hma(close,malen2) : na

//ADX&DI
dilen = 14
dirmov(len,_high,_low,_tr) =>
	up = change(_high)
	down = -change(_low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(_tr, len)
	
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)

	[plus, minus]

adx(dilen, adxlen,_high,_low,_tr) =>
	[plus, minus] = dirmov(dilen,_high,_low,_tr)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

[plus, minus] = dirmov(dilen,high,low,tr)
sig = adx(dilen, adxlen,high,low,tr)
prev_sig = adx(dilen, adxlen,high[1],low[1],tr)
plot(sig ? sig : na, color = rising(sig, 1) ? color.lime : falling(sig, 1) ? color.orange : color.purple, title="ADX",linewidth=2)

//////
longCondition=  sig > threshold  and rising(sig, 1) and falling(prev_sig, 1) and close > avg and close > avg2
barcolor(longCondition ? color.yellow: na)
Long_side = input(true, "Long side")
if Long_side
    strategy.entry(id="Long", long=true,  when= longCondition  and strategy.position_size<1)
    exitCondition=  (rising(prev_sig, 1) and falling(sig, 1)) or close < avg and close < avg2
    strategy.close(id="Long",comment="L exit",    qty=strategy.position_size ,   when= exitCondition)   //close all

shortCondition=  sig > threshold  and rising(sig, 1) and falling(prev_sig, 1) and close < avg and close < avg2
barcolor(shortCondition ? color.gray: na)
Short_side = input(true, "Short side")
if Short_side
    strategy.entry(id="Short", long=false,  when= shortCondition  and strategy.position_size<1)
    sell_exitCondition=  (rising(prev_sig, 1) and falling(sig, 1)) or close > avg and close > avg2
    strategy.close(id="Short",comment="S exit",    qty=strategy.position_size ,   when= sell_exitCondition)   //close all

barcolor(strategy.position_size>1 ? color.lime: na)
bgcolor(strategy.position_size>1 ? color.lime: na)

barcolor(strategy.position_size<0 ? color.orange: na)
bgcolor(strategy.position_size<0 ? color.orange: na)

Больше