3 ライン ブレイクアウト モメンタム トレンドフォロー戦略と ADX フィルターの組み合わせ

ADX ATR TMA TP SL 3LS
作成日: 2025-02-20 17:46:30 最終変更日: 2025-02-20 17:46:30
コピー: 0 クリック数: 459
2
フォロー
319
フォロワー

3 ライン ブレイクアウト モメンタム トレンドフォロー戦略と ADX フィルターの組み合わせ 3 ライン ブレイクアウト モメンタム トレンドフォロー戦略と ADX フィルターの組み合わせ

概要

この戦略は,三線突破形状とADXトレンドフィルターに基づいたトレンド追跡取引システムである.この戦略は,連続した同向の後の3つの突破形状を識別し,ADX指標と組み合わせてトレンドの強さを確認し,ATRを使用して動的にストップストップの位置を設定する.この方法は,入場信号の信頼性を保証するとともに,リスクを効果的に制御することができます.

戦略原則

戦略の中核となるロジックには、次の重要な要素が含まれます。

  1. 三線突破形状識別:多頭形状は3連鎖陰線の後でより大きな陽線突破が生じる.空頭形状は3連鎖陽線の後でより大きな陰線突破が生じる.
  2. ADXのトレンド強度確認:現在のトレンド強さを判断するためにADX指標を使用し,ADX値が設定された値 (デフォルト 25) を超える場合にのみ取引シグナルが生成されます.
  3. ATRダイナミックストップストロー:ATR値を動的に使用してストップとストップストローの位置を計算し,ストップストローは2倍ATR,ストップストローは1倍ATRに設定する.
  4. 取引実行ロジック:形状認識とトレンド強度条件が満たされると,システムは自動的にポジション開設操作を実行し,同時に対応するストップ・ロスト・シートを設定する.

戦略的優位性

  1. 信号の信頼性: 価格の形状とトレンド指標の二重確認を組み合わせて,取引信号の信頼性を大幅に向上させる.
  2. リスク制御合理:ATRの動的設定によるストップ・ストロー,市場の変動に応じて自律的にリスク制御パラメータを調整できる.
  3. 体系化度が高い:戦略の論理が明確で,パラメータが調整可能で,体系化された取引が容易である.
  4. 適応性:異なる市場と時間周期に適用でき,普遍性が良好である.

戦略リスク

  1. 偽の突破リスク: 揺れ動いている市場では偽の突破シグナルが発生し,取引の損失を招く可能性があります.
  2. スリップポイントリスク: 市場価格単発入場戦略により,流動性の低い市場では,顕著なスリップポイントに直面する可能性があります.
  3. パラメータ感性:戦略効果はADXの値やATR周期などのパラメータに敏感であり,異なる市場向けに最適化する必要がある.
  4. トレンド依存性: 戦略は,波動的な市場ではうまくいかない可能性があり,トレンドが顕著な市場環境に適している.

戦略最適化の方向性

  1. 形状認識強化:線の実体対影線の比率を考慮するなど,より多くの価格形状検証条件を追加できます.
  2. トレンド確認の改善:MACDや移動平均の交差などの他のトレンド指標を補助確認として導入することができます.
  3. ストップ・ストップ・ロスの最適化:異なる市場特性の動態に応じてATR倍数を調整するか,ストップ・ロスを追跡する方法を採用する.
  4. 取引時間の最適化:取引時間のフィルターを追加して,市場の波動が大きい時期に取引を避ける.

要約する

三線突破動量トレンド追跡戦略は,クラシックな価格形状と技術指標を組み合わせた完全な取引システムである.ADXトレンドフィルターとATRダイナミック風力制御により,この戦略は,取引機会を保証しながらも,リスクをより良く制御している.いくつかの限界があるが,合理的なパラメータの最適化と戦略の改善により,この戦略は,実戦での優れた応用価値を持っている.

ストラテジーソースコード
/*backtest
start: 2024-08-11 00:00:00
end: 2025-02-19 00:00:00
period: 1h
basePeriod: 1h
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)