この戦略は,市場方向と保持期間を決定するために,ダイレクショナル・ムーブメント・インデックス (ADX),プラス・ダイレクショナル・インディケーター (DI+) と高速・スロー・ムービング・平均を組み合わせます.これはトレンドフォロー・トレード戦略に属します.この戦略は,中期および短期間の逆転点を効果的に捉えることができ,変動が低く,トレンド傾向が明らかな市場で良好なパフォーマンスを発揮します.
この戦略の主な論理は,+DI線がADX線上を下から上へと越えると購入信号を生成し,+DI線がADX線下を上から下へと越えると販売信号を生成することである.したがって,この戦略は,市場動向と逆転点を決定するためにDIとADX間のクロスオーバーに依存している.同時に,高速移動平均値と遅い移動平均値の関係は,全体の市場動向を決定するために使用される.高速EMAがスローEMAを超える場合にのみ取引信号は考慮される.
特に,次の条件が満たされると,購入信号が発信されます.
販売信号は,次の条件を満たす場合に発信されます.
ストップ・ロスは,ストップ・ロスの値を下回る時にすべてのポジションを退場する論理も組み込む.
この戦略は,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