複数の移動平均クロスオーバー支援RSI動的パラメータ定量取引戦略

RSI MA SMA EMA WMA SMMA RMA
作成日: 2025-01-17 16:14:38 最終変更日: 2025-01-17 16:14:38
コピー: 1 クリック数: 410
1
フォロー
1617
フォロワー

複数の移動平均クロスオーバー支援RSI動的パラメータ定量取引戦略

概要

これは、相対力指数 (RSI) と複数の移動平均を組み合わせた定量的な取引戦略です。この戦略は主にRSIインジケーター上の異なるタイプの移動平均(SMA、EMA、WMA、SMMAを含む)のクロスオーバー信号を監視することによって市場のトレンドを決定し、RSIインジケーター自体の買われ過ぎと売られ過ぎの範囲を補助的な基準として組み合わせます。市場の動向を見極める判断力、取引のタイミング。

戦略原則

この戦略には主に次の主要な計算手順が含まれます。

  1. 14期間のRSIインジケーターを計算し、買われすぎエリアを70、売られすぎエリアを30に設定します。
  2. RSI 曲線上で異なるパラメータを持つ 3 つの移動平均を計算します。
    • MA1: 20期間、オプションのSMA/EMA/WMA/SMMA
    • MA2: 50期間、オプションのSMA/EMA/WMA/SMMA
    • MA3: 100期間、オプションのSMA/EMA/WMA/SMMA
  3. 取引シグナル生成ルール:
    • 買いシグナル: MA2がMA3を上向きに交差したとき
    • 売りシグナル: MA2がMA3を下向きに交差したとき
  4. 同時に、RSI指標の偏差を検出し、取引決定の補助的な参考資料を提供します。

戦略的優位性

  1. 複数のテクニカル指標を相互検証して取引シグナルの信頼性を向上させる
  2. 移動平均のタイプとパラメータは調整可能で、柔軟性が高い
  3. RSIダイバージェンス検出機能は市場の転換点を事前に検出するのに役立ちます
  4. パーセンテージポジション管理を使用してリスクを効果的に管理する
  5. 優れた視覚効果、分析とバックテストが簡単

戦略リスク

  1. 移動平均線のクロスオーバーは遅行効果をもたらす可能性がある
  2. 横ばい市場では誤ったシグナルが頻繁に発生する可能性がある
  3. 特定の市場状況におけるRSI指標の歪み
  4. パラメータの選択が不適切だと、取引シグナルが多すぎたり少なすぎたりする可能性がある。 回避策:
  • クロス検証には市場動向と取引量を組み合わせることをお勧めします。
  • 移動平均パラメータを調整することで取引頻度を最適化できる
  • リスクを管理するために損切りと利益確定を設定する

戦略最適化の方向性

  1. 信号フィルタリングの最適化:
  • トレンド確認インジケーターを追加する
  • ボリューム分析を追加
  1. パラメータの動的最適化:
  • 市場のボラティリティに応じてRSIとMAのパラメータを自動的に調整します
  • 適応型サイクル計算方法の導入
  1. リスク管理の最適化:
  • 動的なストップロスとテイクプロフィットのメカニズムを開発する
  • 動的な倉庫管理システムを設計する

要約する

この戦略は、RSI と複数の移動平均を組み合わせて、適応性の高い取引システムを構築します。この戦略の主な利点は、複数のテクニカル指標の相互検証と柔軟なパラメータ設定にありますが、同時に、移動平均の遅れと市場状況が戦略のパフォーマンスに与える影響にも注意を払う必要があります。この戦略は、継続的な最適化とリスク管理を通じて、実際の取引において安定したパフォーマンスを達成することが期待されます。

ストラテジーソースコード
/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy(title="Relative Strength Index with MA Strategy", shorttitle="RSI-MA Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=200)

// RSI Inputs
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
calculateDivergence = input.bool(false, title="Calculate Divergence", group="RSI Settings", tooltip="Calculating divergences is needed in order for divergence alerts to fire.")

// RSI Calculation
change_rsi = ta.change(rsiSourceInput)
up = ta.rma(math.max(change_rsi, 0), rsiLengthInput)
down = ta.rma(-math.min(change_rsi, 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

// RSI Plot
plot(rsi, "RSI", color=#7E57C2)
hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
hline(30, "RSI Lower Band", color=#787B86)
fill(hline(70), hline(30), color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")

// RSI-based MA Inputs
grpRSIMovingAverages = "RSI Moving Averages"
ma1Length = input.int(20, title="MA1 Length", group=grpRSIMovingAverages)
ma2Length = input.int(50, title="MA2 Length", group=grpRSIMovingAverages)
ma3Length = input.int(100, title="MA3 Length", group=grpRSIMovingAverages)
ma1Type = input.string("SMA", title="MA1 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)
ma2Type = input.string("EMA", title="MA2 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)
ma3Type = input.string("WMA", title="MA3 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)

// MA Calculation Function
calcMA(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "WMA" => ta.wma(source, length)
        "SMMA" => ta.rma(source, length)

// MA Calculations
ma1 = calcMA(rsi, ma1Length, ma1Type)
ma2 = calcMA(rsi, ma2Length, ma2Type)
ma3 = calcMA(rsi, ma3Length, ma3Type)

// MA Plots
plot(ma1, title="RSI MA1", color=color.blue)
plot(ma2, title="RSI MA2", color=color.green)
plot(ma3, title="RSI MA3", color=color.red)

// Divergence (Retained from original script)
lookbackRight = 5
lookbackLeft = 5
rangeUpper = 60
rangeLower = 5
bearColor = color.red
bullColor = color.green
textColor = color.white
noneColor = color.new(color.white, 100)

_inRange(bool cond) =>
    bars = ta.barssince(cond)
    rangeLower <= bars and bars <= rangeUpper

plFound = false
phFound = false

bullCond = false
bearCond = false

rsiLBR = rsi[lookbackRight]

if calculateDivergence
    // Regular Bullish
    plFound := not na(ta.pivotlow(rsi, lookbackLeft, lookbackRight))    
    rsiHL = rsiLBR > ta.valuewhen(plFound, rsiLBR, 1) and _inRange(plFound[1])
    lowLBR = low[lookbackRight]
    priceLL = lowLBR < ta.valuewhen(plFound, lowLBR, 1)
    bullCond := priceLL and rsiHL and plFound

    // Regular Bearish
    phFound := not na(ta.pivothigh(rsi, lookbackLeft, lookbackRight))
    rsiLH = rsiLBR < ta.valuewhen(phFound, rsiLBR, 1) and _inRange(phFound[1])
    highLBR = high[lookbackRight]
    priceHH = highLBR > ta.valuewhen(phFound, highLBR, 1)
    bearCond := priceHH and rsiLH and phFound

// plot(
//      plFound ? rsiLBR : na,
//      offset=-lookbackRight,
//      title="Regular Bullish",
//      linewidth=2,
//      color=(bullCond ? bullColor : noneColor),
//      display = display.pane
//      )

plotshape(
     bullCond ? rsiLBR : na,
     offset=-lookbackRight,
     title="Regular Bullish Label",
     text=" Bull ",
     style=shape.labelup,
     location=location.absolute,
     color=bullColor,
     textcolor=textColor
     )

// plot(
//      phFound ? rsiLBR : na,
//      offset=-lookbackRight,
//      title="Regular Bearish",
//      linewidth=2,
//      color=(bearCond ? bearColor : noneColor),
//      display = display.pane
//      )

plotshape(
     bearCond ? rsiLBR : na,
     offset=-lookbackRight,
     title="Regular Bearish Label",
     text=" Bear ",
     style=shape.labeldown,
     location=location.absolute,
     color=bearColor,
     textcolor=textColor
     )

alertcondition(bullCond, title='Regular Bullish Divergence', message="Found a new Regular Bullish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.")
alertcondition(bearCond, title='Regular Bearish Divergence', message='Found a new Regular Bearish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.')

// ----- MUA/BÁN -----

// Điều kiện Mua: MA2 cắt lên MA3 và MA3 < 55
buyCondition = ta.crossover(ma2, ma3) 

// Điều kiện Bán: MA2 cắt xuống MA3 và MA3 > 40
sellCondition = ta.crossunder(ma2, ma3)

// Thực hiện lệnh Mua/Bán
if (buyCondition)
    strategy.entry("Buy", strategy.long, comment="Buy Signal")

if (sellCondition)
    strategy.close("Buy", comment="Sell Signal")



// ----- KẾT THÚC -----