ATRとADXに基づくダイナミックな3ラインブレイクアウト取引戦略

ATR ADX SL TP
作成日: 2025-02-21 09:23:20 最終変更日: 2025-02-27 17:20:50
コピー: 2 クリック数: 405
2
フォロー
319
フォロワー

ATRとADXに基づくダイナミックな3ラインブレイクアウト取引戦略 ATRとADXに基づくダイナミックな3ラインブレイクアウト取引戦略

概要

この戦略は,クラシック三線突破形状に基づいた高級取引システムで,ADXのトレンド確認指標とATRのダイナミックストップストロップメカニズムを統合することによって,完全な取引ソリューションを提供します.戦略の核心は,連続した3つの同方向のK線後の突破形状を識別し,トレンドの強さを確認するとともに,正確な取引信号生成を実現します.

戦略原則

戦略は3つのコアメカニズムに基づいて動作する.第一に,看板形 (((3連鎖陰線後の陽線突破) と下落形 (((3連鎖陰線後の陰線突破) を含む古典的な三線突破形を識別する.次に,ADX (((平均トレンド指数)) を使って,トレンドの強さをフィルターし,ADX値が設定された値を超えるとのみ信号を確認する.最後に,ATR (((実際の波幅) を使って,止まりの位置を計算し,リスク管理の自主適応性を実現する.戦略は,技術的に正確なK線色判定と突破力の検証によって信号品質を保証する.

戦略的優位性

  1. 信号確認機構の改善:複数の技術指標の組み合わせによる信号信頼性の向上
  2. リスク管理のインテリジェンス:ATRベースのダイナミックストップ・ストップ・損失設定で,市場の変動に応じて自動的に調整できます.
  3. 高度なカスタマイズ性:ADXの値,ATR周期などを含む複数の重要なパラメータの調整オプションを提供します.
  4. トレンド追跡強化:ADXフィルタリングにより,強いトレンド環境でのみ入場を保証
  5. コード構造の明晰さ:モジュール化設計により,維持と拡張が容易になる

戦略リスク

  1. 形状認識の遅延:三線突破形状の確認は4つのK線が完了する必要があるため,入場時の遅延を引き起こす可能性がある.
  2. 偽のブレイクリスク: 揺るぎない市場では偽のブレイクシグナルが出る可能性
  3. ADXの落後性:トレンド確認指標として,ADX自体は落後性がある.
  4. ストップ幅の考慮:ATRベースのストップ設定は,激しい変動時に過大または過小である可能性があります.
  5. 市場環境依存: 戦略は,傾向が顕著な市場において優れているが,震動市場においては不十分である.

戦略最適化の方向性

  1. 信号フィルタリング強化:交付量確認機構を追加して,信号信頼性を向上させる
  2. 動的パラメータ最適化:ADXの値とATR周期を動的に調整する自己適応機構を導入
  3. 入場タイミング最適化: 価格構造 ((サポート位/レジスタンス位) と組み合わせて入場地点最適化
  4. ポジション管理の改善:変動率に基づくダイナミックなポジション管理メカニズムを追加
  5. 市場環境識別:異なる市場条件で異なるパラメータ設定を使用する市場環境分類ロジックを追加

要約する

この戦略は,古典的な三線突破形状と近代的な技術指標を組み合わせることで,理論的基礎と実用性の兼ねた取引システムを創造している.その核心的な優位性は,複数のシグナル確認機構と知的リスク管理にあるが,市場環境の適合性とパラメータの最適化の問題に注意する必要がある.提案された最適化方向によって,戦略にはさらに向上する余地がある.

ストラテジーソースコード
/*backtest
start: 2024-08-05 00:00:00
end: 2024-12-24 00:00:00
period: 5h
basePeriod: 5h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

// Copyright ...
// Based on the TMA Overlay by Arty, converted to a simple strategy example.
// Pine Script v5

//@version=5
strategy(title='3 Line Strike [TTF] - Strategy with ATR and ADX Filter',
     shorttitle='3LS Strategy [TTF]',
     overlay=true,
     initial_capital=100000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=100,
     pyramiding=0)

// -----------------------------------------------------------------------------
//                               INPUTS
// -----------------------------------------------------------------------------

// ATR and ADX Inputs
atrLength = input.int(title='ATR Length', defval=14, group='ATR & ADX')
adxLength = input.int(title='ADX Length', defval=14, group='ATR & ADX')
adxThreshold = input.float(title='ADX Threshold', defval=25, group='ATR & ADX')

// ### 3 Line Strike
showBear3LS = input.bool(title='Show Bearish 3 Line Strike', defval=true, group='3 Line Strike',
     tooltip="Bearish 3 Line Strike (3LS-Bear) = 3 zelené sviečky, potom veľká červená sviečka (engulfing).")
showBull3LS = input.bool(title='Show Bullish 3 Line Strike', defval=true, group='3 Line Strike',
     tooltip="Bullish 3 Line Strike (3LS-Bull) = 3 červené sviečky, potom veľká zelená sviečka (engulfing).")

// -----------------------------------------------------------------------------
//                          CALCULATIONS
// -----------------------------------------------------------------------------

// Calculate ATR
atr = ta.atr(atrLength)

// Calculate ADX components manually
tr = ta.tr(true)
plusDM = ta.change(high) > ta.change(low) and ta.change(high) > 0 ? ta.change(high) : 0
minusDM = ta.change(low) > ta.change(high) and ta.change(low) > 0 ? ta.change(low) : 0
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)
smoothedTR = ta.rma(tr, adxLength)

plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adx = ta.rma(dx, adxLength)

// Helper Functions
getCandleColorIndex(barIndex) =>
    int ret = na
    if (close[barIndex] > open[barIndex])
        ret := 1
    else if (close[barIndex] < open[barIndex])
        ret := -1
    else
        ret := 0
    ret

isEngulfing(checkBearish) =>
    sizePrevCandle = close[1] - open[1]
    sizeCurrentCandle = close - open
    isCurrentLargerThanPrevious = math.abs(sizeCurrentCandle) > math.abs(sizePrevCandle)

    if checkBearish
        isGreenToRed = (getCandleColorIndex(0) < 0) and (getCandleColorIndex(1) > 0)
        isCurrentLargerThanPrevious and isGreenToRed
    else
        isRedToGreen = (getCandleColorIndex(0) > 0) and (getCandleColorIndex(1) < 0)
        isCurrentLargerThanPrevious and isRedToGreen

isBearishEngulfing() => isEngulfing(true)
isBullishEngulfing() => isEngulfing(false)

is3LSBear() =>
    is3LineSetup = (getCandleColorIndex(1) > 0) and (getCandleColorIndex(2) > 0) and (getCandleColorIndex(3) > 0)
    is3LineSetup and isBearishEngulfing()

is3LSBull() =>
    is3LineSetup = (getCandleColorIndex(1) < 0) and (getCandleColorIndex(2) < 0) and (getCandleColorIndex(3) < 0)
    is3LineSetup and isBullishEngulfing()

// Signals
is3LSBearSig = is3LSBear() and adx > adxThreshold
is3LSBullSig = is3LSBull() and adx > adxThreshold

// Take Profit and Stop Loss
longTP = close + 2 * atr
longSL = close - 1 * atr
shortTP = close - 2 * atr
shortSL = close + 1 * atr

// -----------------------------------------------------------------------------
//                          STRATEGY ENTRY PRÍKAZY
// -----------------------------------------------------------------------------
if (showBull3LS and is3LSBullSig)
    strategy.entry("3LS_Bull", strategy.long, comment="3LS Bullish")
    strategy.exit("Exit Bull", from_entry="3LS_Bull", limit=longTP, stop=longSL)

if (showBear3LS and is3LSBearSig)
    strategy.entry("3LS_Bear", strategy.short, comment="3LS Bearish")
    strategy.exit("Exit Bear", from_entry="3LS_Bear", limit=shortTP, stop=shortSL)