ADXモメンタムトレンド戦略

作者: リン・ハーンチャオチャン開催日:2024年11月16日 15:57:17
タグ:

img

概要

この戦略は ADX インディケーターを使用して市場のトレンドを決定し,方向性を決定するために DMI インディケーターと組み合わせ, ADX 傾斜を使用してトレンド強さを測定し, ADX キーレベルを設定してトレンドでない市場をフィルターし,移動平均を使用して取引信号をフィルターします.

戦略の論理

  1. ADX,DI+,DI- インジケーターを計算する.
  2. ADX の傾き > 0 は上昇傾向を示し,傾向のない市場をフィルタリングするためにキーレベルは 23 に設定されています.
  3. DI+が DI-より上にあるのは,上昇勢力が下落勢力を上回ることを示し,買い信号を出す.
  4. 移動平均値のフィルタが有効になっている場合, 接近値が移動平均値以上である場合にのみ買い信号を生成します.
  5. ADX 傾き < 0 のとき,ポジションを閉じる.

利点分析

  1. MAフィルタは,トレンドではない市場でのノイズ取引を減らす.
  2. ADX傾斜はトレンド強さを正確に決定します
  3. DIは ADXと結合して方向性を示し,強度が強力なトレンド・トレーディング・システムになります.
  4. シンプルなMA戦略よりも 引き上げ率が低く,利益因数が高くなるのを期待する.

リスク分析

  1. ADX結果は異なる入力パラメータによって大きく異なります.
  2. DMIは方向がはっきり決まる前に 誤った信号を発する可能性があります
  3. 戦略の効率を低下させる.

オプティマイゼーションの方向性

  1. ADX パラメータを最適化して 最良の結果を得る
  2. ストップ・ロスは単一の取引の損失制限に追加します
  3. 他の指標を組み合わせてシグナルをフィルタリングしてみてください 例えばRSI,ボリンジャーバンドなどです

概要

この戦略は,トレンドとモメントを決定するADXの強みを完全に活用し,方向分析のためのDMIと組み合わせて,完全なトレンドフォローシステムを形成する.MAフィルターはノイズを効果的に軽減する.さらなるパラメータチューニングとインジケーターの組み合わせは強度と効率性を向上させることができる.要するに,トレンド,モメント,方向分析を組み込むことで,この戦略は強力なリターンを達成する可能性がある.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh with inspiration from @9e52f12edd034d28bdd5544e7ff92e 
//The intent behind this study is to look at ADX when it has an increasing slope and is above a user-defined key level (23 default). 
//This is to identify when it is trending.
//It then looks at the DMI levels.  If D+ is above D- and the ADX is sloping upwards and above the key level, it triggers a buy condition.  Opposite for short.
//Can use a user-defined moving average to filter long/short if desried.
// NOTE: THIS IS MEANT TO BE USED IN CONJUNCTION WITH MY "ATX TRIGGER" INDICATOR FOR VISUALIZATION. MAKE SURE SETTINGS ARE THE SAME FOR BOTH.

strategy("ADX | DMI Trend", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.04)

// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
// ADX Info
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(23, title="Keylevel for ADX")
adxLookback = input(3, title="Lookback Period for Slope")

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 200, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    close

// == USE BUILT-IN DMI FUNCTION TO DETERMINE ADX AND BULL/BEAR STRENGTH
[diplus, diminus, adx] = dmi(dilen, adxlen)

buySignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus > diminus  and close >= maFilterCheck
// buySignalValue = valuewhen(buySignal, close, 0)
shortSignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus < diminus  and close <= maFilterCheck
// shortSignalValue = valuewhen(shortSignal, close, 0)
sellCoverSignal = adx[0]-adx[adxLookback] < 0

// == ENTRY & EXIT CRITERIA
// Triggers to be TRUE for it to fire of the BUY Signal : (opposite for the SELL signal).
// (1): Price is over the 200 EMA line. (EMA level configurable by the user)
// (2): "D+" is OVER the "D-" line
// (3): RSI 7 is under 30 (for SELL, RSI 7 is over 70)
// 1* = The ultimate is to have a combination line of 3 EMA values, EMA 14, EMA 50 and EMA 200 - And if price is over this "combo" line, then it's a strong signal

// == STRATEGY ENTRIES/EXITS == 
strategy.entry("Long", strategy.long, when = buySignal)
strategy.close("Long", when = sellCoverSignal)
strategy.entry("Short", strategy.short, when = shortSignal)
strategy.close("Short", when = sellCoverSignal)
    
// == ALERTS == 
// alertcondition(buySignal, title='ADX Trigger Buy', message='ADX Trigger Buy')
// alertcondition(sellSignal, title='ADX Trigger Sell', message='ADX Trigger Sell')

もっと