ADXクロスオーバートレンド取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-08 15:49:12
タグ:

img

概要

この戦略は,市場方向と保持期間を決定するために,ダイレクショナル・ムーブメント・インデックス (ADX),プラス・ダイレクショナル・インディケーター (DI+) と高速・スロー・ムービング・平均を組み合わせます.これはトレンドフォロー・トレード戦略に属します.この戦略は,中期および短期間の逆転点を効果的に捉えることができ,変動が低く,トレンド傾向が明らかな市場で良好なパフォーマンスを発揮します.

原則

この戦略の主な論理は,+DI線がADX線上を下から上へと越えると購入信号を生成し,+DI線がADX線下を上から下へと越えると販売信号を生成することである.したがって,この戦略は,市場動向と逆転点を決定するためにDIとADX間のクロスオーバーに依存している.同時に,高速移動平均値と遅い移動平均値の関係は,全体の市場動向を決定するために使用される.高速EMAがスローEMAを超える場合にのみ取引信号は考慮される.

特に,次の条件が満たされると,購入信号が発信されます.

  1. 低速EMAが低速EMAより高い
  2. +DI線がADX線を上向きに横切る
  3. ADX値が30の値を下回る

販売信号は,次の条件を満たす場合に発信されます.

  1. ADX値が30値を超えると
  2. +DI線がADX線を下向きに横切る

ストップ・ロスは,ストップ・ロスの値を下回る時にすべてのポジションを退場する論理も組み込む.

利点

この戦略は,DI,ADXおよび移動平均指標を組み合わせて,市場の動向の転換を効果的に決定します.主な利点は以下の通りです.

  1. 入口と出口点を正確に決定するためにDIとADXのクロスオーバーを使用します.
  2. 市場全体的な傾向を決定し,悪い取引を避けるための高速・遅いEMAフィルターシステム
  3. ADX値を使ってトレンド強さを判断し,トレンドが弱いときにのみ取引し,偽のブレイクを避ける.
  4. ダウンシードリスクを制御するためのストップ・ロスのメカニズムを組み込む
  5. 厳格な入場条件で トップを買って底を売らない
  6. 明確な退出規則は,時宜のストップ損失と利益を取ることを可能にします

リスク

この戦略にはいくつかのリスクがあります.

  1. ADXインジケーターは遅延効果があり,価格逆転のための最高のタイミングを逃す可能性があります
  2. 市場の変動が高い場合,より多くの誤った信号が発生する可能性があります.
  3. 誤った高速・遅いEMA設定は,取引が欠落したり,有効なシグナルがフィルタリングされる可能性があります.
  4. ストップ・ロスのレベルが大きすぎると リスクを効果的に制御できない

このリスクは,ADXと移動平均パラメータを最適化し,ストップ損失レベルを調整し,確認のためのフィルターを追加することによって対処できます.

増進 の 機会

さらに改善できるものがあります

  1. 最適な組み合わせを見つけるために異なる長さの期間 ADX をテストする
  2. 信号確認のためにRSI,ボリンジャー帯などの他の指標を追加
  3. マシン学習アルゴリズムを使用して,パラメータとルールを自動的に最適化します
  4. 遅い段階のリスクを軽減するために,ストップロスのレベルを動的に調整する
  5. 入国・退出基準をより堅牢にするための多要素スコアモデルを構築する

結論

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     

もっと