サポートとレジスタンスの突破戦略とトレンドADXフィルターの定量取引システム

ADX SMA 支撑阻力位 趋势滤波器 突破策略 枢轴点 动向指标 风险管理
作成日: 2025-05-30 11:58:27 最終変更日: 2025-05-30 11:58:27
コピー: 0 クリック数: 367
2
フォロー
319
フォロワー

サポートとレジスタンスの突破戦略とトレンドADXフィルターの定量取引システム サポートとレジスタンスの突破戦略とトレンドADXフィルターの定量取引システム

概要

支柱のレジスタンス突破策とトレンド-ADXフィルター量化取引システムは,技術分析における支柱のレジスタンス位の識別,トレンド確認,市場強さの検証を組み合わせた総合的な取引戦略である.この戦略は,市場価格が重要な価格レベルに突破する行動をベースに,移動平均線と平均方向指数 ((ADX)) をフィルターとして使って取引信号の信頼性を高める.システムは1時間の時間枠を採用し,枢軸高点と低点を識別して動的な支柱のレジスタンス突破区域を構築し,価格がこれらの領域に突破すると取引信号を発信し,同時にリスクを制御するために固定パーセントのストップダストメカニズムを設定する.

戦略原則

この戦略の核心原則は,価格が重要なサポートレジスタンス位置を突破した行動に基づいている.トレンドの方向と市場の強さのフィルタリングを組み合わせて,完全な取引システムを形成する.具体的実施原則は,以下のとおりである.

  1. 抵抗位の識別システムでは,重要な価格レベルを識別するためにピボットポイントを使用します.ta.pivothighそしてta.pivotlow函数,軸高点と低点を5周期でデフォルトパラメータとして計算し,それらのポイントを潜在的抵抗位とサポート位として位置付けます.

  2. ダイナミックな地域管理: システムで配列構造を使用supportLevelsそしてresistanceLevels抵抗位を保存し,カスタム関数でサポートします.f_add_levelこれらの価格レベルをスマートに管理する.この関数は,新たに追加されたレベルが既存のレベルから十分な距離を保ち,地域過度の混雑を防止し,最多5つの最新のレベルを保持することを制限する.

  3. トレンド確認フィルター: 戦略は50周期単調移動平均 ((SMA) をトレンド方向の指標として使用する. 価格が平均線上にある場合にのみ多額を考慮し,平均線下にある場合にのみ空白を考慮し,その結果,全体的な市場傾向に従います.

  4. 市場強度検証: ADX (平均方向指数) 機能をカスタマイズして市場の強さを評価する. ADX値は設定された値 (デフォルト 25) よりも高くなければなりません. 市場の十分な強さがある場合にのみ取引を開始し,弱い市場の環境で偽の突破を避けるようにします.

  5. 入力信号生成:

    • 多頭シグナル:価格が下からサポートを突破したとき (低点はサポートより下だが,閉じる価格はサポートより上) と同時に価格が50周期平均線上にあり,ADX値が値より高いときをトリガーする.
    • 空頭シグナル:価格が上からレジスタンスレベルを突破したとき (高点がレジスタンスレベルより高く,閉店価格はレジスタンスレベルより低い),価格が50周期平均線の下にあり,ADX値が値より高いときにトリガーされます.
  6. リスク管理機構: 戦略は固定パーセントのストップ・ストップ・損失設定,多頭先のデフォルト設定は15%のストップ・損失と10%のストップ・損失,空頭先のデフォルト設定は10%のストップ・損失と10%のストップ・損失を使用する. 価格がこれらのレベルに達すると,システムは自動的に平仓し,取引状態を再設定する.

戦略的優位性

この戦略は,コードの詳細な分析に基づいて,以下の顕著な利点があります.

  1. 複数の認証メカニズム: サポート・レジスタンス・ブレイク,トレンド・ディレクション,ADX強度と組み合わせたトリプル確認により,偽のブレイクのリスクが効果的に軽減されます. 単一の指標と比較して,複数の確認メカニズムにより取引信号の信頼性が向上します.

  2. ダイナミックなサポートレジスタンス領域システム: サポート・レジスタンスレベルを動的に識別し管理し,異なる市場環境に適応します. 最新のサポート・レジスタンスレベルを最大5つ保持し,最も関連する価格レベルに戦略が焦点を当てることを保証します.

  3. スマート地域集群:最大ゾーン幅の百分数パラメータ ((maxZoneWidthPct) を使って,近すぎた支柱抵抗位の再計算を回避し,冗長な信号を減らす.

  4. ADXのカスタム計算: カスタムADX関数を使用し,実際の波幅,方向移動および滑らかな処理を直接計算して,指標計算の正確性と柔軟性を確保する.

  5. フレキシブルなパラメータ配置: 戦略は,軸長,回帰周期,最大領域幅,ストップ・ストップ・損失パーセント,ADX値など,複数の可調パラメータを提供しており,ユーザーは異なる市場条件と取引好みに応じて最適化することができます.

  6. リスク管理は明確です: 既定のストップ・ストップ・損失パーセントによって,各取引に明確なリスク管理の枠組みを提供し,単一取引の過度の損失を防止し,合理的な利益をロックします.

  7. 視覚化して直感的に戦略: サポートレジスタンスと取引シグナルをグラフでマークし,色コードで ((サポートレジスタンス緑,レジスタンス赤) とラベル ((LONG,SHORT,EXIT) で直感的な視覚フィードバックを提供し,分析とリアルタイム監視を容易にします.

戦略リスク

この戦略は合理的に設計されていますが,以下の潜在的なリスクと限界があります.

  1. 波動的な市場における偽の突破: 高い波動の市場環境では,価格がサポートのレジスタンスレベルを頻繁に突破した後,元の区間に戻り,偽の突破シグナルの増加を引き起こす可能性があります. 解決策: 確認周期を増やすことを考慮して,突破後に価格が一定期間維持されるか,特定の形状を形成して確認シグナルを得るように要求することができます.

  2. 歴史的なサポート・レジスタンスに過度に依存する策略は,市場構造が根本的に変化したときに (重大ニュースイベントなど) これらの歴史的レベルが失効する可能性がある,歴史的に形成されたサポート・レジスタンスレベルに基づいています. 解決策: 市場変動に応じてサポート・レジスタンスレベルを自動的に調整するダイナミックな調整メカニズムを追加することを検討できます.

  3. 固定パーセンテージストップ損失の限界: 固定パーセントのストップローズは,すべての市場環境に適さない場合があり,波動が低い市場では過大であり,波動が大きい市場では過小である場合がある. 解決方法: 動的にストップローズレベルをATR (実際の波幅) に基づいて調整することを考慮することができます.

  4. トレンド反転リスク:50サイクルSMAをトレンド指標として使用すると,トレンドの逆転初期に反応が遅れて,トレンドが終わろうとしているときにまだ順調に入場することになります. 解決策:より敏感な短期トレンド指標または動量指標を補助判断として追加することを考えることができます.

  5. 計算密集型戦略戦略は,複数の配列と指標をリアルタイムで計算し,維持する必要があり,高頻度取引やリソースの限られた環境ではパフォーマンス上の課題に直面することがあります. 解決策:アルゴリズムの効率を最適化し,不要な計算を減らすか,更新頻度を減らすことを検討します.

  6. パラメータ感度策略性能はパラメータ設定 (枢軸長さ,ADX値など) に敏感であり,パラメータ選択が不適切である場合,過剰取引または機会を逃す可能性があります. 解決方法:異なる市場条件下でのパラメータのパフォーマンスを再測し,パラメータ最適化フレームワークを構築する.

戦略最適化の方向性

戦略のコードを分析した結果,以下のような最適化方向が考えられます.

  1. 適応パラメータ機構:市場の変動率に応じて重要なパラメータを自動的に調整するメカニズムを導入する.例えば,ADXの値またはサポートレジスタンス領域の幅を高波動期に増やし,低波動期にこれらのパラメータを下げ,戦略を異なる市場環境により良く適応させる.これは,不適切な市場条件下で誤った取引を減らすことができる.

  2. 多時間枠分析: より高い時間枠のサポートレジスタンスレベルを確認する. 日線または周線グラフのサポートレジスタンスレベルが現在の1時間グラフのレベルと一致しているかどうかをチェックすることによって,より強い,複数の時間枠で承認された重要な価格領域を識別し,信号の質を向上させることができます.

  3. 取引量確認:取引量分析と組み合わせて,ブレークの有効性を検証する.本当に有効なブレークは,通常,取引量の大幅な増加に伴い,取引量フィルター条件を追加することで,取引量の低さによる偽ブレークのリスクを減らすことができます.

  4. ダイナミックストップストップ: 市場の変動率 (ATRなど) に基づいて,固定パーセントではなく,動的にストップ・ローズレベルを設定する.これは,リスク管理をより柔軟にして,現在の市場条件に合わせて,保護レベルを自動的に調整し,波動性高い市場ではより緩やかなストップ・ローズを設定し,波動性低い市場ではより緊密なストップ・ローズを設定することができる.

  5. 部分的利益封鎖機構: 一定の利益レベルに達した後にコスト価格にストップを移動したり,利益の一部をロックしたりすることを許可する分期利益のメカニズムを導入する.この方法は,高い利益の可能性を維持しながら,撤回リスクを低減することができる.

  6. 感情指標を統合する: 市場情緒指標の統合を考慮する (VIXや相対的に強い指標など) 追加のフィルタリング条件として. 市場情緒は,ブレイクの持続可能性に影響を及ぼす傾向があり,情緒分析の次元を増やすことで,戦略の市場状態の理解を向上させることができます.

  7. サポート抵抗の強度等級: 支持抵抗位強度評価機構を導入し,歴史テスト回数,形成時間長さなどの要因に基づいて各レベルに強度評価を行う.こうして,より強く,効果的反応を起こす可能性が高い価格レベルに優先する.

  8. 機械学習の最適化: マシン・ラーニング・メソッドを使用してパラメータ選択とシグナル生成を最適化することを検討する. マシン・ラーニング・アルゴリズムは,歴史データから成功と失敗の取引パターンを分析することによって,最も効果的なパラメータ組み合わせと市場条件を識別するのに役立ちます.

要約する

サポートレジスタンスブレイク戦略とトレンド - ADXフィルター定量取引システムは,技術分析の複数の重要な要素を組み合わせた,設計された総合的な取引システムである. この戦略は,サポートレジスタンスビートを動的に識別し,監視し,トレンドの方向と市場の強さのフィルタリングを組み合わせて,比較的信頼性の高い取引シグナル生成メカニズムを作成する.

戦略の核心的な優点は,その複数の確認機構と完善したリスク管理フレームワークが,偽突破のリスクを効果的に低減し,単一の取引の潜在的な損失を制限していることです. 同時に,戦略は,個人リスクの好みと市場環境に応じて柔軟に調整できるように,豊富なパラメータ配置オプションを提供します.

しかし,この戦略は,高度な波動性のある市場における偽突破のリスク,固定ストップ・ストップ・ロスの限界,およびパラメータの感受性などのいくつかの課題に直面しています. 適応パラメータの仕組み,マルチタイムフレーム分析,取引量確認,ダイナミックリスク管理などの最適化措置を導入することによって,戦略の性能はさらに向上する見込みがあります.

全体として,これは論理的に明確で合理的に設計された量化取引戦略であり,技術的分析と市場構造の理解のあるトレーダーに適しています. 継続的な最適化と市場の変化に適応することによって,この戦略は異なる市場環境で安定したパフォーマンスを維持する可能性があります.

ストラテジーソースコード
/*backtest
start: 2024-05-30 00:00:00
end: 2025-05-29 00:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("S/R Breakout Strategy (1H) with Trend and ADX Filter", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// ─────────────────────────────────────────────────────────────
// INPUTS
// ─────────────────────────────────────────────────────────────
pivotLen        = input.int(5, title="Pivot Length")
lookbackBars    = input.int(300, title="Lookback Bars")
maxZoneWidthPct = input.float(2.0, title="Max Zone Width %")
tpLong          = input.float(0.15, title="Take Profit % (Long)")
slLong          = input.float(0.10, title="Stop Loss % (Long)")
tpShort         = input.float(0.10, title="Take Profit % (Short)")
slShort         = input.float(0.10, title="Stop Loss % (Short)")
allowLong       = input.bool(true, title="Allow Long Trades")
allowShort      = input.bool(true, title="Allow Short Trades")

// ADX settings
adxThreshold    = input.float(25.0, title="ADX Threshold")
adxLen          = input.int(14, title="ADX Length")

// Trend filter: 50-period moving average
ma50 = ta.sma(close, 50)

// ─────────────────────────────────────────────────────────────
// CUSTOM ADX FUNCTION
// ─────────────────────────────────────────────────────────────
// This function calculates ADX using the common method based on true range,
// directional movement and smoothing it with the RMA.
f_adx(len) =>
    // true range for the current bar
    tr = ta.tr
    // Calculate upward and downward moves
    upMove   = high - high[1]
    downMove = low[1] - low
    // Determine directional movements
    plusDM  = (upMove > downMove and upMove > 0) ? upMove : 0.0
    minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0
    // Smooth the values using RMA (running moving average)
    smPlusDM  = ta.rma(plusDM, len)
    smMinusDM = ta.rma(minusDM, len)
    smTR      = ta.rma(tr, len)
    // Calculate the directional indicators, avoid division by zero
    plusDI  = (smTR != 0) ? 100 * smPlusDM / smTR : 0.0
    minusDI = (smTR != 0) ? 100 * smMinusDM / smTR : 0.0
    diSum   = plusDI + minusDI
    dx      = (diSum != 0) ? 100 * math.abs(plusDI - minusDI) / diSum : 0.0
    // Smooth the DX to get ADX
    ta.rma(dx, len)

// Compute ADX value using the custom function
adxValue = f_adx(adxLen)

// ─────────────────────────────────────────────────────────────
// PIVOT DETECTION & SUPPORT/RESISTANCE LEVELS
// ─────────────────────────────────────────────────────────────
pivotHigh = ta.pivothigh(high, pivotLen, pivotLen)
pivotLow  = ta.pivotlow(low, pivotLen, pivotLen)

// Declare arrays for support and resistance levels
var float[] supportLevels    = array.new_float()
var float[] resistanceLevels = array.new_float()

// Function to add a level into the provided array if it meets the criteria.
// Always returns a float (0.0) for consistency.
f_add_level(arr, newLevel) =>
    if array.size(arr) == 0
        array.push(arr, newLevel)
    else
        shouldAdd = true
        for i = 0 to (array.size(arr) - 1)
            existing = array.get(arr, i)
            if math.abs(existing - newLevel) / newLevel * 100 <= maxZoneWidthPct
                shouldAdd := false
        if shouldAdd
            array.push(arr, newLevel)
            if array.size(arr) > 5
                array.shift(arr)
    0.0

// Update support and resistance arrays once sufficient bars have formed
if bar_index > pivotLen * 2
    if not na(pivotLow)
        f_add_level(supportLevels, pivotLow)
    if not na(pivotHigh)
        f_add_level(resistanceLevels, pivotHigh)

// ─────────────────────────────────────────────────────────────
// TRADE MANAGEMENT VARIABLES
// ─────────────────────────────────────────────────────────────
var bool   inTrade    = false
var bool   isLong     = false
var float  entryPrice = na

// Signal flags
longSignal  = false
shortSignal = false

// Detect long signal: price crosses above support level
if array.size(supportLevels) > 0
    for i = 0 to (array.size(supportLevels) - 1)
        lvl = array.get(supportLevels, i)
        if low < lvl and close > lvl
            longSignal := true

// Detect short signal: price crosses below resistance level
if array.size(resistanceLevels) > 0
    for i = 0 to (array.size(resistanceLevels) - 1)
        lvl = array.get(resistanceLevels, i)
        if high > lvl and close < lvl
            shortSignal := true

// ─────────────────────────────────────────────────────────────
// ENTRY CONDITIONS & EXECUTION
// ─────────────────────────────────────────────────────────────
if not inTrade
    // Long entry: require long signal, price above 50MA, and ADX above threshold
    if allowLong and longSignal and close > ma50 and adxValue > adxThreshold
        strategy.entry("Long", strategy.long)
        label.new(x=bar_index, y=low, text="LONG", xloc=xloc.bar_index, style=label.style_label_up, color=color.green, textcolor=color.white)
        entryPrice := close
        isLong     := true
        inTrade    := true
    // Short entry: require short signal, price below 50MA, and ADX above threshold
    else if allowShort and shortSignal and close < ma50 and adxValue > adxThreshold
        strategy.entry("Short", strategy.short)
        label.new(x=bar_index, y=high, text="SHORT", xloc=xloc.bar_index, style=label.style_label_down, color=color.red, textcolor=color.white)
        entryPrice := close
        isLong     := false
        inTrade    := true

// ─────────────────────────────────────────────────────────────
// EXIT CONDITIONS
// ─────────────────────────────────────────────────────────────
if inTrade
    ret = isLong ? (close - entryPrice) / entryPrice : (entryPrice - close) / entryPrice
    tp  = isLong ? tpLong : tpShort
    sl  = isLong ? slLong : slShort
    if ret >= tp or ret <= -sl
        strategy.close_all()
        label.new(x=bar_index, y=close, text="EXIT", xloc=xloc.bar_index, style=label.style_label_left, color=color.orange, textcolor=color.black)
        inTrade    := false
        entryPrice := na

// ─────────────────────────────────────────────────────────────
// ALERT CONDITIONS
// ─────────────────────────────────────────────────────────────
alertcondition(longSignal and allowLong, title="Long Breakout", message="🚀 Long breakout on {{ticker}} at {{close}}")
alertcondition(shortSignal and allowShort, title="Short Breakout", message="🔻 Short breakout on {{ticker}} at {{close}}")