RSIトレンドリバーサル戦略は,相対強度指数 (RSI) と平均本格範囲 (ATR) をベースとした定量的な取引戦略である.急速な市場変動に適応し,トレンドリバーサル機会を把握するために,ダイナミックに利益とストップ損失 (TP/SL) レベルを調整する.戦略は,変動を測定するためにATRと組み合わせ,RSIを中心に2つの適応動的バンドを構築し,ポジションの開閉の基礎として構築する.この戦略は,独立または他の戦略のための利益とストップ損失のモジュールとして使用することができます.テスラ (TSLA),アップル (AAPL),およびNvidia (NDAV) などの株式の15分間のデータでよくテストされています.
RSIトレンドリバーサル戦略の核心は,動的なTP/SL帯の構築にあります.まず,カスタム最高_カスタムおよび最低_カスタム関数を使用して,バンドの基礎を形成する最後のクロスオーバー以来の最高と最低価格を見つけます.次に,ユーザが指定した長さでRSIとATRを計算し,以下の計算を実行します:
ここで,倍数はユーザが定義したバンド拡張因数である.価格が上部バンドを突破した場合,それは長い;下部バンドを突破した場合,それは短い.これらの2つのバンドの色は,バンドとの関係で価格の位置に応じて変化し,観察しやすい.
RSIトレンド逆転戦略は,RSIとATRを利用して,TP/SLポイントを動的に調整し,市場の変化に迅速に対応できる適応性帯を構築する.この戦略は明確な論理,広範な適用性があり,定量的なトレーダーにとって強力なツールである.しかし,実用的な使用では,パラメータ選択とリスク管理に注意を払う必要があるし,全体的なパフォーマンスを改善するために他の指標信号と組み合わせて使用することが推奨される.この戦略にはトレンドフィルターとパラメータ最適化などの最適化余地がある.全体として,RSIトレンド逆転戦略は,定量的な取引にシンプルかつ効果的なアプローチを提供します.
/*backtest start: 2023-04-22 00:00:00 end: 2024-04-27 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("RSI Trend Reversal", overlay=true, max_bars_back = 4999, calc_on_every_tick = false) //INPUTS rsi_length = input.int(title = "Lenght", defval = 8) rsi_mult = input.float(title = "Multiplier", defval = 1.5, step = .05) lookback = input.int(title = "Delay to prevent idealization", defval = 1) sltp = input.float(title = "Minimum Difference", defval = 10) src = input.source(title = "Source Input", defval = close) //PARAMETERS INITILIZATION hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src) //FUNCTION INITILIZATION highest_custom(src, length) => x = src for i = 0 to length if src[i] > x x := src[i] x lowest_custom(src, length) => x = src for i = 0 to length if src[i] < x x := src[i] x rsilev(src, length, mult, sltp) => sl = (100 - sltp) / 100 tp = (100 + sltp) / 100 var bool crossup = na var bool crossdown = na var float dir = na dir_change = ta.change(dir) var float BearGuy = 0 BullGuy = ta.barssince(crossup or crossdown) if na(BullGuy) BearGuy += 1 else BearGuy := BullGuy var float upper = na var float lower = na rsilower = ta.rsi(src, length) rsiupper = math.abs(ta.rsi(src, length) - 100) atr = ta.atr(length) / src lower := highest_custom(math.max(highest_custom(highest_custom(src, BearGuy) * (1 - (atr + ((1 / (rsilower) * mult)))), BearGuy), src * sl), BearGuy) upper := lowest_custom(math.min(lowest_custom(lowest_custom(src, BearGuy) * (1 + (atr + ((1 / (rsiupper) * mult)))), BearGuy), src * tp), BearGuy) var float thresh = na if na(thresh) thresh := lower if na(dir) dir := 1 if crossdown dir := -1 if crossup dir := 1 if dir == 1 thresh := lower if dir == -1 thresh := upper crossup := ta.crossover(src, thresh) crossdown := ta.crossunder(src, thresh) thresh rsiclose = rsilev(hclose, rsi_length, rsi_mult, sltp) //PLOTTING var color col = color.lime if hclose > rsiclose col := color.lime if hclose < rsiclose col := color.red plot(rsiclose, linewidth = 2, color = col) //STRATEGY buy = ta.crossover(hclose, rsiclose) sell = ta.crossunder(hclose, rsiclose) if buy[lookback] strategy.entry("long", strategy.long) if sell[lookback] strategy.entry("Short", strategy.short)