デュアル移動平均トレンドフォロー戦略


作成日: 2024-03-22 13:56:44 最終変更日: 2024-03-22 13:56:44
コピー: 1 クリック数: 501
1
フォロー
1617
フォロワー

デュアル移動平均トレンドフォロー戦略

概要 概要

この戦略は,2つの移動平均線の交差を利用して,市場のトレンドの転換を判断し,トレンドに応じて取引を行います. 短期平均線上を通過する際は多行し,短期平均線下を通過する際は空きを取って,トレンドの方向に従います.

戦略の原則

この戦略の核心は,2つの移動平均線である:急速平均線 ((デフォルト周期は32)) と遅い平均線 ((デフォルト周期も32で,パラメータで調整できます). 終盤価格上/下でこの2つの平均線を貫通すると,トレンドの逆転が起こり,戦略はそれに従って買入シグナルを生成します.

  • スロー・平均線を高速・平均線に 越える時,もっとやれ
  • 速平均線の下をゆっくり平均線を通るときに空きを取ります.
  • 複数個を保有しているとき,速平均線を下にゆっくり平均線を穿え,平多を空にする
  • 空券を持っているとき,速平均線でゆっくりとした平均線を横断し,空空にして多めにします.

この均線交差によって,戦略はトレンドをたどり,上昇トレンドで多項を保持し,下降トレンドで空券を保持し,トレンドの反転信号が出るまで続けることができます.

アドバンテージ分析

  1. トレンド・トラッキング:この戦略は,均線交差判断によってトレンドを判断し,市場における主要なトレンドを効果的に捉え,それに順応する.
  2. シンプルで使いやすい:戦略の論理が明確で,平均線が2つしか使われず,パラメータ設定がシンプルで,理解しやすく,習得しやすい.
  3. 適用範囲:戦略は品種と周期に広く適用され,複数の市場で使用できます.
  4. タイムリーストップ:トレンドが逆転したときに,戦略はタイムリーでポジションを平らにして,損失をコントロールする.

リスク分析

  1. 振動市場では不良: 市場が振動状態にあるとき,頻繁に交差するシグナルは,戦略が頻繁に取引され,損失がより多くなる原因となる.
  2. 緊急事態への不十分な対応: 極端な状況 (例えば,急上昇または暴落) に直面する際,戦略は不十分に反応し,大きな損失を招く可能性があります.
  3. 参数最適化は困難である.平均線参数最適化は,大量の歴史的データと反省を必要とし,参数が将来の効果に対する指針性は限られている.

上記のリスクに対して,ATRまたは平均リアル波幅のフィルターなどの適切なフィルターを追加し,波動的な市場の過剰取引を減らすことを考えることができます. 合理的なストップを設定し,単発的な損失を制御し,市場に対応するためにパラメータを継続的に最適化することができます. しかし,戦略自体には限界があります.

オプティマイゼーション・ディレクション

  1. トレンド確認: トレードシグナルが生成された後に,MACD,DMIなどのトレンド確認指標を追加して,さらにシグナルをフィルターすることができます.
  2. ダイナミックストップ: 固定パーセントや価格ストップではなく,ATRなどの指標に基づいてダイナミックストップを設定することで,リスクをよりよく制御できます.
  3. ポジション管理:トレンドの強さ,波動率などの指標に応じて,ポジションの大きさを動的に調整し,トレンドが強いときはポジションを大きくし,トレンドが弱いときはポジションを小さくする.
  4. 多周期多レベル:日線+4時間線などの多レベルの均線システムを考慮し,相互にフィルターして確認し,トレンド把握の正確性を向上させる.
  5. パラメータ自適化: 遺伝的アルゴリズムなどの自適化パラメータ最適化方法の導入により,戦略パラメータが異なる市場状態に適応できるようにする.

上記の最適化は,複雑な市場に対応する戦略の能力を向上させることができるが,過剰な最適化は,曲線フィットにつながり,将来の不良パフォーマンスを引き起こす可能性があることに注意する必要がある.

概要 概要

双均線トレンド追跡戦略は均線交差でトレンドを捕捉し,使いやすい,適用性の高い特徴がある.しかし,それは振動的な市場ではうまく機能せず,極端な状況への対応が不十分であり,パラメータの最適化が困難である.より多くのフィルタリング指標,ダイナミックストップ損失,ポジション管理,多周期結合,パラメータ自適応などの方法を導入することにより,戦略を最適化することができる.しかし,均線戦略自体は,完全な規則を回避する制限があるが,実盤では,市場特性に合わせて柔軟に調整する.全体的に,この戦略は,トレンド追跡の基礎策として使用できますが,単独では不十分であり,組立戦略の一部として最適です.

ストラテジーソースコード
/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5

//study(title="Demo - SSL Basic", shorttitle="Demo - SSL Basic", overlay=true)
strategy(title='Demo - SSL Basic', shorttitle='Demo - SSL Basic', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, commission_value=0.15)

// Backtest Date Range
start_date_long = input(title='Backtest Long Start Date', defval=timestamp('01 Jan 2018 00:00 +0530'))
end_date_long = input(title='Backtest Long End Date', defval=timestamp('25 Jan 2030 00:00 +0530'))
backtest_range = true

// Inputs
maType = input.string(title='SSL MA Type', options=['SMA', 'EMA', 'WMA'], defval='SMA')
sslLen = input(title='SSL Length', defval=32)
showCross = input(title='Show Crossover?', defval=true)
showEntry = input(title='Show Entry?', defval=true)
showTrend = input(title='Show Trend Colors?', defval=true)

// Calc MA for SSL Channel
calc_ma(close, len, type) =>
    float result = 0
    if type == 'SMA'  // Simple
        result := ta.sma(close, len)
        result
    if type == 'EMA'  // Exponential
        result := ta.ema(close, len)
        result
    if type == 'WMA'  // Weighted
        result := ta.wma(close, len)
        result    
    result

// Add SSL Channel
maHigh = calc_ma(high, sslLen, maType)
maLow = calc_ma(low, sslLen, maType)
Hlv = int(na)
Hlv := close > maHigh ? 1 : close < maLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? maHigh : maLow
sslUp = Hlv < 0 ? maLow : maHigh
ss1 = plot(sslDown, title='Down SSL', linewidth=2, color=showTrend ? na : color.red)
ss2 = plot(sslUp, title='Up SSL', linewidth=2, color=showTrend ? na : color.lime)

// Conditions
longCondition = ta.crossover(sslUp, sslDown)
shortCondition = ta.crossover(sslDown, sslUp)

// Strategy
if shortCondition
    strategy.close('Long', comment='Long Exit', alert_message='JSON')

if longCondition
    strategy.close('Short', comment='Short Exit', alert_message='JSON')

if backtest_range and longCondition
    strategy.entry('Long', strategy.long, comment='Long Entry', alert_message='JSON')

if backtest_range and shortCondition
    strategy.entry('Short', strategy.short, comment= 'Short Entry', alert_message='JSON')


// Plots
fill(ss1, ss2, color=showTrend ? sslDown < sslUp ? color.new(color.lime, transp=75) : color.new(color.red, transp=75) : na, title='Trend Colors')