ダイナミックトレーリングストップを使用した角度ベースのVWMAトレンドフォロー戦略

VWMA EMA MA PVSRA Angle BIAS
作成日: 2025-02-18 13:42:01 最終変更日: 2025-02-18 13:42:01
コピー: 2 クリック数: 356
1
フォロー
1617
フォロワー

ダイナミックトレーリングストップを使用した角度ベースのVWMAトレンドフォロー戦略

概要

これは,ボリューム・ウェイト・ムービング・エーバーン (VWMA) とインデックス・ムービング・エーバーン (EMA) に基づくトレンド追跡戦略で,価格角度分析とダイナミック・トラッキング・ストップ・メカニズムを組み合わせている.この戦略は,主にVWMAとFMAの交差を監視し,価格運動の角度条件と組み合わせて,入場タイミングを決定し,パーセントのストップ・トラッキングを使用してリスクを管理する.

戦略原則

戦略の中核となるロジックは、次の主要な要素に基づいています。

  1. 25サイクルVWMAを主要トレンド指標として使用
  2. 8周期VWMAを通って高速信号線として
  3. 50サイクルEMAを使用し,より長期のトレンドを決定する
  4. 50サイクルEMAの角度を計算する (値を45度に設定する)
  5. 市場偏差フィルターとして選択可能な200周期EMA 入場信号は,速動平均と主VWMAが交差し,価格角度が条件を満たしたときにトリガーされる.戦略は,1%の動的追跡ストップによって利益を保護する.

戦略的優位性

  1. 複数のタイムフレームで検証 - 戦略はH1以上およびM1タイムフレームで良好なパフォーマンスを発揮します.
  2. 角度フィルター - 価格運動の角度条件を導入することにより,偽突破を減らす
  3. リスク管理の改善 - ストップ・ロスの追跡率,利潤の動的保護
  4. 適応性 - 異なる市場条件にパラメータで適応できる
  5. トレンド確認充分 - 多重移動平均を用いたトレンドのクロス確認

戦略リスク

  1. 横盤市場では頻繁に偽信号が生じる可能性がある.
  2. 入場時間が遅れている - 多重確認を使用しているため,トレンドの初期にいくつかのチャンスを逃す可能性があります
  3. M15 タイムフレームは不適切で,このタイムフレームは使用しないようにしましょう.
  4. パラメータの感受性 - 角度値と移動平均周期の選択は,戦略の性能に大きな影響を与える
  5. トラッキングストップは,早めに出場する可能性がある - 波動的な市場では早めにストップする可能性がある

戦略最適化の方向性

  1. 波動率自己適応機構の導入 - 市場波動率の動的調整によるストップ・ロースの割合の追跡
  2. 交差量フィルターを増やす - 交差量確認によって信号品質を向上させる
  3. 角度を最適化する計算方法 - 適応角度の値を使用することを考慮する
  4. 市場状態認識への参加 - 傾向/震動市場認識メカニズムの開発
  5. 価格の形状と動態指標を組み合わせた出場タイミングの最適化

要約する

これは,角度分析と複数の移動平均の組み合わせによって,よく構築されたトレンド追跡戦略であり,主要なトレンドで優れたパフォーマンスを得ることができます.一定の遅れとパラメータの感受性の問題があるにもかかわらず,推奨された最適化の方向によって,戦略は向上する余地があります.長時間周期のトレンド取引に特に適しています.

ストラテジーソースコード
/*backtest
start: 2024-02-18 00:00:00
end: 2024-10-16 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("PVSRA Trailing Strategy with Angle Condition (40-50 degrees)", overlay=true)

// === INPUTS ===
priceData = input.source(close, title="Price Data")
maLength  = input.int(25, title="Moving Average Length", minval=2)
useBias   = input.bool(false, title="Long/Short just above/below 200 EMA")
useTrailing = input.bool(true, title="Use Trailing Stop")
trailPerc  = input.float(1.0, title="Trailing Stop Percentage", minval=0.1)
anglePeriod = input.int(14, title="Period for Angle Calculation", minval=1)

// === CÁLCULOS ===
maValue = ta.vwma(priceData, maLength)
maLong  = ta.ema(high, 50)
maShort = ta.ema(low, 50)
maFast  = ta.vwma(close, 8)
bias    = ta.ema(close, 200)
longBias  = useBias ? close > bias : true
shortBias = useBias ? close < bias : true

// === CÁLCULO DO ÂNGULO DA MÉDIA MÓVEL DE 50 ===
ma50 = ta.ema(close, 50)
angle = math.atan((ma50 - ma50[anglePeriod]) / anglePeriod) * (180 / math.pi)  // Converte radianos para graus

// === CONDIÇÃO DE ÂNGULO ===
validAngleL = angle >= 45
validAngleS = angle <= 45

// === PLOTS ===
plot(maValue, color=color.orange, title="Moving Average")
plot(maFast, color=color.green, title="Fast MA")
plot(ma50, color=color.blue, title="50 EMA")

plotshape(series=(strategy.position_size > 0) ? maValue : na,
     color=color.red, style=shape.circle, location=location.absolute,
     title="Long Stop")

plotshape(series=(strategy.position_size < 0) ? maValue : na,
     color=color.red, style=shape.cross, location=location.absolute,
     title="Short Stop")

// === CONDIÇÕES DE ENTRADA ===
enterLong  = close > maValue and ta.crossover(maFast, maValue) and close > maLong and longBias and validAngleL
enterShort = close < maValue and ta.crossunder(maFast, maValue) and close < maShort and shortBias and validAngleS

// === CONDIÇÕES DE SAÍDA ===
exitLong  = ta.crossunder(maFast, maValue) and strategy.position_size > 0
exitShort = ta.crossover(maFast, maValue) and strategy.position_size < 0

// === EXECUÇÃO DA ESTRATÉGIA ===
if (enterLong)
    strategy.entry("EL", strategy.long)

if (enterShort)
    strategy.entry("ES", strategy.short)

if (exitLong or exitShort)
    strategy.close_all()

// === TRAILING STOP ===
if (useTrailing and strategy.position_size > 0)
    trailPrice = close * (1 - trailPerc / 100)
    strategy.exit("Trailing Long", from_entry="EL", stop=trailPrice)

if (useTrailing and strategy.position_size < 0)
    trailPrice = close * (1 + trailPerc / 100)
    strategy.exit("Trailing Short", from_entry="ES", stop=trailPrice)