RSIモメント逆転戦略は,逆転取引のためのRSI指標とキャンドルスティックボディの方向性を組み合わせて,過剰購入および過剰販売状態を特定する.この戦略は,逆転機会を効果的に識別するために,従来のRSIと高速RSIの両方を,キャンドルスティックボディフィルターとともに使用する.
戦略は主に以下の部分で実施されます.
コナーズ RSI インジケーター
標準RSI,RSI Win Ratio,およびRSI パリSIを計算して,コナーズRSIを平均値とする.
速度のRSIインジケーター
高速RSIを計算するために価格変動を使用し,超短期サイクルを反映します.
キャンドルスタイクボディフィルター
長期的には高値で 短期的には低値で 誤ったブレイクを防ぐ必要があります
長期・短期条件
20未満のコーナー・RSIと 25未満の急速なRSIで
コナースのRSIが80を超えるとショートで 急速なRSIが75を超えると
ストップ損失出口
ストップロストで終了します.
コナーズRSIは,長期的トレンド逆転点を特定し,高速RSIは短期的逆転を特定し,キャンドルスタックボディはブレイクアウトの有効性を保証します.これは,逆転機会を効果的に検出し,過買い・過売状況下で反トレンド取引を行うことができます.
この戦略の利点は以下の通りです.
長期指標と短期指標を組み合わせる
コーナーのRSIは長期サイクルを反映し,高速RSIは短期サイクルを反映し,両方を組み合わせることで逆転点を正確に特定できます.
キャンドルスタイクボディフィルター
ボディブレイアウトのみで取引すれば 偽ブレイアウトによる損失を減らすことができます
調整可能なパラメータ
RSI パラメータ,取引製品,取引時間枠は,異なる市場に合わせて自由に調整できます.
シンプルで直感的な
RSIとキャンドルスタイクボディは 基本的な指標で わかりやすい論理です
簡単に実行できます
組み込みインジケーターのみを使用し コードが少なく,実装が簡単です
この戦略の主なリスクは
失敗した逆転リスク
価格が逆転信号の後も元のトレンドを継続し,損失につながります.
市場リスクの範囲
市場が変動する度に 効果のないシグナルが頻繁に発信されます
偽の脱出リスク
キャンドルスタイクボディフィルターは 偽発症を完全に防ぐことができません
パラメータリスク
RSIのパラメータが不適切である場合,取引を失敗させたり,複数の非効率な取引を誘発したりします.
特殊な市場状況リスク
RSIインジケーターは,特殊な市場条件で失敗し,誤った信号を生成することがあります.
戦略は以下の側面から最適化できます.
ストップ損失メカニズムを追加する
ストップ・ロスの戦略を最適化し,より合理的なストップを設定し,単一の取引損失を減らす.
複数の指標を統合する
MACDやKDのようなフィルターを追加して信号をより信頼できるものにします
確率フィルターを追加する
トレンドとサポート/レジスタンスの分析を組み合わせて,低確率取引を避ける.
パラメータ設定を最適化
最適値を見つけるために,異なる製品と時間枠でパラメータをテストする.
特殊な市場条件を避ける
巨大な損失を防ぐために 特殊な市場条件で取引を特定し 避けましょう
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()