RSI ロングおよびショートダイバージェンスインジケーター


作成日: 2024-01-25 11:49:36 最終変更日: 2024-01-25 11:49:36
コピー: 0 クリック数: 861
1
フォロー
1617
フォロワー

RSI ロングおよびショートダイバージェンスインジケーター

概要

RSI多空差指数は,相対的に強い指標 ((RSI)) をベースにした量的な取引戦略である.それは,RSI指数と価格の間の差を分析し,価格のトレンドの逆転の機会を発見し,低買い高売りの目的を達成する.

戦略原則

この戦略の核心指標はRSIである.それは,RSI指標と価格の間の離を分析する.離は,RSI指標と価格の間の反転信号である.

具体的には,RSIが低い低点を形成し,価格が高い低点を形成するとき,それはRSIと価格の多頭差である.これは,価格が反転して上昇する可能性を示唆している.戦略は,この時点で多頭ポジションを構築する.

逆に,RSIが高い高点を形成し,価格が低い高点を形成するとき,それはRSIと価格の空頭差である.これは,価格が反転して下落する可能性を示唆している.戦略は,この時点で空頭ポジションを構築する.

RSIと価格の間のこれらの分岐点を捉えることで,戦略は価格の逆転の機会を早期に発見し,低買いと高売りを実現します.

戦略的優位性

RSI多空分岐策には以下の利点があります.

  1. 価格の逆転点を正確に捉える. RSIと価格の相違は,しばしば進行中のトレンドの逆転を予告する非常に効果的な予測信号である.

  2. 低買い高売りを実現する. 差異点の形成により,相対的に低い値で買い,相対的に高い値で売り,量化取引のベストプラクティスに適合する.

  3. 従来のRSI策略の限界を突破する.従来のRSI策略は,超買い超売り領域にのみ焦点を当てている.この策略は,RSI指数の反転特性を利用して,ターニングポイントをより正確に捕捉する.戦略の効率が大きく向上する.

  4. シンプルなパラメータ設定。主要パラメータはRSI周期と回顧区間2つしかなく,非常にシンプルで,容易に最適化。

戦略リスク

RSIの多空分岐策にはリスクがあります.

  1. 差異信号は偽信号である可能性があります. RSIと価格の差異は必ずしも本当の価格反転を引き起こすわけではありません. 時には偽反転が形成されることがあります. これは取引の損失を引き起こす可能性があります. リスクを制御するために適切なストップを設定できます.

  2. トレンド市場での不良なパフォーマンス. 株価が明確な方向のトレンドの動きが現れたとき,この戦略の利益の余地は比較的小さい. この場合,この戦略を一時的に停止して,新しい震動の動きを待つことが最善である.

  3. 利回りリスク。戦略は利回りパラメータを設定し,もし複数の負債取引が発生した場合,口座損失を加速させる可能性があります。これは,ポジションの規模と止損点を制御してリスクを低減させる必要がある。

戦略の最適化

この戦略は,以下の点で最適化できます.

  1. 他の指標のフィルター信号と組み合わせます.MACD,KDJなどの他の指標を追加して,RSIの分岐点を検証し,いくつかの偽信号をフィルターして,戦略の勝率を向上させることができます.

  2. RSIパラメータを最適化します.異なるRSI周期パラメータをテストして,品種特性に最も適合するRSI周期設定を見つけることができます.一般的には6-15の間で効果がよくなります.

  3. 回顧区間を最適化する. 回顧区間は,戦略に直接影響する取引頻度である. 異なるパラメータをテストして,最適な頻度を見つける. 一般的には5-15の間で効果が良い.

  4. 増減策 ≪ATR,移動止損などにより,合理的な止損論理を設定できる。損失が発生した場合に迅速に止めて,戦略リスクを効果的に制御できる。

要約する

RSI多空差策略は,RSI指数自体の反転特性を分析することによって,価格変化の転換点を正確に捕捉する.低買い高売りの取引戦略を実現する.従来の意味でのRSI超買い超売り策略と比較して,より精巧で原始的なRSI特性を使用し,戦略の効率を大幅に向上させる.パラメータの最適化とリスク管理と組み合わせて,それは震動の状況でのショートライン取引の機会を捕捉するのに最適である.

ストラテジーソースコード
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//study(title="Divergence Indicator", format=format.price)
//GOOGL setting  5 , close, 3 , 1  profitLevel at 75 shows win rate  87.21 %  profit factor 7.059
//GOOGL setting  8 , close, 3 , 1  profitLevel at 80 shows win rate  86.57 %  profit factor 18.96 
//SPY setting    5, close , 3, 3  profitLevel at 70  , shows win rate 80.34%  profit factor 2.348
strategy(title="RSI Divergence Indicator", overlay=false,pyramiding=2, default_qty_value=2,   default_qty_type=strategy.fixed, initial_capital=10000, currency=currency.USD)

len = input(title="RSI Period", minval=1, defval=9)
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=70, defval=80)

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)

//useTrailStopLoss = input(false, title="Use Trailing Stop Loss")

sl_type = input("NONE", title="Trailing StopLoss Type", options=['ATR','PERC', 'NONE'])

stopLoss = input(title="Stop Loss%", defval=5, minval=1)

atrLength=input(14, title="ATR Length (for Trailing stop loss)")
atrMultiplier=input(3.5, title="ATR Multiplier (for Trailing stop loss)")


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)

osc = rsi(src, len)

plot(osc, title="RSI", linewidth=2, color=#8D1699)
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=#9915FF, transp=90)

plFound = na(pivotlow(osc, lbL, lbR)) ? false : true
phFound = na(pivothigh(osc, lbL, lbR)) ? false : true

_inRange(cond) =>
    bars = barssince(cond == true)
    rangeLower <= bars and bars <= rangeUpper

//------------------------------------------------------------------------------
// Regular Bullish

// Osc: Higher Low
oscHL = osc[lbR] > valuewhen(plFound, osc[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 ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bullish",
	 linewidth=2,
	 color=(bullCond ? bullColor : noneColor),
	 transp=0
	 )


plotshape(
	 bullCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bullish Label",
	 text=" Bull ",
	 style=shape.labelup,
	 location=location.absolute,
	 color=bullColor,
	 textcolor=textColor,
	 transp=0
	 )

//------------------------------------------------------------------------------
// Hidden Bullish

// Osc: Lower Low
oscLL = osc[lbR] < valuewhen(plFound, osc[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 ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bullish",
	 linewidth=2,
	 color=(hiddenBullCond ? hiddenBullColor : noneColor),
	 transp=0
	 )

plotshape(
	 hiddenBullCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bullish Label",
	 text=" H Bull ",
	 style=shape.labelup,
	 location=location.absolute,
	 color=bullColor,
	 textcolor=textColor,
	 transp=0
	 )

longCondition=bullCond or hiddenBullCond
//? osc[lbR] : na  
//hiddenBullCond
strategy.entry(id="RSIDivLE", long=true,  when=longCondition)


//Trailing StopLoss
////// Calculate trailing SL
/////////////////////////////////////////////////////
sl_val = sl_type == "ATR"      ? stopLoss * atr(atrLength) : 
         sl_type == "PERC" ? close * stopLoss / 100 : 0.00

trailing_sl = 0.0
trailing_sl :=   strategy.position_size>=1 ?  max(low  - sl_val, nz(trailing_sl[1])) :  na

//draw initil stop loss
//plot(strategy.position_size>=1 ? trailing_sl : na, color = color.blue , style=plot.style_linebr,  linewidth = 2, title = "stop loss")
//plot(trailing_sl, title="ATR Trailing Stop Loss", style=plot.style_linebr, linewidth=1, color=color.purple, transp=30)
//Trailing StopLoss
////// Calculate trailing SL
/////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// Regular Bearish

// Osc: Lower High
oscLH = osc[lbR] < valuewhen(phFound, osc[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 ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bearish",
	 linewidth=2,
	 color=(bearCond ? bearColor : noneColor),
	 transp=0
	 )

plotshape(
	 bearCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bearish Label",
	 text=" Bear ",
	 style=shape.labeldown,
	 location=location.absolute,
	 color=bearColor,
	 textcolor=textColor,
	 transp=0
	 )

//------------------------------------------------------------------------------
// Hidden Bearish

// Osc: Higher High
oscHH = osc[lbR] > valuewhen(phFound, osc[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 ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bearish",
	 linewidth=2,
	 color=(hiddenBearCond ? hiddenBearColor : noneColor),
	 transp=0
	 )

plotshape(
	 hiddenBearCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bearish Label",
	 text=" H Bear ",
	 style=shape.labeldown,
	 location=location.absolute,
	 color=bearColor,
	 textcolor=textColor,
	 transp=0
	 )
longCloseCondition=crossover(osc,takeProfitRSILevel) or bearCond
strategy.close(id="RSIDivLE", comment="Close All="+tostring(close - strategy.position_avg_price, "####.##"), when= abs(strategy.position_size)>=1  and  sl_type == "NONE" and longCloseCondition)

//close all on stop loss
strategy.close(id="RSIDivLE", comment="TSL="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and (sl_type == "PERC"   or sl_type == "ATR" ) and crossunder(close, trailing_sl)  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89


// Calculate start/end date and time condition
startDate  = input(timestamp("2019-01-01T00:00:00"), type = input.time)
finishDate = input(timestamp("2021-01-01T00:00:00"), type = input.time)
 
time_cond  = time >= startDate and time <= finishDate