RSIの動向逆転戦略

作者: リン・ハーンチャオチャン開催日:2023年11月7日 15:45:15
タグ:

img

概要

RSIモメント逆転戦略は,逆転取引のためのRSI指標とキャンドルスティックボディの方向性を組み合わせて,過剰購入および過剰販売状態を特定する.この戦略は,逆転機会を効果的に識別するために,従来のRSIと高速RSIの両方を,キャンドルスティックボディフィルターとともに使用する.

戦略の論理

戦略は主に以下の部分で実施されます.

  1. コナーズ RSI インジケーター

    標準RSI,RSI Win Ratio,およびRSI パリSIを計算して,コナーズRSIを平均値とする.

  2. 速度のRSIインジケーター

    高速RSIを計算するために価格変動を使用し,超短期サイクルを反映します.

  3. キャンドルスタイクボディフィルター

    長期的には高値で 短期的には低値で 誤ったブレイクを防ぐ必要があります

  4. 長期・短期条件

    20未満のコーナー・RSIと 25未満の急速なRSIで

    コナースのRSIが80を超えるとショートで 急速なRSIが75を超えると

  5. ストップ損失出口

    ストップロストで終了します.

コナーズRSIは,長期的トレンド逆転点を特定し,高速RSIは短期的逆転を特定し,キャンドルスタックボディはブレイクアウトの有効性を保証します.これは,逆転機会を効果的に検出し,過買い・過売状況下で反トレンド取引を行うことができます.

利点分析

この戦略の利点は以下の通りです.

  1. 長期指標と短期指標を組み合わせる

    コーナーのRSIは長期サイクルを反映し,高速RSIは短期サイクルを反映し,両方を組み合わせることで逆転点を正確に特定できます.

  2. キャンドルスタイクボディフィルター

    ボディブレイアウトのみで取引すれば 偽ブレイアウトによる損失を減らすことができます

  3. 調整可能なパラメータ

    RSI パラメータ,取引製品,取引時間枠は,異なる市場に合わせて自由に調整できます.

  4. シンプルで直感的な

    RSIとキャンドルスタイクボディは 基本的な指標で わかりやすい論理です

  5. 簡単に実行できます

    組み込みインジケーターのみを使用し コードが少なく,実装が簡単です

リスク分析

この戦略の主なリスクは

  1. 失敗した逆転リスク

    価格が逆転信号の後も元のトレンドを継続し,損失につながります.

  2. 市場リスクの範囲

    市場が変動する度に 効果のないシグナルが頻繁に発信されます

  3. 偽の脱出リスク

    キャンドルスタイクボディフィルターは 偽発症を完全に防ぐことができません

  4. パラメータリスク

    RSIのパラメータが不適切である場合,取引を失敗させたり,複数の非効率な取引を誘発したりします.

  5. 特殊な市場状況リスク

    RSIインジケーターは,特殊な市場条件で失敗し,誤った信号を生成することがあります.

オプティマイゼーションの方向性

戦略は以下の側面から最適化できます.

  1. ストップ損失メカニズムを追加する

    ストップ・ロスの戦略を最適化し,より合理的なストップを設定し,単一の取引損失を減らす.

  2. 複数の指標を統合する

    MACDやKDのようなフィルターを追加して信号をより信頼できるものにします

  3. 確率フィルターを追加する

    トレンドとサポート/レジスタンスの分析を組み合わせて,低確率取引を避ける.

  4. パラメータ設定を最適化

    最適値を見つけるために,異なる製品と時間枠でパラメータをテストする.

  5. 特殊な市場条件を避ける

    巨大な損失を防ぐために 特殊な市場条件で取引を特定し 避けましょう

結論

RSIモメンタム逆転戦略は,信号有効性を高めるためにキャンドルスティックボディフィルターを使用して,コンナーRSIと高速RSIを使用して,長期および短期逆転を特定します.指標組み合わせや調整可能なパラメータなどの利点により,過買いまたは過売れた場合の逆転とトレンドを捕捉することができます.しかし,失敗した逆転や偽のブレイクアウトなどのリスクは残っており,リスクを軽減し収益性を向上させるためにストップ損失,指標組み合わせのさらなる最適化が必要です.


/*backtest
start: 2023-10-07 00:00:00
end: 2023-11-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Connors RSI Strategy v1.0", shorttitle = "CRSI str 1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usecrsi = input(true, defval = true, title = "Use CRSI Strategy")
usefrsi = input(true, defval = true, title = "Use FRSI Strategy")
usemod = input(true, defval = true, title = "CRSI+FRSI Mode")
limit = input(25, defval = 25, minval = 1, maxval = 100, title = "RSI limit")
usebod = input(true, defval = true, title = "Use Body-filter")
usecol = input(true, defval = true, title = "Use Color-filter")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//CRSI
rsilen = 3
streaklen = 2
lookback = 100
rsi = rsi(close,rsilen)
upday = close > close[1] ? 1 : 0
downday = close < close[1] ? -1 : 0
upstreak = upday!=0 ? upstreak[1] + upday : 0
downstreak = downday!=0 ? downstreak[1] + downday : 0
streak = upstreak + downstreak
streakrsi = rsi(streak,streaklen)
roc = close/close[1] - 1
roccount = 0
for i=1 to lookback-1
    roccount := roc[i]<roc ? roccount + 1 : roccount
crsi = (rsi + streakrsi + roccount) / 3

//Oscilator
// rsiplot = plot(crsi, title="RSI", style=line, linewidth=1, color=blue)
// band1 = hline(80, title="Upper Line", linestyle=dashed, linewidth=1, color=red)
// band0 = hline(20, title="Lower Line", linestyle=dashed, linewidth=1, color=green)
// fill(band1, band0, color=purple, transp=90)

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Color Filter
bar = close > open ? 1 : close < open ? -1 : 0
gbar = bar == 1 or usecol == false
rbar = bar == -1 or usecol == false

//Signals

up1 = rbar and (strategy.position_size == 0 or close < strategy.position_avg_price) and crsi < limit and body and usecrsi
dn1 = gbar and (strategy.position_size == 0 or close > strategy.position_avg_price) and crsi > 100 - limit and body and usecrsi
up2 = rbar and (strategy.position_size == 0 or close < strategy.position_avg_price) and fastrsi < limit and body and usefrsi
dn2 = gbar and (strategy.position_size == 0 or close > strategy.position_avg_price) and fastrsi > 100 - limit and body and usefrsi
exit = ((strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if ((up1 or up2) and usemod == false) or (up1 and up2 and usemod)
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if ((dn1 or dn2) and usemod == false) or (dn1 and dn2 and usemod)
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot)
    
if  exit
    strategy.close_all()

もっと