資源の読み込みに... 荷物...

動的RSI 多重移動平均クロスオーバーの量的な取引戦略

作者: リン・ハーンチャオチャン, 日付: 2025-01-17 16:14:38
タグ:RSIマルチSMAエイマWMASMMARMA

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

概要

これは,相対強度指数 (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 -----


関連性

もっと