VRSIとMARSI戦略は,RSI指標を滑らかにするために移動平均を活用し,二重指標戦略を実装する.それは価格とボリュームのRSI指標の両方を,移動平均と組み合わせて,取引信号を生成する.価格RSIが上昇すると長くなって,価格RSIが下がると短くなってしまいます.一方,市場強さと潜在的なトレンド変化を判断するためにボリュームRSIの変化を観察します.
この戦略は,まず,価格の9期RSI指標 (RSI) とボリュームの9期RSI指標 (VRSI) を計算し,次にこれらの2つのRSI指標の5期単純な移動平均値 (MARSIとMAVRSI) を計算します.
取引シグナルは,MARSI指標に基づいて生成される.MARSIが上昇すると長行し,MARSIが落ちると短行する.また,MAVRSI指標は,市場の強さと潜在的なトレンド変化を判断するために使用されます.
例えば,上昇傾向の間,価格が上昇し続け,但しボリュームが減少し始めた場合,これは上昇強さが弱まっていることを示し,ロングポジションを閉じる準備をすべきである.逆に,下落傾向の間,価格が低下し続け,ボリュームが上昇している場合,これは下落力の強化を示し,ショートポジションはさらに保持することができる.
この戦略は,デュアルRSI指標の移動平均を組み合わせることで,トレンドを効果的に把握し,市場の強さを判断し,罠にはまらないようにするためにボリューム変化を使用することができます.この戦略は,単一のRSI指標と比較して,市場のリズムをより正確に把握することができます.
移動平均値の使用は,信号をより信頼性のあるものにするためにいくつかのノイズをフィルタリングする.また,RSI期と移動平均期のような異なるパラメータ設定は,戦略最適化の可能性を提供します.
この戦略の主なリスクは,二重指標の間の差異にあります.価格とボリュームの間の差異がある場合,取引シグナルが信頼性が低下することがあります.その場合,指標間の関係についての手動判断が必要です.
また,RSIのリスクは,価格が範囲内で変動すると,RSIインジケーターは上下振動し,不必要な取引を誘発する傾向があります.パラメータ調整またはインジケーターの絶対レベルを判断することが必要です.
戦略は以下の側面で最適化できます.
最適な組み合わせを見つけるために,RSIと移動平均のパラメータを調整する
シグナルを生成する際に他の条件を追加します.例えば,過剰購入/過剰販売領域で発信される反転信号はより信頼性が高い傾向があります.
移動停止損失や指標停止損失のようなストップ損失戦略を追加
罠を避けるため,他の指標,例えばキャンドルスタイクパターン,変動指標なども含む.
VRSIとMARSI戦略は,価格とボリュームのRSI指標を成功裏に組み合わせます.両指標の比較と判断は,信号の正確性と収益性を向上させることができます.パラメータ最適化とストップ損失戦略も安定した走行が可能になります.要約すると,指標を組み合わせることで,この戦略は単一のRSI指標よりも優れたパフォーマンスを達成します.
/*backtest start: 2024-01-02 00:00:00 end: 2024-02-01 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("VRSI-MARSI Strategy", shorttitle="(V/MA)RSI Str.", overlay=false, default_qty_type=strategy.percent_of_equity, calc_on_order_fills=true, calc_on_every_tick=true, pyramiding=0, default_qty_value=5, initial_capital=100) // RSI(close, ="RSI") and RSI(Volume, ="VRSI") src = close, len = input(9, minval=1, title="Length RSI") src2 = volume, len2 = input(9, minval=1, title="Length VRSI)") up = rma(max(change(src), 0), len) down = rma(-min(change(src), 0), len) up2 = rma(max(change(src2), 0), len2) down2 = rma(-min(change(src2), 0), len2) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) rsi2 = down2 == 0 ? 100 : up2 == 0 ? 0 : 100 - (100 / (1 + up2 / down2)) // MA(=Moving Average) of RSI(close, ="MARSI") and RSI(Volume, ="MAVRSI") len3 = input(5, minval=1, title="Length MARSI") marsi = sma(rsi, len3) len4 = input(5, minval=1, title="Length MAVRSI") marsi2 = sma(rsi2, len4) // Plot: // Default plot of RSI and VRSI: not visible but can be made visible // Default plot MARSI and MAVRSI: visible p1 = plot(rsi, linewidth=2, transp=100, color=color.yellow, title="RSI") p2 = plot(rsi2, linewidth=2, transp=100, color=color.orange, title="VRSI") m1 = plot(marsi, color=(marsi>=0 ? (marsi[1] < marsi ? color.yellow : color.blue) : (marsi[1] < marsi ? color.yellow : color.blue) ), linewidth = 2, transp = 0, title="MARSI") m2 = plot(marsi2, color=color.orange, linewidth = 2, transp = 0, title="MAVRSI") // Color fill: // Default color fill "RSI - VRSI": not visible but can be made visible // Default color fill "MARSI - MAVRSI": visible fill(p1,p2, color = rsi>rsi2 ? color.green : color.red, transp=100, title="BG RSI-VRSI") fill(m1,m2, color = marsi>marsi2 ? color.green : color.red, transp=75, title="BG MARSI-MAVRSI") // Lines: h2=hline(20, color=color.green, linestyle=hline.style_dotted, title="Extreme Oversold Rsi") h3=hline(30, color=color.black, linestyle=hline.style_dotted, title="Oversold Rsi") h5=hline(50, color=color.yellow, linestyle=hline.style_dashed, title="Middle line") h7=hline(70, color=color.black, linestyle=hline.style_dotted, title="Overbought Rsi") h8=hline(80, color=color.red, linestyle=hline.style_dotted, title="Extreme Overbought Rsi") // Color fill between Lines "20-30" and "70-80" represents the crossing of "MARSI" and "MAVRSI": fill(h2, h3, color=(marsi2 > marsi ? color.red : color.green), transp=80, title="20-30 BG color X MARSI/MAVRSI") fill(h7, h8, color=(marsi2 > marsi ? color.red : color.green), transp=80, title="70-80 BG color X MARSI/MAVRSI") ///Long Entry/// longCondition = marsi > marsi[1] if (longCondition) strategy.entry("Long", strategy.long) ///Long exit/// Xlong =input(true) closeConditionLong = marsi < marsi[1] and Xlong if (closeConditionLong) strategy.close("Long") ///Short Entry/// shortCondition = marsi < marsi[1] if (shortCondition) strategy.entry("Short", strategy.short) ///Short exit/// Xshort =input(true) closeConditionShort = marsi > marsi[1] and Xshort if (closeConditionShort) strategy.close("Short")