Эта стратегия отслеживает динамические изменения индикатора ADX для отслеживания ранних сдвигов в рыночных тенденциях для своевременного следования тенденции. Когда ADX быстро поднимается с низких уровней, это сигнализирует о формировании тенденции, которая представляет собой большую возможность для входа. С помощью скользящих средних он может эффективно отфильтровать ложные сигналы.
В основе этой стратегии лежит суждение о развитии тренда на основе динамических изменений индикатора ADX. Низкий ADX означает небольшие колебания в тенденциях. Когда ADX быстро поднимается с низких уровней, это сигнализирует о формировании тенденции. Стратегия фиксирует появление тенденции путем мониторинга резкого роста ADX.
В частности, входный сигнал состоит из следующих факторов:
Когда все вышеперечисленные условия выполнены, это сигнализирует о формировании восходящего тренда, чтобы пойти длинным. Когда цена падает ниже скользящих средних, закрывают позиции. Два скользящих средних используются для более точного суждения о тенденциях.
Логика стоп-лосса аналогична: идти на короткие позиции, когда ADX быстро падает, и закрывать позиции, когда цена поднимается выше скользящих средних.
Наибольшее преимущество здесь заключается в своевременном захвате возникающих тенденций. Традиционный способ рассмотрения абсолютных значений ADX часто требует подтверждения выше 20 или 25 для вызова тренда, что упускает оптимальное время входа.
Кроме того, скользящие средние помогают эффективно отфильтровывать ложные сигналы, повышая стабильность стратегии.
Наибольший риск возникает из-за отставания самой 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)