この戦略は"ピボットベースのRSIダイバージェンシー戦略"と呼ばれる.これは,異なるサイクルにおけるRSI指標の間のダイバージェンスを利用してエントリー・アウトプット点を決定し,戦略の安定性を向上させるためのフィルター条件として長期RSIを追加する.
この戦略は,短期RSI (例えば5日間のRSI) と価格の間の"隠れた上昇差"または"定期的な上昇差"があるときに購入し,"隠れた下落差"または"定期的な下落差"があるときに売却する機会を主に判断します.
さらに,戦略はフィルター条件として長期RSI (例えば50日間のRSI) も導入している.ロングRSIが50を超えると購入信号のみを検討し,ロングRSIが30未満の場合,ストップ・ロストまたはテイク・プロフィート・エグジットも考慮する.
この戦略の最大の利点は,短期間のRSIの差異信号と長期間のRSIのフィルターの両方を利用することで,一定程度にトラップされ,トレンドを見逃すのを回避できるということです.具体的には,以下の主な利点があります:
この戦略には,注意すべきいくつかのリスクもあります.
対応するリスク管理措置には,ストップ・ロース/得益条件を合理的に設定し,ポジションサイズを制御し,株式曲線を平滑させるために部分的な得益を取ることなどが含まれます.
戦略をさらに最適化できる余地があります.
この戦略は,リスクを制御しながら収益性を向上させるため,短期および長期のRSIの長/短差信号を組み合わせます.これは,いつ入るか,いつ出るか,部分的利益占い,ストップ損失/利益占い設定などを含む定量戦略設計の複数の原則を反映しています.これは参照のための例のRSIの分散戦略です.
/*backtest start: 2023-11-20 00:00:00 end: 2023-11-27 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © mohanee //@version=4 //GOOGL setting 5 ,50 close, 3 , 1 profitLevel at 75 and No stop Loss shows win rate 99.03 % profit factor 5830.152 strategy(title="RSI5_50 with Divergence", overlay=false,pyramiding=2, default_qty_type=strategy.fixed, default_qty_value=3, initial_capital=10000, currency=currency.USD) len = input(title="RSI Period", minval=1, defval=5) longRSILen = input(title="Long RSI Period", minval=10, defval=50) src = input(title="RSI Source", defval=close) lbR = input(title="Pivot Lookback Right", defval=3) lbL = input(title="Pivot Lookback Left", defval=1) takeProfitRSILevel = input(title="Take Profit at RSI Level", minval=50, defval=75) stopLoss = input(title="Stop Loss%(if checked 8% rule applied)", defval=false) shortTermRSI = rsi(close,len) longTermRSI = rsi(close,longRSILen) rangeUpper = input(title="Max of Lookback Range", defval=60) rangeLower = input(title="Min of Lookback Range", defval=5) plotBull = input(title="Plot Bullish", defval=true) plotHiddenBull = input(title="Plot Hidden Bullish", defval=true) plotBear = input(title="Plot Bearish", defval=true) plotHiddenBear = input(title="Plot Hidden Bearish", defval=false) bearColor = color.purple bullColor = color.green hiddenBullColor = color.new(color.green, 80) hiddenBearColor = color.new(color.red, 80) textColor = color.white noneColor = color.new(color.white, 100) plot(shortTermRSI, title="RSI", linewidth=2, color=#8D1699) plot(longTermRSI, title="longTermRSI", linewidth=2, color=color.orange) hline(50, title="Middle Line", linestyle=hline.style_dotted) obLevel = hline(70, title="Overbought", linestyle=hline.style_dotted) osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted) fill(obLevel, osLevel, title="Background", color=longTermRSI >=50 ? color.green:color.purple, transp=65) // longTermRSI >=50 plFound = na(pivotlow(shortTermRSI, lbL, lbR)) ? false : true phFound = na(pivothigh(shortTermRSI, lbL, lbR)) ? false : true _inRange(cond) => bars = barssince(cond == true) rangeLower <= bars and bars <= rangeUpper //------------------------------------------------------------------------------ // Regular Bullish // shortTermRSI: Higher Low oscHL = shortTermRSI[lbR] > valuewhen(plFound, shortTermRSI[lbR], 1) and _inRange(plFound[1]) // Price: Lower Low priceLL = low[lbR] < valuewhen(plFound, low[lbR], 1) bullCond = plotBull and priceLL and oscHL and plFound plot( plFound ? shortTermRSI[lbR] : na, offset=-lbR, title="Regular Bullish", linewidth=2, color=(bullCond ? bullColor : noneColor), transp=0 ) plotshape( bullCond ? shortTermRSI[lbR] : na, offset=-lbR, title="Regular Bullish Label", text=" Bull ", style=shape.labelup, location=location.absolute, color=bullColor, textcolor=textColor, transp=0 ) //------------------------------------------------------------------------------ // Hidden Bullish // shortTermRSI: Lower Low oscLL = shortTermRSI[lbR] < valuewhen(plFound, shortTermRSI[lbR], 1) and _inRange(plFound[1]) // Price: Higher Low priceHL = low[lbR] > valuewhen(plFound, low[lbR], 1) hiddenBullCond = plotHiddenBull and priceHL and oscLL and plFound plot( plFound ? shortTermRSI[lbR] : na, offset=-lbR, title="Hidden Bullish", linewidth=2, color=(hiddenBullCond ? hiddenBullColor : noneColor), transp=0 ) plotshape( hiddenBullCond ? shortTermRSI[lbR] : na, offset=-lbR, title="Hidden Bullish Label", text=" H Bull ", style=shape.labelup, location=location.absolute, color=bullColor, textcolor=textColor, transp=0 ) longCondition= longTermRSI >=50 and ( (bullCond or hiddenBullCond ) ) or (strategy.position_size>0 and crossover(shortTermRSI,20) ) //last condition above is to leg in if you are already in the Long trade, strategy.entry(id="RSIDivLE", long=true, when=longCondition) //------------------------------------------------------------------------------ // Regular Bearish // shortTermRSI: Lower High oscLH = shortTermRSI[lbR] < valuewhen(phFound, shortTermRSI[lbR], 1) and _inRange(phFound[1]) // Price: Higher High priceHH = high[lbR] > valuewhen(phFound, high[lbR], 1) bearCond = plotBear and priceHH and oscLH and phFound plot( phFound ? shortTermRSI[lbR] : na, offset=-lbR, title="Regular Bearish", linewidth=2, color=(bearCond ? bearColor : noneColor), transp=0 ) plotshape( bearCond ? shortTermRSI[lbR] : na, offset=-lbR, title="Regular Bearish Label", text=" Bear ", style=shape.labeldown, location=location.absolute, color=bearColor, textcolor=textColor, transp=0 ) //------------------------------------------------------------------------------ // Hidden Bearish // shortTermRSI: Higher High oscHH = shortTermRSI[lbR] > valuewhen(phFound, shortTermRSI[lbR], 1) and _inRange(phFound[1]) // Price: Lower High priceLH = high[lbR] < valuewhen(phFound, high[lbR], 1) hiddenBearCond = plotHiddenBear and priceLH and oscHH and phFound plot( phFound ? shortTermRSI[lbR] : na, offset=-lbR, title="Hidden Bearish", linewidth=2, color=(hiddenBearCond ? hiddenBearColor : noneColor), transp=0 ) plotshape( hiddenBearCond ? shortTermRSI[lbR] : na, offset=-lbR, title="Hidden Bearish Label", text=" H Bear ", style=shape.labeldown, location=location.absolute, color=bearColor, textcolor=textColor, transp=0 ) //calculate stop Loss stopLossVal = stopLoss==true ? ( strategy.position_avg_price - (strategy.position_avg_price*0.08) ) : 0 //partial profit strategy.close(id="RSIDivLE", comment="TP1", qty=strategy.position_size*3/4, when=strategy.position_size>0 and (longTermRSI>=takeProfitRSILevel or crossover(longTermRSI,90))) strategy.close(id="RSIDivLE",comment="TP2", qty=strategy.position_size*3/4 , when=crossover(longTermRSI,70)) strategy.close(id="RSIDivLE",comment="TP3", qty=strategy.position_size/2, when=crossover(longTermRSI,65)) strategy.close(id="RSIDivLE",comment="TP4", qty=strategy.position_size/2 , when=crossover(longTermRSI,60)) //close the whole position when stoploss hits or longTermRSI goes below 30 strategy.close(id="RSIDivLE",comment="Exit", when=crossunder(longTermRSI,30) or close<stopLossVal)