マルチタイムフレーム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を組み合わせることで,クロスオーバー信号は短期的な市場ノイズをフィルタリングしながら,効果的にトレンドを追跡することができます.
複数のタイムフレームを組み合わせることで 価格曲線を滑らかにし 誤ったブレイクを効果的に回避できます
RSIは,新しい高値/低値を追いかけるのを避けるために,過買い/過売りレベルを示します.
二重移動平均は,単一の移動平均システムよりも良い保持効果を持っています.
SMA の代わりに VMA を使えば,短期変動の影響が軽減されます.
マルチタイムフレーム戦略では,パラメータの調整を大量にする必要があり,不適切な設定により,良いエントリが欠落したり,遅刻したエントリが発生する可能性があります.
動向平均は曲線に適していないし 傾向の転換点では劣る.
RSIの差は頻繁に起こります 逆転信号を監視する必要があります
解決策: タイムフレームのパラメータを最適化 MACDなどの他の指標と組み合わせてトレンドを決定する RSIの差異信号に注意してください
時間枠の数とパラメータ設定を最適化して 傾向を把握します
ストップ・ロスをリスク管理に追加することを検討する.
他の指標を組み合わせることで,傾向や差異についてよりよい判断ができる.
最適な保持効果のために異なる保持期間パラメータを試験する.
マルチタイムフレーム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 )