Эта стратегия сочетает в себе индекс направленного движения (ADX), плюс индикатор направленного движения (DI +) и быстрые и медленные скользящие средние показатели для определения направления рынка и периода хранения.
Основная логика этой стратегии заключается в том, чтобы генерировать сигналы покупки, когда линия +DI пересекает линию ADX снизу вверх, и генерировать сигналы продажи, когда линия +DI пересекает линию ADX снизу вниз. Поэтому эта стратегия основана на перекрестке между DI и ADX для определения рыночных тенденций и точек переворота. В то же время для определения общей тенденции рынка используется связь между быстрыми и медленно движущимися средними.
В частности, сигнал покупки будет запущен, когда будут выполнены следующие условия:
Сигнал продажи запускается при выполнении следующих условий:
Стратегия также включает в себя логику остановки потери для выхода из всех позиций, когда цена падает ниже уровня остановки потери.
Стратегия сочетает в себе индикаторы DI, ADX и скользящих средних показателей для эффективного определения поворотов тенденций на рынке.
Есть некоторые риски, которые следует учитывать при этой стратегии:
Эти риски могут быть устранены путем оптимизации параметров ADX и скользящей средней, корректировки уровня стоп-лосса, добавления фильтров для подтверждения и т.д.
Есть возможность для дальнейшего совершенствования:
В целом эта стратегия кроссовера ADX довольно стабильна, способна эффективно улавливать обратные тенденции на ранней стадии, но контроль риска имеет решающее значение. Дальнейшая оптимизация параметров, строгое соблюдение правил входа и стоп-лосс могут привести к хорошей корректированной по риску доходности. Стратегия подходит для долгосрочных счетов, держащих среднесрочные и краткосрочные позиции.
/*backtest start: 2022-12-01 00:00:00 end: 2023-12-07 00:00:00 period: 1d basePeriod: 1h 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/ // © mohanee //@version=4 //ADX strategy SmoothedTrueRange=0.00 SmoothedDirectionalMovementPlus=0.00 SmoothedDirectionalMovementMinus=0.00 strategy(title="ADX strategy", overlay=false,pyramiding=3, default_qty_type=strategy.fixed, default_qty_value=3, initial_capital=10000, currency=currency.USD) len = input(11, title="ADX Length", minval=1) threshold = input(30, title="threshold", minval=5) fastEma=input(13, title="Fast EMA",minval=1, maxval=50) slowEma=input(55, title="Slow EMA",minval=10, maxval=200) stopLoss =input(8, title="Stop Loss",minval=1) // TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0 SmoothedTrueRange:= nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus:= nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = sma(DX, len) plot(DIPlus, color=color.green, title="DI+") //plot(DIMinus, color=color.red, title="DI-") plot(ADX, color=color.black, title="ADX") hline(threshold, color=color.black, linestyle=hline.style_dashed) fastEmaVal=ema(close,fastEma) slowEmaVal=ema(close,slowEma) //long condition longCondition= ADX < threshold and crossover(DIPlus,ADX) and fastEmaVal > slowEmaVal barcolor(longCondition ? color.yellow: na) strategy.entry(id="ADXLE", long=true, when= longCondition and strategy.position_size<1) barcolor(strategy.position_size>1 ? color.blue: na) bgcolor(strategy.position_size>1 ? color.blue: na) //Add strategy.entry(id="ADXLE", comment="Add", long=true, when= strategy.position_size>1 and close<strategy.position_avg_price and crossover(DIPlus,ADX) ) //calculate stop Loss stopLossVal = strategy.position_avg_price - (strategy.position_avg_price*stopLoss*0.01) strategy.close(id="ADXLE",comment="SL Exit", when=close<stopLossVal) //close all on stop loss //exit condition exitCondition= ADX > threshold and crossunder(DIPlus,ADX) // and fastEmaVal > slowEmaVal strategy.close(id="ADXLE",comment="TPExitAll", qty=strategy.position_size , when= exitCondition) //close all