ダイナミックな上向きADXトレンドフォロー戦略


作成日: 2023-12-11 17:18:32 最終変更日: 2023-12-11 17:18:32
コピー: 0 クリック数: 728
1
フォロー
1621
フォロワー

ダイナミックな上向きADXトレンドフォロー戦略

概要

この戦略は,ADX指標の動態の変化を追跡し,市場トレンドの初期変化を捉え,トレンドのタイムリーな追跡を実現する.ADXが低値から急激に上昇すると,トレンドが形成されていることを示し,これは入場するのに良い時間である.移動平均の補助と組み合わせて,誤診を効果的に回避することができる.

戦略原則

この戦略は,ADX指標の動態の変化に基づいてトレンドの発展を判断する.ADX指標が低いときは,トレンドの変化がほとんどないことを示す.ADXが低い値から急速に上昇すると,トレンドが形成されていることを示す.戦略は,ADXの急速な上昇を監視して,トレンドの発展を捉える.

具体的には,戦略の入場審査には以下の条件が含まれる:

  1. ADX上は,設定された値 ((例えば10) を穿戴する.
  2. ADXが急上昇した
  3. 価格の上のシンプル移動平均またはインデックス移動平均

上記の条件が同時に満たされると,代表トレンドが形成され,多めに行われます.当時は移動平均を横切るとき,平仓する。移動平均を2つ使用すると,トレンドの発展をより正確に判断できる。

ストップダメージ条件も同様で,ADXが急激に下方へ下落したとき,空白する.価格が移動平均を下回ったとき,平仓する.

優位分析

この戦略の最大の優点は,タイムリーにトレンドの発展を捕捉することにある。従来はADX数値のみを見る方法であり,往々にしてADXが20または25まで上昇するまでトレンドを確認するために待つことが必要であり,これは最高の入場タイミングを逃している。この戦略はADXの急速な上昇を追跡することによって,トレンドの発展を大いに把握することができる。

さらに,戦略は移動平均を導入し,誤診の部分を効率的にフィルターして,戦略の安定性を向上させました.

リスクと最適化分析

この戦略の最大のリスクはADX指数自体の遅れである.急速な上昇を追跡することで遅れを縮めることができるが,まだ一定の遅れが残っている.これは,一部の急速な反転する市場を捕まえることができない結果になる.

さらに,ADX指標は傾向判断に100%正確ではないため,間違いの診断も避けられない.移動平均の導入は部分的なノイズをフィルターできるが,さらなる最適化が必要である.

この戦略の最適化余地はまだ十分であり,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)