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

RSIのトレンド逆転戦略

作者: リン・ハーンチャオチャン,日付: 2024-04-28 13:33:19
タグ:RSIATR

img

概要

RSIトレンドリバーサル戦略は,相対強度指数 (RSI) と平均本格範囲 (ATR) をベースとした定量的な取引戦略である.急速な市場変動に適応し,トレンドリバーサル機会を把握するために,ダイナミックに利益とストップ損失 (TP/SL) レベルを調整する.戦略は,変動を測定するためにATRと組み合わせ,RSIを中心に2つの適応動的バンドを構築し,ポジションの開閉の基礎として構築する.この戦略は,独立または他の戦略のための利益とストップ損失のモジュールとして使用することができます.テスラ (TSLA),アップル (AAPL),およびNvidia (NDAV) などの株式の15分間のデータでよくテストされています.

戦略原則

RSIトレンドリバーサル戦略の核心は,動的なTP/SL帯の構築にあります.まず,カスタム最高_カスタムおよび最低_カスタム関数を使用して,バンドの基礎を形成する最後のクロスオーバー以来の最高と最低価格を見つけます.次に,ユーザが指定した長さでRSIとATRを計算し,以下の計算を実行します:

  1. ローナーバンド = 最高価格 × [1 - (ATR/価格 + 1/(RSIローナーバンド × マルチプリキュア))]
  2. 上部帯 = 最低価格 × [1 + (ATR/価格 + 1/(RSI上部帯 × マルチプリキュア))]

ここで,倍数はユーザが定義したバンド拡張因数である.価格が上部バンドを突破した場合,それは長い;下部バンドを突破した場合,それは短い.これらの2つのバンドの色は,バンドとの関係で価格の位置に応じて変化し,観察しやすい.

戦略 の 利点

  1. 高い適応性: TP/SL帯は価格変動に基づいて自動的に調整し,市場の変化に迅速に対応できます.
  2. 調整可能なパラメータ:長さや倍数などのパラメータを調整することで,戦略の感度が柔軟に制御できます.
  3. 明確な論理:コード構造は合理的で理解しやすく,さらに開発できます.
  4. 幅広い適用可能性: 戦略として独立して使用したり,他の戦略にTP/SL機能を追加したりできます.
  5. 計算効率: highest_custom のようなカスタム関数を使用することで,連続型を使用することで引き起こされる大量に繰り返される計算を回避できます.

戦略リスク

  1. パラメータの不適切な選択は,追加のリスクをもたらす可能性があります.例えば,短い長さは頻繁な取引につながり,大きな倍数は過剰に緩いストップ損失につながる可能性があります.
  2. 変動の多い市場における頻繁な統合や誤ったブレイクなど,特定の市場条件では業績が低下し,損失を伴う取引が増える可能性があります.
  3. 戦略自体には傾向判断機能がないので,他の信号と組み合わせて使用する必要があります.

戦略の最適化方向

  1. 移動平均などの傾向指標を追加し,主要な傾向の方向への逆転点での取引のみを検討します.
  2. 長さ,倍数,などに最適な組み合わせを見つけるためにパラメータを最適化します
  3. 他の技術指標や市場情勢指標と組み合わせて,エントリー・アウトプット・ポイントの精度を向上させる.
  4. 各取引のリスクを厳格に制御するためにポジション管理を追加します.

概要

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)

関連性

もっと