RSI指標に基づくトレンドフォロー型ストップロス戦略


作成日: 2023-12-12 15:46:49 最終変更日: 2023-12-12 15:46:49
コピー: 0 クリック数: 1051
1
フォロー
1621
フォロワー

RSI指標に基づくトレンドフォロー型ストップロス戦略

概要

この策略は,RSI指数に基づくトレンド追跡ストップ・ロッド策略と呼ばれています.この策略は,RSI指数を使用して,超買い超売り状況を判断し,快慢MA指数と組み合わせて,トレンド方向を判断し,入場条件を設定します.同時に,パーセント追跡ストップ・ロッド機構を使用して,ストップ・ロッドの退出を実現します.

戦略原則

この戦略は,主にRSI指標とMA指標によって入場時間を判断する. RSI指標のパラメータは2サイクルに設定され,超買い超売り状況を判断する. 急速なMAはそれぞれ50サイクルと200サイクルに設定され,トレンドの方向を判断する. 具体的入場論理は:

多頭入場:速MAで遅MAを穿い,遅MAよりも高い価格で,RSIが超売り領域 (デフォルト10%) よりも低いときに多頭入場.
空頭入場: 速MAの下の緩慢MAを穿い,緩慢MAより価格が低く,同時にRSIが超買い領域より高い (デフォルト90%) 時に空きをする.

さらに,戦略には,選択可能な波動率フィルターが設定されている.このフィルターは,MAの斜率差を素早く計算し,差が設定された値を超えるとのみポジションを開きます.この目的は,価格の振動期に明確な方向性がないときにポジションを開くのを避けるためです.

exitでは,戦略はパーセンテージ・トラッキング・ストップ方式を採用する.入力されたパーセンテージ・ストップに基づいて,各ジャンプ価格差を組み合わせてストップ価格を計算し,ダイナミックな調整ストップを実現する.

優位分析

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

  1. RSIのパラメータは2周期で設定され,超買い超売り状況を迅速に捉え,反転の機会を判断します.
  2. ターニングポイントやトレンドの方向を 認識する効果があります.
  3. RSIとMAの二重指数判断と組み合わせると,偽ブレークを回避できます.
  4. 波動率フィルターを設定し,波動の方向が明確でない時期をフィルターします.
  5. パーセンテージ・トラッキング・ストップ方式を使用し,市場の変動に応じてストップ幅を調整し,リスクを効果的に制御する.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. RSIとMAの指標は後退しており,逆転の機会を逃している可能性があります.
  2. パーセンテージ・ストップは,縮小量の下落時に容易に誘発される.
  3. 夜盤と前盤の波動が大きい品種を効果的に処理できない.

上記のリスクに対して,以下の方法で最適化できます.

  1. RSIパラメータを1サイクルに設定することで,遅滞を減らすことができます.
  2. 異なる品種の特徴に応じてMA周期パラメータを調整する.
  3. ストップ・パーセンテージレベルを調整し,ストップ・パーセンテージと衝撃の許容度を考慮する.

戦略最適化の方向性

この戦略は以下の点で最適化できます.

  1. 取引量指数などの他の指標を追加し,偽の突破を避ける.
  2. 機械学習モデルの判断を高め,モデルの予測結果を活用して意思決定を補助する.
  3. 戦略的リターン率をさらに向上させるため,リターン回数とポジション管理を最適化します.
  4. 夜盤と前盤の波動フィルタリング機構を設定する.波動幅に応じて,次の取引日の意思決定に参加するかどうかを設定する.

要約する

この戦略は,全体として,より安定したトレンド追跡戦略である.これは,RSIとMAの二重指標判断を組み合わせて,一定の安定性を保証しながら,より明確なトレンド反転の機会を捉えることができる.同時に,波動率フィルタを設定することで,部分的なリスクが回避され,パーセンテージストップ方式は,1枚の損失を効果的に制御することができます.この戦略は,複数の品種の一般的な戦略として使用できます.また,特定の品種に対してパラメータ調整とモデル最適化を行って,より良い戦略効果を得ることができます.

ストラテジーソースコード
/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// Scalping strategy
// © Lukescream and Ninorigo
// (original version by Lukescream - lastest versions by Ninorigo) - v1.3
//

//@version=4
strategy(title="Scalping using RSI 2 indicator", shorttitle="RSI 2 Strategy", overlay=true, pyramiding=0, process_orders_on_close=false)

var bool ConditionEntryL = false
var bool ConditionEntryS = false


//***********
// Costants
//***********
def_start_date = timestamp("01 Jan 2021 07:30 +0000")
def_end_date   = timestamp("01 Dec 2024 07:30 +0000")

def_rsi_length = 2
def_overbought_value = 90
def_oversold_value   = 10

def_slow_ma_length = 200
def_fast_ma_length = 50
def_ma_choice      = "EMA"

def_tick   = 0.5
def_filter = true

def_trailing_stop = 1


//***********
// Change the optional parameters
//***********
start_time  = input(title="Start date", defval=def_start_date, type=input.time)
end_time    = input(title="End date", defval=def_end_date, type=input.time)
// RSI
src         = input(title="Source", defval=close, type=input.source)
rsi_length  = input(title="RSI Length", defval=def_rsi_length, minval=1, type=input.integer)
overbought_threshold = input(title="Overbought threshold", defval=def_overbought_value, type=input.float)
oversold_threshold   = input(title="Oversold threshold", defval=def_oversold_value, type=input.float)
// Moving average
slow_ma_length = input(title="Slow MA length", defval=def_slow_ma_length, type=input.integer)
fast_ma_length = input(title="Fast MA length", defval=def_fast_ma_length, type=input.integer)
ma_choice = input(title="MA choice", defval="EMA", options=["SMA", "EMA"])
// Input ticker
tick   = input(title="Ticker size", defval=def_tick, type=input.float)
filter = input(title="Trend Filter", defval=def_filter, type=input.bool)
// Trailing stop (%)
ts_rate = input(title="Trailing Stop %", defval=def_trailing_stop, type=input.float)


//***********
// RSI
//***********
// Calculate RSI
up   = rma(max(change(src), 0), rsi_length)
down = rma(-min(change(src), 0), rsi_length)
rsi = (down == 0 ? 100 : (up == 0 ? 0 : 100-100/(1+up/down)))


//***********
// Moving averages
//***********
slow_ma = (ma_choice == "SMA" ? sma(close, slow_ma_length) : ema(close, slow_ma_length))
fast_ma = (ma_choice == "SMA" ? sma(close, fast_ma_length) : ema(close, fast_ma_length))
// Show the moving averages
plot(slow_ma, color=color.white,  title="Slow MA")
plot(fast_ma, color=color.yellow, title="Fast MA")


//***********
// Strategy
//***********
if true
    // Determine the entry conditions (only market entry and market exit conditions)
    // Long position
    ConditionEntryL := (filter == true ? (fast_ma > slow_ma and close > slow_ma and rsi < oversold_threshold) : (fast_ma > slow_ma and rsi < oversold_threshold))
    // Short position
    ConditionEntryS := (filter == true ? (fast_ma < slow_ma and close < slow_ma and rsi > overbought_threshold) : (fast_ma < slow_ma and rsi > overbought_threshold))
   
    // Calculate the trailing stop
    ts_calc = close * (1/tick) * ts_rate * 0.01

    // Submit the entry orders and the exit orders
    // Long position
    if ConditionEntryL
        strategy.entry("RSI Long", strategy.long)
    // Exit from a long position
    strategy.exit("Exit Long", "RSI Long", trail_points=0, trail_offset=ts_calc)

    // Short position 
    if ConditionEntryS
        strategy.entry("RSI Short", strategy.short)
    // Exit from a short position
    strategy.exit("Exit Short", "RSI Short", trail_points=0, trail_offset=ts_calc)

// Highlights long conditions
bgcolor (ConditionEntryL ? color.navy : na, transp=60, offset=1, editable=true, title="Long position band")
// Highlights short conditions
bgcolor (ConditionEntryS ? color.olive : na, transp=60, offset=1, editable=true, title="Short position band")