ADXフィルターでモメントブレイク戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-04 17時30分
タグ:

img

概要

ADXは,ブレイクアウト信号をフィルタリングするためにADXインジケーターを使用する短期間の取引戦略である.価格が上ボリンジャーバンドを超えて ADXが下がり,価格が下ボリンジャーバンドを超えて ADXが上昇するときに短く,価格が下ボリンジャーバンドを超えて ADXが上昇するときに長くなります.この戦略は,完全に自動化された取引のためにストップロスを設定し,自動的に利益を取ります.

戦略の論理

この戦略の核心はブレイクアウト信号のためにボリンジャーバンドを使用している.ボリンジャーバンドの上下帯は価格の2つの標準偏差を表しているため,ブレイクアウトは通常,価格が強いトレンドに入っていることを意味する.さらに,ADXインジケーターは,偽ブレイクアウトを避けるためのフィルターとしてここに導入されている.ショート信号はADXが落ちているときにのみ考慮され,ロング信号はADXが上昇しているときにのみ考慮される.これは範囲期間中にいくつかのウィップソウをフィルタリングするのに役立ちます.

この戦略は,閉盤価格の33期を使用してボリンジャーバンドを計算する. 中間帯は33期間の単純な移動平均線であり,上部/下部帯は中部帯の上/下部で2つの標準偏差に置かれています. 価格が上部帯を下に閉盤時,8期 ADXが15期 ADXを下に閉盤時,戦略はショートシグナルを表示します. 価格が下部帯上から閉盤時,8期 ADXが15期 ADXの上に閉盤時,ロングシグナルを表示します. 出口は800ポイントの利益と400ポイントのストップ損失で設定されています.

利点分析

トレンドとインパントフィルターを組み込んだブレークアウト戦略として,いくつかの利点があります:

  1. ボリンジャー帯を使用することで ブレイクアウトを検出することが ほとんどのトレーダーの習慣に合致します
  2. ADXフィルタが追加されているので 鞭による損失を防ぐことができます
  3. 論理はシンプルで 分かりやすく最適化できます
  4. 自動的なストップ・ロストとテイク・プロフィートは アルゴリズムによる取引を容易にする

リスク分析

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

  1. BB パラメータが正しくない場合,信号が頻度が高くなり,コストが上がる可能性があります.
  2. 誤ったADXパラメータは 正確な信号をフィルタリングすることができます.
  3. ストップ・ロスの距離が大きすぎる場合,大きな損失をもたらす可能性があります.

これらのリスクを軽減するために,BBパラメータを細かく調整して帯を狭め,ADX期間を調整して過濾を避け,シングルトレード損失を制御するためにストップ損失を減らすことができます. もちろん,これらの最適化は過適性を防ぐために前向きにテストする必要があります.

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

さらに最適化できる余地があります.

  1. 適正なパラメータセットを見つけるため,異なる市場データでテストします.
  2. 信号フィルタリングのためにボリュームや移動平均などの他の指標を組み込む.
  3. マシン学習方法を活用してパラメータを自動最適化します
  4. ダイナミックストップ・ロストを考慮して 利益を取ります

結論

結論として,これはフィルターによるシンプルで実用的なブレークアウト戦略である.BBでトレンドを特定し,ADXでシグナルをフィルタリングすることで,範囲限定期間のノイズを回避し,トレンドの機会を一定程度把握することができる.さらなるテストと改善のための余地はまだ大きい.


/*backtest
start: 2023-12-27 00:00:00
end: 2024-01-03 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Hizbullah XAUUSD Sniper", overlay=true)

Price = close

Length = input(33)
Mult = input(2)
Basis = sma(Price, Length)
StdDev = Mult * stdev(Price, Length)
Upper = Basis + StdDev
Lower = Basis - StdDev

ADX_Length = input(4)
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
SmoothedTrueRange = sma(TrueRange, ADX_Length)
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
SmoothedDirectionalMovementPlus = sma(DirectionalMovementPlus, ADX_Length)
SmoothedDirectionalMovementMinus = sma(DirectionalMovementMinus, ADX_Length)
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus - DIMinus) / (DIPlus + DIMinus)*100
SmoothedADX1 = ema(DX, input(8))
SmoothedADX2 = ema(DX, input(15))

Condition1 = crossunder(Price, Upper) and SmoothedADX1 < SmoothedADX2

Take_Profit = input(800)
Stop_Loss = input(400)

strategy.entry("ShortEntry", true, when = Condition1)
strategy.exit("ShortExit", "ShortEntry", profit = Take_Profit, loss = Stop_Loss)


もっと