マルチタイムフレーム波動トレンドフォロワー戦略

WT MTF WaveTrend ATR Trailing Stop TREND-FOLLOWING HLC3
作成日: 2025-07-07 16:04:18 最終変更日: 2025-07-07 16:04:18
コピー: 0 クリック数: 233
2
フォロー
319
フォロワー

マルチタイムフレーム波動トレンドフォロワー戦略 マルチタイムフレーム波動トレンドフォロワー戦略

概要

マルチタイムフレームの波動トレンドトラッカー戦略は,WaveTrend指標に基づくマルチタイムフレームのトレンドトラッカー取引システムである.この戦略は,特に15分間の時間枠に最適化され,三層の時間枠アラインメント方法を使用している. 240分間のWaveTrendはマクロのトレンドフィルターとして使用され,30分間のWaveTrendは動力の確認に使用され,15分間のWaveTrendは信号生成を担当する.

戦略原則

この戦略の核心となる原理は,複数の時間枠でのWaveTrend指標の協同作用を利用してトレンドの方向と転換点を識別することである.WaveTrend指標は,価格とその指数移動平均 (EMA) の関係を計算し,波動的要因と組み合わせて価格の超買い超売り状態を測定する技術的指標である.

戦略の実現過程は以下の通りです.

  1. まず,WaveTrend関数を定義し,2つの主要な値 ((wt1とwt2)) を計算する.

    • 計算価格 ((通常はHLC3) のEMA
    • 価格とEMAの間の絶対差のEMAを計算し,波動性を測定する
    • 比較価格偏差 (ci)
    • c の EMA をwt1 として,wt1 の SMA をwt2 として計算する
  2. 戦略は3つの時間枠でWaveTrendの指標を適用します.

    • 15分グラフ (現在の時間枠) 特定信号生成用
    • 30分グラフは,中期動力の方向を確認するために使用される.
    • 60分チャートはより長期のトレンドの背景を示しています.
  3. 応募条件:

    • 複数行: 15分図でwt1がwt2を上へと横断し,wt1の値が60より大きいとき,また30分図でwt1 > wt2が上へとトレンドする
    • 空白: 15分図のwt1がwt2を下向きに通過し,wt1の値が20より小さいとき,また30分図のwt1 < wt2は下向きにトレンドする
  4. ストップ・ダメージとアウト・メカニズムは複合的な方法で行われます.

    • 固定パーセントのマージナルストップ
    • トレーリング・ストップ (Trailing Stop)
    • 最大利益の撤回による保護的ストップ
  5. 策略は,各取引の入場価格,入場柱,および最大利益率を記録し,追跡します.これらのパラメータは,出場ポイントを動的に調整するために使用されます.

戦略的優位性

  1. 複数の時間枠の連携: 異なる時間枠でWaveTrend指標を分析することにより,戦略は市場トレンドをより全面的に把握し,偽信号干渉を軽減し,取引の正確性を向上させます. 低い時間枠は正確な入場点を提供し,高い時間枠は取引の方向が主動トレンドと一致することを保証します.

  2. ダイナミック・ストップ・メカニズム戦略は,固定パーセントのストップ,利益に基づく追跡ストップ,最大利益の保護メカニズムを含む三重のストップ保護システムを採用しています.この複合ストップ戦略は,資金を保護しながら,トレンドの利益を最大限に捉えることができます.

  3. 視覚フィードバックシステム:取引の入場と出場点は,色彩のラベル ((🔴) によって直観的にグラフにマークされ,また,バックトラッキング分析と取引復習を容易にするために柱数情報を含んでいる.

  4. パラメータの柔軟性戦略は,ストップ・トラッキング・トリガー・パーセンテージ,トラッキング・フォロー・パーセンテージ,最大許容撤回・パーセンテージを含む複数のカスタマイズ可能なパラメータを提供し,ユーザーは自身のリスクの好みや市場の状況に応じて調整することができます.

  5. コード構造が明確です: 戦略は,機能的な設計を採用し,各部分の論理が明確で,理解し,維持しやすく,さらに最適化や拡張を容易にする.

戦略リスク

  1. トレンド転換の反応が遅れている: トレンドフォロー戦略として,トレンドの転換点では後退反応が起こり,トレンドが逆転すると大きな引き下がりが起こる可能性があります. 解決策は,ストップローズパラメータを調整するか,または追加のトレンド転換指標を補助的に追加することです.

  2. 波動的な市場の不具合横横整理または急激に波動する市場環境では,戦略は頻繁に偽シグナルとストップを発生させ,連続的な損失を引き起こす可能性があります. 市場が明らかなトレンドにあることを確認するときにのみこの戦略を起動することをお勧めします.

  3. パラメータ感度戦略のパフォーマンスは,WaveTrendのパラメータ設定 ((n1=10, n2=21) とストップ・ロスのパラメータに相当感受的である.過緩すぎると遅すぎるストップが起こり,過緊すぎると有利なトレンドから早すぎる退出が起こりうる.これらのパラメータは,歴史の反省によって最適化される必要がある.

  4. 流動性のリスク:コードのデフォルトは,相対資金量 ((10%) を使って取引を行うが,低流動性のある市場で,これは滑り点を増加させたり取引が困難になる可能性がある.実際の取引品種の流動性に応じてポジションのサイズを調整すべきである.

  5. 外部データ依存を求めます.策略: request.security() 関数を用いてより高いタイムフレームデータを取得します.これは,特定の取引プラットフォームで遅延またはデータ不可利用性のリスクがあります.取引環境が複数のタイムフレームデータ要求をサポートしていることを確認する必要があります.

戦略最適化の方向性

  1. 動態参数調整:現在の戦略は,固定されたWaveTrendパラメータとストップ割合を使用し,市場の変動 (ATRなど) に応じてこれらのパラメータを動的に調整することを考えることができます.例えば,高い波動環境でストップ距離を増やし,低い波動環境でストップを締め,異なる市場条件に適応します.

  2. トレンド強度フィルター: トレンドの強さを測定するためにADXまたは類似の指標を追加し,トレンドの強さが特定の値を超えるとのみ取引を実行し,弱気または横断市場で過剰な取引を避ける.

  3. タイムフレームの最適化:現在の戦略は,15分,30分および60分の時間枠を使用し,反射分析によって最適な時間枠の組み合わせを特定したり,異なる取引品種の特性に応じて時間枠を調整することができます.

  4. 取引量確認:取引量指標を入場条件に統合し,取引量が支えるトレンドのみで入場することを保証し,信号の質を向上させる.

  5. 試合開始の仕組みの改善:現在の出場は主にストップ・ロスの触発に依存し,利潤目標を追加するか,またはパシブ・ストップのみに依存するのではなく,アクティブ・アウトの条件としてWaveTrend指標自体に基づく反転信号を考慮することができます.

  6. ポジション管理ロジックを追加:現在の戦略は,固定パーセントの資金管理を使用し,波動性または信号強度に基づいてポジションサイズを動的に調整することを考慮し,より確実な取引でポジションを増やし,不確実性の高い取引でリスクの穴を減らすことができます.

要約する

マルチタイムフレームの波動トレンドトラッカー戦略は,マルチタイムフレームのWaveTrend指標の協同作用により,柔軟なトラッキングストップ・メカニズムと組み合わせた,巧妙に設計されたトレンドトラッカーシステムで,市場動向を効果的に捉え,リスクを制御します.この戦略の主要な優点は,市場全体の視点とダイナミックなリスク管理方法にありますが,波動的な市場では挑戦が起こりえます.この戦略は,タイムフレームの選択,ダイナミックなパラメータの調整,追加のフィルター条件の追加により,さらに最適化され,より安定的で適応性の高い取引システムになる可能性があります.

ストラテジーソースコード
/*backtest
start: 2024-07-07 00:00:00
end: 2024-11-28 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("WT-FLOW: MTF WaveTrend Trend-Follower", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// === WaveTrend Fonksiyonu ===
waveTrend(_src, _n1, _n2) =>
    esa = ta.ema(_src, _n1)
    d = ta.ema(math.abs(_src - esa), _n1)
    ci = (_src - esa) / (0.015 * d)
    wt1 = ta.ema(ci, _n2)
    wt2 = ta.sma(wt1, 4)
    [wt1, wt2]

// === Giriş Fiyatı ve Maksimum Kazanç Değişkenleri ===
var float longEntryPrice = na
var float shortEntryPrice = na
var float maxGainLong = 0.0
var float maxGainShort = 0.0
var int longEntryBar = na
var int shortEntryBar = na
var string currentPosition = ""

// === WT Değerlerini Al (Farklı Zaman Dilimleri) ===
var int n1 = 10
var int n2 = 21
ap = hlc3
[wt1_15, wt2_15] = waveTrend(ap, n1, n2)
[wt1_30, wt2_30] = request.security(syminfo.tickerid, "30", waveTrend(ap, n1, n2))
[wt1_60, wt2_60] = request.security(syminfo.tickerid, "60", waveTrend(ap, n1, n2))

// === Kullanıcı Girdileri: Trailing Stop Parametreleri ===
marginStopPerc = input.float(2.0, "Marjinal Stop (%)")
trailTriggerPerc = input.float(1.5, "Trailing Tetikleyici (%)")
trailFollowPerc = input.float(0.8, "Trailing Takip (%)")
trailMaxDropPerc = input.float(3.0, "Maksimum Düşüş (%)")

// === ATR için tr hesaplaması ===
tr = ta.tr(true)

// === Sinyal Koşulları ===
trendUp = wt1_30 > wt2_30
trendDown = wt1_30 < wt2_30
entryLong = ta.crossover(wt1_15, wt2_15) and wt1_15 > -60 and trendUp
entryShort = ta.crossunder(wt1_15, wt2_15) and wt1_15 < 20 and trendDown

// === Pozisyon Girişleri ===
if entryLong and currentPosition != "Long"
    strategy.entry("Long", strategy.long)
    longEntryPrice := close
    maxGainLong := 0.0
    longEntryBar := bar_index
    currentPosition := "Long"
    label.new(bar_index, high + 2 * tr, "🟢 Giriş Long #" + str.tostring(bar_index), style=label.style_label_up, color=color.green, textcolor=color.white)

if entryShort and currentPosition != "Short"
    strategy.entry("Short", strategy.short)
    shortEntryPrice := close
    maxGainShort := 0.0
    shortEntryBar := bar_index
    currentPosition := "Short"
    label.new(bar_index, low - 2 * tr, "🔴 Giriş Short #" + str.tostring(bar_index), style=label.style_label_down, color=color.red, textcolor=color.white)

// === Trailing Stop ve Marjinal Stop Seviyeleri ===
if currentPosition == "Long" and not na(longEntryPrice)
    gainFromEntry = (close - longEntryPrice) / longEntryPrice * 100
    maxGainLong := math.max(maxGainLong, gainFromEntry)
    trailTriggerReached = gainFromEntry >= trailTriggerPerc
    trailStop = close * (1 - trailFollowPerc / 100)
    dropStop = longEntryPrice * (1 + (maxGainLong - trailMaxDropPerc) / 100)
    finalStop = trailTriggerReached ? math.max(trailStop, dropStop) : longEntryPrice * (1 - marginStopPerc / 100)
    if close <= finalStop
        strategy.close("Long")
        label.new(bar_index, low - 2 * tr, "❅ Çıkış Long #" + str.tostring(longEntryBar), style=label.style_label_down, color=color.red, textcolor=color.white)
        longEntryPrice := na
        longEntryBar := na
        currentPosition := ""

if currentPosition == "Short" and not na(shortEntryPrice)
    gainFromEntryShort = (shortEntryPrice - close) / shortEntryPrice * 100
    maxGainShort := math.max(maxGainShort, gainFromEntryShort)
    trailTriggerReachedShort = gainFromEntryShort >= trailTriggerPerc
    trailStopShort = close * (1 + trailFollowPerc / 100)
    dropStopShort = shortEntryPrice * (1 - (maxGainShort - trailMaxDropPerc) / 100)
    finalStopShort = trailTriggerReachedShort ? math.min(trailStopShort, dropStopShort) : shortEntryPrice * (1 + marginStopPerc / 100)
    if close >= finalStopShort
        strategy.close("Short")
        label.new(bar_index, high + 2 * tr, "❄ Çıkış Short #" + str.tostring(shortEntryBar), style=label.style_label_up, color=color.green, textcolor=color.white)
        shortEntryPrice := na
        shortEntryBar := na
        currentPosition := ""