この戦略は,トレンド方向を決定するために移動平均システムと組み合わせた,長期および短期のトレード信号のための2つのRSI指標を使用する二重RSIトレンドフォロー戦略である.この戦略は,二重RSIアルゴリズム戦略のカテゴリーに属している.この戦略は,まずRSI指標を使用して,上昇と下落の信号を決定し,その後,移動平均を使用して,長期または短期のトレンド方向を確認する.これは典型的なトレンドフォロー戦略である.
ダブルRSI戦略は,主に異なるタイムフレームを持つ2つのRSIインジケーターを使用して取引信号を表示する.最初に2つのRSIパラメータを設定し,1つの長期間RSIをメインインジケーターとして,1つの短期間RSIを補助フィルターとして設定する.長期間RSIがoversoldライン以下に突破すると,ロング信号が生成される.短期間RSIがoversoldライン以上に突破すると,ショート信号が生成される.これは取引機会のためのダブルRSIクロスオーバーシステムを形成する.
誤った信号をフィルタリングするために,戦略はトレンド検出のためにSMAとEMA移動平均値も組み込む.短期間SMAが長期間EMAを超えると,長いRSI信号が考慮される.短期間SMAが長いEMAを下回ると,短いRSI信号が考慮される.これは,RSI信号がトレンド方向に準拠し,トレンドに反する取引を避けるようにする.
また,ストップ・ロストとテイク・プロフィート・ロジックも設定しています. ポジションを開いた後,異なるサイズで2つのテイク・プロフィート・オーダーがストップ・ロストレベルとともに配置されます.
二重RSIアルゴリズム戦略には以下の利点があります.
デュアルタイムフレーム RSI インディケーターは,バリーシグナルとベアシグナルをより正確に決定することができます.長期および短期間のRSIの組み合わせは,いくつかの誤った信号をフィルタリングし,信号品質を改善することができます.
移動平均システムは主要なトレンド方向を決定し,トレンドに反する取引を避け,ほとんどのノイズトレードをフィルタリングし,勝率を改善します.
柔軟なストップ・ロストとテイク・プロフィートメカニズムは,異なるテイク・プロフィート設定によってより高いリターンを可能にし,ストップ・ロストを通じてリスクを管理します.
トレーディングロジックはシンプルで明確で,理解し最適化しやすい.アルゴリズムトレーダーが学ぶのに適しています.
双重RSI戦略の利点にもかかわらず,次のリスクも伴います.
RSI自体は,市場変動やトレンド逆転における有効性が限られている.この戦略は,これらの市場条件で劣る可能性がある.
移動平均値は小さなノイズをフィルタリングするが,中間サイクルトレンドの変化を検出するのに効果が低く,トレンドターニングポイントを見逃す可能性があります.
不適切なストップ・ロストとテイク・プロフィートの設定は,ストップが幅が大きすぎたり,利益が小さすぎたりして戦略のパフォーマンスを悪化させる可能性があります.
大規模なロング/ショートポジションは損失を増大させる可能性があります.ポジションサイズ管理が必要です.
これらのリスクに対処するために,パラメータを調整し,より高度なトレンドと逆転指標を導入し,ストップと利益ロジックを最適化し,リスクを最小限に抑えるためにポジションサイズを制御することができます.
二重RSI戦略は,次の側面でさらに最適化することができます:
適切な長時間および短時間RSI期間を見つけるために異なるパラメータ組み合わせをテストする.
MACDのような他の指標を導入して 傾向と逆転分析を良くします
ストップ・ロスを最適化し 利潤戦略を活用し 柔軟性を高めるため トレイリング・ストップや移動・利潤を活用します
ポジションサイズ制御モジュールを追加し,異なるトレンドサイクル段階での長/短ポジションを調整します.
機械学習モデルを組み込み 入力と出出の精度を向上させる
異なる製品と最適化のためのタイムフレームのバックテスト
概要すると,デュアルRSI戦略は,典型的なトレンドフォロー戦略である.デュアルRSI信号と移動平均ノイズフィルタリングを組み合わせる考え方は,非常に古典的で実用的である.改善の余地があるものの,全体的な論理は明確で,理解し最適化することは容易である.これはアルゴリズム取引初心者にとって学び,実践するための素晴らしい戦略である. "実践が完璧になる"原則に基づく継続的な最適化と繰り返しの助けにより,安定した取引結果を達成することができる.
/*backtest start: 2023-11-07 00:00:00 end: 2023-11-14 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Growth Producer", overlay=true, initial_capital = 1000, currency = "USD", pyramiding = 2, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type = strategy.percent_of_equity, default_qty_value = 100) //Functions Atr(p) => atr = 0. Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1]))) atr := nz(atr[1] + (Tr - atr[1])/p,Tr) /// TREND ribbon_period = input(19, "Period", step=1) leadLine1 = ema(close, ribbon_period) leadLine2 = sma(close, ribbon_period) p1 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) p2 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) fill(p1, p2, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) // Relative volatility index length = input(120,"RVI period", minval=1), src = close len = 14 stddev = stdev(src, length) upper = ema(change(src) <= 0 ? 0 : stddev, len) lower = ema(change(src) > 0 ? 0 : stddev, len) rvi = upper / (upper + lower) * 100 benchmark = input(35, "RVI benchmark", minval=10, maxval=100, step=0.1) // Plot RVI // h0 = hline(80, "Upper Band", color=#C0C0C0) // h1 = hline(20, "Lower Band", color=#C0C0C0) // fill(h0, h1, color=#996A15, title="Background") // offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500) // plot(rvi, title="RVI", color=#008000, offset = offset) /// MFI input mfi_source = hlc3 mfi_length = input(19, "MFI Length", minval=1) mfi_lower = input(15, "MFI Lower level", minval=0, maxval=50) mfi_upper = input(90, "MFI Higher level", minval=50, maxval=100) // MFI upper_s = sum(volume * (change(mfi_source) <= 0 ? 0 : mfi_source), mfi_length) lower_s = sum(volume * (change(mfi_source) >= 0 ? 0 : mfi_source), mfi_length) mf = rsi(upper_s, lower_s) // mfp = plot(mf, color=color.new(color.gray,0), linewidth=1) // top = hline(mfi_upper, color=color.new(color.gray, 100), linewidth=1, editable=false) // bottom = hline(mfi_lower, color=color.new(color.gray,100), linewidth=1, editable=false) // hline(0, color=color.new(color.black,100), editable=false) // hline(100, color=color.new(color.black,100), editable=false) // Breaches // b_color = (mf > mfi_upper) ? color.new(color.red,70) : (mf < mfi_lower) ? color.new(color.green,60) : na // bgcolor(HighlightBreaches ? b_color : na) // fill(top, bottom, color=color.gray, transp=75) // Initial inputs Act_RSI_VWAP_long = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE LONG") RSI_VWAP_length_long = input(16, "RSI-VWAP LENGTH LONG") RSI_VWAP_overSold_long = input(13, "RSI-VWAP OVERSOLD LONG", type=input.float) RSI_VWAP_overBought_long = input(68, "RSI-VWAP OVERBOUGHT LONG", type=input.float) Act_RSI_VWAP_short = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE SHORT") RSI_VWAP_length_short = input(14, "RSI-VWAP LENGTH SHORT") RSI_VWAP_overSold_short = input(7, "RSI-VWAP OVERSOLD SHORT", type=input.float) RSI_VWAP_overBought_short = input(68, "RSI-VWAP OVERBOUGHT SHORT", type=input.float) // RSI with VWAP as source RSI_VWAP_long = rsi(vwap(close), RSI_VWAP_length_long) RSI_VWAP_short = rsi(vwap(close), RSI_VWAP_length_short) // Plot Them Separately. // Plotting LONG, Put overlay=false // r=plot(RSI_VWAP_long, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : RSI_VWAP_lnog < RSI_VWAP_overSold_long ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line) // h1=plot(RSI_VWAP_overBought_long, color = color.gray, style=plot.style_stepline) // h2=plot(RSI_VWAP_overSold_long, color = color.gray, style=plot.style_stepline) // fill(r,h1, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : na, transp = 60) // fill(r,h2, color = RSI_VWAP_long < RSI_VWAP_overSold_long ? color.lime : na, transp = 60) // Plotting SHORT, Put overlay=false // r=plot(RSI_VWAP_short, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line) // h1=plot(RSI_VWAP_overBought_short, color = color.gray, style=plot.style_stepline) // h2=plot(RSI_VWAP_overSold_short, color = color.gray, style=plot.style_stepline) // fill(r,h1, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : na, transp = 60) // fill(r,h2, color = RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : na, transp = 60) /////// STRATEGY Take Profit / Stop Loss //////// ////// LONG ////// long_tp1_inp = input(3.3, title='Long Take Profit 1 %', step=0.1)/100 long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1) long_tp2_inp = input(12, title='Long Take Profit 2%', step=0.1)/100 long_tp2_qty = input(100, title="Long Take Profit 2 Qty", step=1) long_sl_inp = input(3.3, title='Long Stop Loss %', step=0.1)/100 long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) long_stop_level = strategy.position_avg_price * (1 - long_sl_inp) ////// SHORT ////// short_tp1_inp = input(3.2, title='Short Take Profit 1 %', step=0.1)/100 short_tp1_qty = input(20, title="Short Take Profit 1 Qty", step=1) short_tp2_inp = input(5.5, title='Short Take Profit 2%', step=0.1)/100 short_tp2_qty = input(100, title="Short Take Profit 2 Qty", step=1) short_sl_inp = input(3.2, title='Short Stop Loss %', step=0.1)/100 short_take_level_1 = strategy.position_avg_price * (1 - short_tp1_inp) short_take_level_2 = strategy.position_avg_price * (1 - short_tp2_inp) short_stop_level = strategy.position_avg_price * (1 + short_sl_inp) ///Strategy_Conditions /// LONG /// entry_long =(crossover(RSI_VWAP_long, RSI_VWAP_overSold_long) and leadLine2<leadLine1) or (crossunder(mf,mfi_lower) and leadLine2<leadLine1) entry_price_long=valuewhen(entry_long,close,0) exit_long =crossunder(RSI_VWAP_long, RSI_VWAP_overBought_long) /// SHORT /// entry_short =crossunder(RSI_VWAP_short, RSI_VWAP_overBought_short) and leadLine2>leadLine1 or (crossover(mf,mfi_upper) and leadLine2>leadLine1) entry_price_short=valuewhen(entry_short,close,0) exit_short =crossover(RSI_VWAP_short, RSI_VWAP_overSold_short) ////// BACKTEST PERIOD /////// testStartYear = input(2019, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2020, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriod() => true if testPeriod() if strategy.position_size == 0 or strategy.position_size > 0 and rvi>benchmark strategy.entry("long", true, when = entry_long, comment="Insert Enter Long Comment") strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1, stop=long_stop_level) strategy.exit("TP2","long", qty_percent=long_tp2_qty, limit=long_take_level_2, stop=long_stop_level) strategy.close("long", when=exit_long, comment = "Insert Exit Long Comment") if strategy.position_size == 0 or strategy.position_size < 0 and rvi>benchmark strategy.entry("short", false, when = entry_short, comment="Insert Enter Short Comment") strategy.exit("TP1","short", qty_percent=short_tp1_qty, limit=short_take_level_1, stop=short_stop_level) strategy.exit("TP2","short", qty_percent=short_tp2_qty, limit=short_take_level_2, stop=short_stop_level) strategy.close("short", when=exit_short, comment = "Insert Exit Short Comment") // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit") plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit") plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss") // SHORT POSITION plot(strategy.position_size < 0 ? short_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Short Take Profit") plot(strategy.position_size < 0 ? short_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Short Take Profit") plot(strategy.position_size < 0 ? short_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")