RSI MAクロスオーバースイングトレード戦略(トレーリングストップシステム付き)

RSI MA CROSSOVER TRAILING SL Swing Trading risk management
作成日: 2025-04-24 16:51:14 最終変更日: 2025-04-24 16:51:14
コピー: 4 クリック数: 349
2
フォロー
319
フォロワー

RSI MAクロスオーバースイングトレード戦略(トレーリングストップシステム付き) RSI MAクロスオーバースイングトレード戦略(トレーリングストップシステム付き)

概要

この戦略は,RSI ((相対的に強い指数) とその移動平均 ((MA) を交差した振動取引戦略であり,4時間チャートに設計されている.この戦略は,RSIとMAの金叉と死叉を通じて取引信号を生成し,固定ストップ/ストップ,ストップ・ロスを追跡する,逆転退出の仕組みを含む複数のリスク管理ツールと組み合わせている.この戦略は,連続損失の制限を設定し,連続損失が2回を超えると,次の日まで取引を停止する.

戦略原則

  1. 時間枠の制限戦略は4時間チャートのみで動作し,取引シグナルが設計された時間周期と一致することを保証します.
  2. 指標計算:RSI ((デフォルト長さ14) とその移動平均 ((SMAまたはEMA,デフォルト長さ14) を使って信号を生成する。
    • フォークはRSIにMAを突っ込み,買い信号を発する.
    • 死叉 ((RSIの下のMA穿越) は,セールシグナル ((空調) を引き起こす.
  3. ポジション管理: 各取引の資本配分と現在の価格に基づいてポジションの大きさを計算する.
  4. 退出メカニズム
    • 固定ストップパーセンテージ設定によるストップ損失 (デフォルト1.5%) とストップストップ (デフォルト2.5%)
    • ストップ・ロスを追跡する: 価格が最高点から指定した数点 (デフォルトは10点) を引き戻すと退出をトリガーします.
    • 逆転退出逆転の合図が出ると平仓する.
  5. リスク管理
    • 連続して2回の損失の後,取引を一時停止し,毎日の9:15に損失計数を再設定する.

優位分析

  1. 多次元信号検証RSIとMAのダブルフィルタリングにより,偽信号を減らす.
  2. ダイナミックなリスク管理追随ストップは利益をロックし,固定ストップは損失を制限する.
  3. 厳しい資金管理資本の配置を基にポジションを配置し,過剰なレバレッジを避ける.
  4. 規律的なコントロール感情的な取引を防ぐために,連続損失の停止メカニズムがあります.
  5. ビジュアルマーク: 明確なグラフマークは,信号と出口を迅速に識別するのに役立ちます.

リスク分析

  1. パラメータ感度:RSIとMAの長さは信号の質に大きな影響を与えるので,市場の波動に適応するために最適化する必要があります.
  2. トレンド市場のパフォーマンス強いトレンドでは,RSIは長期にわたって超買い/超売れ,信号の遅延を引き起こす可能性があります.
  3. 時間枠の制限: 4時間チャートのみ適用,他の周期は再確認が必要です.
  4. 継続的な損失のリスク損失計算器をリセットする前に,潜在的利益の機会を逃してしまうかもしれない.
    解決方法
  • 経歴回帰による最適化パラメータ.
  • トレンド指標 ((ADXなど) と組み合わせたフィルタリング信号。
  • 動的損失計数値を設定する

最適化の方向

  1. 多指標融合: MACDまたはブリン帯の強化信号確認を導入する.
  2. 動態参数調整: RSIの長さとストップレスの割合は市場の変動に合わせて調整されます.
  3. タイムフレームの拡張: テスト戦略は,より高いまたはより低い周期 (例えば日線/1時間) でのパフォーマンスを示す.
  4. 機械学習の最適化: 履歴データによるトレーニングモデルを使用して,入学条件と退学条件を最適化する.
  5. 資金管理のアップグレード: 口座の純資産の動向に応じて,取引毎の資本比率を調整する.

要約する

この戦略は,RSIとMAの交差信号によって振動取引を実現し,多層のリスク管理ツールと組み合わせて,利益の可能性とリスク制御をバランスさせます.その優点は,明確な論理と厳格な規律性にありますが,異なる市場環境に対応するためにさらに最適化する必要があります.将来,多指標融合とダイナミックパラメータによって安定性を向上させることができます.

ストラテジーソースコード
/*backtest
start: 2024-04-23 00:00:00
end: 2024-09-06 00:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=5
strategy("📈 RX Swing ", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)


// === INPUTS ===
rsiLength     = input.int(14, title="RSI Length")
maLength      = input.int(14, title="RSI MA Length")
maType        = input.string("SMA", options=["SMA", "EMA"], title="MA Type for RSI")
sl_pct        = input.float(1.5, title="Stop Loss %", minval=0.0)
tp_pct        = input.float(2.5, title="Take Profit %", minval=0.0)
capitalPerTrade = input.float(15000, title="Capital Per Trade (INR)", minval=1)
lotSize       = input.int(50, title="Lot Size (Nifty Options Lot)", minval=1)
trail_points  = input.float(10, title="Trailing SL Points", minval=0.1)

// === CALCULATIONS ===
rsi    = ta.rsi(close, rsiLength)
rsiMA  = maType == "SMA" ? ta.sma(rsi, maLength) : ta.ema(rsi, maLength)

longSignal  = ta.crossover(rsi, rsiMA)
shortSignal = ta.crossunder(rsi, rsiMA)

// === TRADING WINDOW ===
canTrade = true
exitTime = false

// === STATE VARIABLES ===
var float entryPrice = na
var bool inTrade = false
var string tradeDir = ""
var int lossCount = 0
var float trailHigh = na
var float trailLow = na

// === EXIT TRIGGER ===
exitNow = false
exitReason = ""

// === POSITION SIZE BASED ON CAPITAL ===
positionSize = (capitalPerTrade / close) * lotSize

// === ENTRY LOGIC (AFTER CLOSE OF CANDLE) ===
if (canTrade and lossCount < 2)
    if (longSignal and not inTrade and barstate.isconfirmed)  // Ensure the signal happens after candle close
        strategy.entry("Buy Call", strategy.long, qty=positionSize)
        entryPrice := close
        trailHigh := close
        inTrade := true
        tradeDir := "CALL"

    else if (shortSignal and not inTrade and barstate.isconfirmed)  // Ensure the signal happens after candle close
        strategy.entry("Buy Put", strategy.short, qty=positionSize)
        entryPrice := close
        trailLow := close
        inTrade := true
        tradeDir := "PUT"

// === TRAILING STOP-LOSS LOGIC ===
if (inTrade)
    if (tradeDir == "CALL")
        trailHigh := math.max(trailHigh, close)
        if (close <= trailHigh - trail_points)
            strategy.close("Buy Call", comment="CALL Trailing SL Hit")
            exitNow := true
            exitReason := "Trail SL"
            inTrade := false
            lossCount := lossCount + 1

    if (tradeDir == "PUT")
        trailLow := math.min(trailLow, close)
        if (close >= trailLow + trail_points)
            strategy.close("Buy Put", comment="PUT Trailing SL Hit")
            exitNow := true
            exitReason := "Trail SL"
            inTrade := false
            lossCount := lossCount + 1

// === REVERSAL EXIT LOGIC ===
if (inTrade)
    if (tradeDir == "CALL" and shortSignal)
        strategy.close("Buy Call", comment="CALL Exit on Reversal")
        exitNow := true
        exitReason := "Reversal"
        inTrade := false
        if (strategy.position_size < 0)
            lossCount := lossCount + 1

    if (tradeDir == "PUT" and longSignal)
        strategy.close("Buy Put", comment="PUT Exit on Reversal")
        exitNow := true
        exitReason := "Reversal"
        inTrade := false
        if (strategy.position_size > 0)
            lossCount := lossCount + 1

// === TP/SL EXIT LOGIC ===
if (inTrade)
    tpLevel = entryPrice * (1 + tp_pct / 100)
    slLevel = entryPrice * (1 - sl_pct / 100)

    if (strategy.position_size > 0)
        if (close >= tpLevel)
            strategy.close("Buy Call", comment="CALL TP Hit")
            exitNow := true
            exitReason := "TP"
            inTrade := false
        else if (close <= slLevel)
            strategy.close("Buy Call", comment="CALL SL Hit")
            exitNow := true
            exitReason := "SL"
            inTrade := false
            lossCount := lossCount + 1

    if (strategy.position_size < 0)
        tpLevel = entryPrice * (1 - tp_pct / 100)
        slLevel = entryPrice * (1 + sl_pct / 100)

        if (close <= tpLevel)
            strategy.close("Buy Put", comment="PUT TP Hit")
            exitNow := true
            exitReason := "TP"
            inTrade := false
        else if (close >= slLevel)
            strategy.close("Buy Put", comment="PUT SL Hit")
            exitNow := true
            exitReason := "SL"
            inTrade := false
            lossCount := lossCount + 1

// === RESET LOSS COUNT ON NEW DAY ===
if (hour == 9 and minute == 15)
    lossCount := 0

// === MARKUPS ===
plotshape(longSignal and canTrade and lossCount < 2 and barstate.isconfirmed, title="📗 CALL Entry", location=location.belowbar, style=shape.triangleup, color=color.green, size=size.small, text="CALL")
plotshape(shortSignal and canTrade and lossCount < 2 and barstate.isconfirmed, title="📕 PUT Entry", location=location.abovebar, style=shape.triangledown, color=color.red, size=size.small, text="PUT")
plotshape(exitNow and exitReason == "TP", location=location.belowbar, style=shape.xcross, color=color.green, size=size.tiny, title="✅ TP Exit", text="TP")
plotshape(exitNow and exitReason == "SL", location=location.abovebar, style=shape.xcross, color=color.red, size=size.tiny, title="❌ SL Exit", text="SL")
plotshape(exitNow and exitReason == "Reversal", location=location.abovebar, style=shape.circle, color=color.fuchsia, size=size.tiny, title="🔁 Reversal Exit", text="REV")
plotshape(exitNow and exitReason == "Trail SL", location=location.abovebar, style=shape.square, color=color.yellow, size=size.tiny, title="🔂 Trailing SL Exit", text="Trail")