デュアルモメンタムインジケーター共同取引戦略:RSIとMACDブレイクアウトシステム

RSI MACD EMA TAKE PROFIT STOP LOSS
作成日: 2025-08-11 09:27:51 最終変更日: 2025-08-11 09:27:51
コピー: 0 クリック数: 282
2
フォロー
319
フォロワー

デュアルモメンタムインジケーター共同取引戦略:RSIとMACDブレイクアウトシステム デュアルモメンタムインジケーター共同取引戦略:RSIとMACDブレイクアウトシステム

概要

双動量指標協同取引戦略は,技術分析に基づく量化取引システムで,比較的強い指標 ((RSI) と移動平均の収束散散度指標 ((MACD) の優位性を巧妙に組み合わせて,市場の強い上昇傾向を捕捉することに焦点を当てている.この戦略は,多頭取引のみを実行し,動量破裂シグナルを識別し,リスク管理メカニズムと組み合わせることで,体系化された取引意思決定プロセスを実現する.この戦略の核心路線は,RSIとMACDの指標が同時に上昇信号を表示するときに市場を進み,動力が弱くなり,リスク目標に達したときに退出し,トレンド市場の潜在的利益を得ることである.

戦略原則

この戦略は2つの重要な技術指標の協同作用に基づいて動作する. 第一に,戦略はRSI指標を使用して価格の変化の速度と幅を測定し,市場が過買または過売状態にあるかどうかを判断する. 第二に,MACD指標を使用して,市場のトレンドの変化と動力の強さを識別する.

応募条件:

  1. RSIは中線 ((デフォルト50) の下に突破し,MACDは看板状態にある ((MACD線は信号線の上にあり,選択的にMACD値が0より大きいことを要求する)
  2. MACD線は,下から信号線を突破し,RSIは中線位置または上にある.

追加フィルタリング条件:

  1. EMAのトレンドフィルター:価格は指定された周期のEMA平均線より高くなければなりません.
  2. 超売り上下文フィルター: RSIが超売り値を下回った後NのK線内でのみ入場.

出場条件:

  1. RSIが中線上方向から下方へ突破するか
  2. MACD線は,信号線を上から下落し,MACD柱状図は0より小さい;または
  3. 止 (デフォルト3.0%) または止損 (デフォルト1.5%) の目標に達した.

策略は,状態追跡機構を設計し,平仓状態で入場でき,持仓状態で出場できることを保証し,重複信号の問題を回避する.この設計は,入場ごとに1回の出場のみを可能にし,取引論理の明確性と一致性を維持する.

戦略的優位性

  1. シンクロ効果RSIとMACDの2つの指標の優位性を組み合わせて,RSIは価格の変化に迅速に反応し,MACDは中長期のトレンドを確認できます.両者は信号の信頼性を高めます.

  2. 柔軟なフィルタリング戦略は,EMAトレンドフィルターとオーバーセール上下文フィルターの2つのオプションのメカニズムを提供し,トレーダーは異なる市場環境に応じて戦略の適応性を調整することができます.

  3. リスクの管理: 組み込みのストップ・ストップ・メカニズムで,トレーダーが自分のリスク好みに合わせてパーセンテージパラメータを設定し,単一取引のリスクの限界を効果的に制御します.

  4. ステータス管理がクリア: ステータス変数でポジションの状況を追跡し,取引シグナルの一貫性と論理性を確保し,重複の入場または出場の問題を回避する.

  5. 高度なカスタマイズ性戦略は,RSI長さ,MACDパラメータ,フィルタリング条件,リスク管理パラメータを含む複数の調整可能なパラメータを提供し,トレーダーが異なる市場条件と取引品種に応じて最適化できるようにします.

  6. ビジュアルアシスタント: 戦略は,入場/出場マーク,K線色付け,およびトリガー背景表示などの可視化機能を提供し,トレーダーが直観的に理解し,戦略を調整することを容易にします.

戦略リスク

  1. 偽の突破の危険性: 振動的な市場では,RSIとMACDは,連続した損失取引につながる,頻繁に偽の突破信号を生じることがあります. このリスクを緩和するために,波動率指数やトレンド強度指数などの追加の市場環境フィルターを追加することができます.

  2. 一方向取引の制限:この戦略は多頭取引のみを実行し,下向きのトレンドで潜在的空売り機会を逃してしまう.全般的な取引システムでは,対応する空頭戦略を追加することを考慮することができるか,または明確な下向きのトレンドで取引を一時停止することができる.

  3. パラメータ感度: 戦略性能はパラメータ設定に敏感であり,異なる市場と時間枠では異なるパラメータの組み合わせが必要になる可能性がある.複数の市場条件でリターンテストすることによってパラメータを最適化し,自己適応パラメータの方法を使用することを検討することが推奨されている.

  4. リスクの設定:小すぎるストップは,頻繁にトリガーされる可能性があり,多すぎるストップは,単一の過大損失を引き起こす可能性があります. ターゲット市場の波動的特性に応じてストップの割合を調整するか,ATR倍数などのダイナミックストップ方法を使用することを検討してください.

  5. 信号の遅延遅滞指数として,RSIとMACDの信号は,価格が明らかに変化した後に現れ,入場価格と収益率に影響を与える可能性があります. 入場タイミングを最適化するために,より敏感な先行指標と組み合わせることを考慮することができます.

戦略最適化の方向性

  1. 適応パラメータシステム:市場の変動率またはトレンドの強度に基づく自適性パラメータ調整メカニズムを開発し,RSIとMACDのパラメータを現在の市場状況に応じて自動的に最適化し,異なる市場環境における戦略の適応性を向上させる.

  2. 多時間枠分析: 複数の時間枠の確認メカニズムを導入し,例えば,より大きな時間枠でトレンドの方向を確認し,より小さな時間枠で特定の取引を実行することで,偽信号を軽減し,勝率を向上させる.

  3. ダイナミック・ストップ・メカニズム固定パーセンテージストップをATR (平均リアル波幅) に基づくダイナミックストップに変更し,市場の変動に適応し,資金を保護しながら価格に十分な喘息の余地を与えます.

  4. 資金管理の最適化: カリー公式や固定比率リスクモデルのような,口座の純額,波動率,勝率に基づくポジション管理アルゴリズムを導入し,各取引のリスクを現在の口座状態と市場条件にマッチさせる.

  5. 統合市場環境のフィルター: 市場環境 (トレンド,揺れ,または転換) を識別できるフィルターを追加します.例えば,ADX (平均方向指数),波動率指標または周期分析ツール,戦略に適した市場条件下で取引を行うだけです.

  6. 空頭取引の論理を追加する:空頭取引規則を含むように戦略を拡張し,下向きのトレンドでも同様に効果的になるようにして,総合的な取引システムを構築する.

要約する

双動量指数協同取引戦略は,RSIとMACDの2つのクラシック技術指標の優位性を組み合わせて,論理的に明確でリスクが制御可能な量化取引システムを創造する.この戦略は,上昇傾向中の量的な機会を捉え,複数のフィルタリング機構とリスク管理ツールを使用して取引の質を向上させることに焦点を当てている.偽突破やパラメータ感受性などの固有のリスクがあるにもかかわらず,この戦略は,パラメータ適応,複数時間枠分析,ダイナミックリスク管理などの推奨された最適化方向によって,さまざまな市場環境下でのパフォーマンスをさらに向上させる可能性を秘めている.

ストラテジーソースコード
/*backtest
start: 2025-02-28 00:00:00
end: 2025-08-10 00:00:00
period: 3h
basePeriod: 3h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
// Vibe coded by Andrew Grothe 2025-08-08. Adjust the TP/SL on lines 28 & 29 to fine tune the strategy
strategy("RSI + MACD Long-Only Strategy", overlay=true, pyramiding=0, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.0)

// Inputs — RSI
rsiLen  = input.int(14, "RSI Length", minval=1, group="RSI")
rsiOB   = input.int(70, "RSI Overbought", minval=50, maxval=100, group="RSI")
rsiOS   = input.int(30, "RSI Oversold", minval=0,  maxval=50, group="RSI")
rsiMid  = input.int(50, "RSI Midline", minval=0,   maxval=100, group="RSI")

// Inputs — MACD
fastLen = input.int(12, "MACD Fast Length",   minval=1, group="MACD")
slowLen = input.int(26, "MACD Slow Length",   minval=1, group="MACD")
sigLen  = input.int(9,  "MACD Signal Length", minval=1, group="MACD")
requireAboveZero = input.bool(false, "Require MACD > 0 (trend filter)", group="MACD")

// Inputs — Filters & Visuals
useOversoldContext  = input.bool(false, "Entry must be within N bars after RSI < Oversold", group="Signals")
oversoldWindowBars  = input.int(10, "N bars after oversold", minval=1, group="Signals")
useEMATrend         = input.bool(false, "Only Long if price > EMA", group="Signals")
emaLen              = input.int(200, "EMA Length", minval=1, group="Signals")
showMarkers         = input.bool(true, "Plot Entry/Exit Markers", group="Visuals")
colorBars           = input.bool(false, "Color Bars on Signals", group="Visuals")

// Inputs — Risk
// 1 hour = 2.0/1.0, 2 hour = 10.5/2.5
useTPSL             = input.bool(true,  "Use Take Profit / Stop Loss", group="Risk")
tpPerc              = input.float(11.5,  "Take Profit %", minval=0.0, step=0.1, group="Risk")
slPerc              = input.float(2.5,  "Stop Loss %",  minval=0.0, step=0.1, group="Risk")

// Core calculations
rsi = ta.rsi(close, rsiLen)
[macd, macdSignal, macdHist] = ta.macd(close, fastLen, slowLen, sigLen)
emaTrend = ta.ema(close, emaLen)

// Conditions
macdBull = macd > macdSignal and (not requireAboveZero or macd > 0)
rsiBull  = rsi > rsiMid
recentlyOversold = ta.barssince(rsi < rsiOS) <= oversoldWindowBars
trendOk = not useEMATrend or close > emaTrend

// Precompute cross events to avoid conditional execution warnings
rsiCrossUpMid     = ta.crossover(rsi, rsiMid)
macdCrossUp       = ta.crossover(macd, macdSignal)
rsiCrossDownMid   = ta.crossunder(rsi, rsiMid)
macdCrossDown     = ta.crossunder(macd, macdSignal)

// Signals (long-only)
longTrigger = (rsiCrossUpMid and macdBull) or (macdCrossUp and rsi >= rsiMid)
longEntry   = longTrigger and (not useOversoldContext or recentlyOversold) and trendOk
exitSignal  = rsiCrossDownMid or (macdCrossDown and macdHist <= 0)

// Stateful gating so we only get one exit per entry
var bool inLong = false
inLongPrev = barstate.isfirst ? false : inLong[1]
finalLongEntry = longEntry and not inLongPrev
finalExit      = exitSignal and inLongPrev
inLong := (inLongPrev or finalLongEntry) and not finalExit

// Plots
plot(useEMATrend ? emaTrend : na, title="EMA", color=color.orange, linewidth=2)
plotshape(showMarkers and finalLongEntry,  title="Long Entry", style=shape.triangleup,   location=location.belowbar, color=color.lime, size=size.tiny, text="Long")
plotshape(showMarkers and finalExit,       title="Exit",       style=shape.triangledown, location=location.abovebar, color=color.red,  size=size.tiny, text="Exit")
barcolor(colorBars ? (finalLongEntry ? color.lime : finalExit ? color.red : na) : na)

// Debug background to visualize when raw long trigger occurs
bgcolor(longTrigger ? color.new(color.lime, 90) : na)

// Alerts
//alertcondition(finalLongEntry,  title="RSI+MACD Long Entry", message="RSI+MACD Long Entry on {{ticker}} {{interval}} at {{close}}")
//alertcondition(finalExit,       title="RSI+MACD Exit",       message="RSI+MACD Exit on {{ticker}} {{interval}} at {{close}}")

// Strategy Orders — Long only
if finalLongEntry
    strategy.entry("Long", strategy.long)

// Protective exits (TP/SL) while in position
if useTPSL and strategy.position_size > 0
    longSL = strategy.position_avg_price * (1 - slPerc / 100.0)
    longTP = strategy.position_avg_price * (1 + tpPerc / 100.0)
    strategy.exit("Long TP/SL", from_entry="Long", stop=longSL, limit=longTP)

// Signal-based exit
if finalExit and strategy.position_size > 0
    strategy.close("Long", comment="Signal Exit")