RSI 移動平均のクロスオーバー戦略

作者: リン・ハーンチャオチャン,日付: 2023年11月16日 16:28:22
タグ:

img

概要

マルチタイムフレームRSI移動平均クロスオーバー戦略 (Multi-Timeframe RSI Moving Average Crossover Strategy) は,複数のタイムフレームにわたるトレンドフォロー戦略である.複数のタイムフレームにRSI指標を使用し,各タイムフレームのRSIの加重移動平均を取ります.最終信号は,すべてのRSI移動平均を2つの包括的な指標に組み合わせ,クロスオーバー信号を取引することによって生成されます.これは典型的な二重移動平均クロスオーバーシステムです.

原則

この戦略では,まず複数のタイムフレーム (1分,5分,15分,など) でRSI指標を計算し,RSI移動平均線を得るには,各タイムフレームのRSIの15期VMA (加重移動平均値) が必要です.

その後,異なるタイムフレームからのすべてのRSI移動平均値は,2つのシグナル - 急速線とスローラインに等しく組み合わせられます. 急速線は100期間のEMAで,スローラインは150期間のEMAです.

速線がスローラインを越えたとき,購入信号が生成される.速線がスローラインを越えたとき,販売信号が生成される.この方法でマルチタイムフレームRSIを組み合わせることで,クロスオーバー信号は短期的な市場ノイズをフィルタリングしながら,効果的にトレンドを追跡することができます.

利点

  1. 複数のタイムフレームを組み合わせることで 価格曲線を滑らかにし 誤ったブレイクを効果的に回避できます

  2. RSIは,新しい高値/低値を追いかけるのを避けるために,過買い/過売りレベルを示します.

  3. 二重移動平均は,単一の移動平均システムよりも良い保持効果を持っています.

  4. SMA の代わりに VMA を使えば,短期変動の影響が軽減されます.

リスク

  1. マルチタイムフレーム戦略では,パラメータの調整を大量にする必要があり,不適切な設定により,良いエントリが欠落したり,遅刻したエントリが発生する可能性があります.

  2. 動向平均は曲線に適していないし 傾向の転換点では劣る.

  3. RSIの差は頻繁に起こります 逆転信号を監視する必要があります

解決策: タイムフレームのパラメータを最適化 MACDなどの他の指標と組み合わせてトレンドを決定する RSIの差異信号に注意してください

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

  1. 時間枠の数とパラメータ設定を最適化して 傾向を把握します

  2. ストップ・ロスをリスク管理に追加することを検討する.

  3. 他の指標を組み合わせることで,傾向や差異についてよりよい判断ができる.

  4. 最適な保持効果のために異なる保持期間パラメータを試験する.

結論

マルチタイムフレームRSI移動平均クロスオーバー戦略は,典型的なマルチタイムフレームトレンドフォロー戦略である移動平均システムを使用して,複数のタイムフレームからのRSI指標を組み合わせて取引信号を生成する.その強みは,効果的にトレンドを追跡し,ノイズをフィルタリングすることにあるが,パラメータチューニングとリスク管理には注意が必要である.さらなる最適化により,強力なトレンドフォローシステムになることができる.


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

//@version=4
strategy(title="RSI multitimeframe SMA crossover", shorttitle="RSI multitimeframe strategy", default_qty_type= strategy.percent_of_equity, margin_long=50, default_qty_value=150)

res1 = input(title="Res 01", type=input.resolution, defval="1")
res2 = input(title="Res 0", type=input.resolution, defval="5")
res3 = input(title="Res 1", type=input.resolution, defval="15")
res4 = input(title="Res 2", type=input.resolution, defval="15")
res5 = input(title="Res 3", type=input.resolution, defval="15")
res6 = input(title="Res 4", type=input.resolution, defval="30")
res7 = input(title="Res 5", type=input.resolution, defval="45")
res8 = input(title="Res 6", type=input.resolution, defval="60")



lengthRSI = input(15, minval=1)
lengthMA = input(15, minval=1)
lengthFMA = input(100, minval=1)
lengthFMA2 = input(150, minval=1)
Long_yes = input(defval=1, title="Long trades 0 or 1", minval=0, maxval=1)
Short_yes = input(defval=0, title="Short trades 0 or 1", minval=0, maxval=1)
src = close

// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1970)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"



// stop loss 
longLossPerc = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.5, defval=10) * 
   0.01
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)

shortLossPerc = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.5, defval=10) * 
   0.01
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)


rsi1 = rsi(src, lengthRSI)
MA1 = vwma(rsi1, lengthMA)






outD1 = security(syminfo.tickerid, res1, MA1)
outD2 = security(syminfo.tickerid, res2, MA1)
outD3 = security(syminfo.tickerid, res3, MA1)
outD4 = security(syminfo.tickerid, res4, MA1)
outD5 = security(syminfo.tickerid, res5, MA1)
outD6 = security(syminfo.tickerid, res6, MA1)
outD7 = security(syminfo.tickerid, res7, MA1)
outD8 = security(syminfo.tickerid, res8, MA1)




//plot_d0 = outD0
//plot_d1 = outD1
//plot_d2 = outD2
//plot_d3 = outD3
//plot_d4 = outD4
//plot_d5 = outD5
//plot_d6 = outD6

out_multi = ema(outD1+outD2+outD3+outD4+outD5+outD6+outD7+outD8, lengthFMA)
out_multi2 = ema(outD1+outD2+outD3+outD4+outD5+outD6+outD7+outD8, lengthFMA2)
//out_multi1 = outD2+outD3+outD4
//out_multi2 = outD4+outD5+outD6

//col0 = outD0 < 20 ? color.lime : outD0 > 80 ? color.red : color.blue
//col1 = outD1 < 20 ? color.lime : outD1 > 80 ? color.red : color.blue
//col2 = outD2 < 20 ? color.lime : outD2 > 80 ? color.red : color.blue
//col3 = outD3 < 20 ? color.lime : outD3 > 80 ? color.red : color.blue
//col4 = outD4 < 20 ? color.lime : outD4 > 80 ? color.red : color.blue
//col5 = outD5 < 20 ? color.lime : outD5 > 80 ? color.red : color.blue
//col6 = outD6 < 20 ? color.lime : outD6 > 80 ? color.red : color.blue


// plot(plot_d0,linewidth=2, color=col0)
// plot(plot_d1, linewidth=2, color=col1)
// plot(plot_d2,linewidth=2, color=col2)
// plot(plot_d3,linewidth=2, color=col3)
// plot(plot_d4,linewidth=2, color=col4)
// plot(plot_d5,linewidth=2, color=col5)
// plot(plot_d6,linewidth=2, color=col6)

long=(out_multi/8)
short=(out_multi2/8)

plot(long, linewidth=1, color=color.green)
plot(short, linewidth=1, color=color.red)

long1=crossover(long,short)
short1=crossunder(long,short)

h0 = hline(65, "Upper Band", color=color.red, linestyle=hline.style_solid, linewidth=2 )
h1 = hline(35, "Lower Band", color=color.green, linestyle=hline.style_solid, linewidth=2)


strategy.entry("buy", strategy.long, when=long1 and window() and Long_yes > 0) 
if strategy.position_size > 0
    strategy.exit(id="XL STP", stop=longStopPrice)
strategy.close("buy",when=short1 )

strategy.entry("sell", strategy.short, when=short1 and window() and Short_yes > 0) 
if strategy.position_size < 0
    strategy.exit(id="XS STP", stop=shortStopPrice)
strategy.close("buy",when=long1 )



もっと