RSI 差異戦略

作者: リン・ハーンチャオチャン,日付: 2023-11-16 11:36:45
タグ:

img

概要

この戦略は,RSI EMA線間のRSI指標とクロスオーバーを計算し,RSIと価格の間の差異を組み合わせて,潜在的な取引信号を見つけるために,ロングとショートポジションを決定します.これはトレンドフォロー戦略に属します.

戦略の論理

  1. RSIが50を超えると 買い信号で 50を下回ると 売る信号です

  2. RSI の 20 期 EMA と 14 期 EMA を計算します. 遅い EMA を越える速い EMA は買い信号で,下を越える EMA は売る信号です.

  3. RSIと価格の差異を検出する

  • 定期的な上昇差:価格が新低に達しますが,RSIはそうではありません. 購入信号

  • 価格が新高に達するが,RSIは上昇しない.

  • 定期的な下落差:価格が新高に達するが,RSIは上昇しない.

  • 価格が新低に達するが,RSIは上昇しない.

  1. ストップ・ロスの戦略は,パーセントベースとATRベースを含むように有効にすることができます.

利点分析

  1. RSI インディケーターは過買い・過売りの状況を検出するのに適しています. EMAはデータ内のノイズを平ら化することができます.

  2. RSIと価格の差は 早期の逆転信号を提示します

  3. 2つの指標からのシグナルを組み合わせることで,互いに検証し,戦略の安定性を向上させることができます.

  4. ストップロスのメカニズムは,単一の取引損失を制御します.

リスク分析

  1. RSIは価格が急激に変動するときに 低性能になる可能性があります

  2. EMAは時間遅れがあり ターニングポイントを正確に特定できません

  3. トレンドが続ければ 差異信号が 偽信号を生む可能性があります

  4. ストップ・ロスの設定が正しくない場合,不必要な損失を引き起こす可能性があります.

  5. 引き上げは大きくなり 十分な資本が必要です

オプティマイゼーションの方向性

  1. RSIとEMAの計算のために異なるパラメータをテストし,最適な組み合わせを見つけます.

  2. EMAをMACDのような他の指標に置き換えて 整体最適化を検討してください

  3. 誤差を避けるための確認メカニズムを追加します.例えば,連続信号が必要になります.

  4. 利益を得る戦略を追加します

  5. この戦略のトレンド判断と組み合わせて 短期的な信号を組み込む

概要

この戦略は,RSIの過剰購入/過剰売却検出,EMAとトレンドフォロー,および分散の逆転予測を体系的なトレンド追跡システムに統合する.パラメータ調節とアンサンブル最適化により,良い結果が得られる.しかし,トレンドショックや誤った信号などのリスクは防げなければならない.適切なマネーマネジメントによって,この戦略は中長期間に安定した過剰リターンを生み出すことができる.


/*backtest
start: 2023-11-08 00:00:00
end: 2023-11-15 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
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=14)
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)

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.red
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=color.white)
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=color.gray, 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

src1 = close, 
len6 = input(14, minval=1, title="RSI Length")
len7 = input(20, minval=1, title="EMA of RSI Length")
len8 = input(14,minval=1, title="Fast EMA")
up = rma(max(change(src1), 0), len6)
down = rma(-min(change(src1), 0), len6)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
emaRSI = ema(rsi,len7)
fastEmaRSI=ema(rsi,len8)

plot(emaRSI, title="EMA of RSI", linewidth=1, color=color.red)
plot(fastEmaRSI,title="Fast EMA of RSI", linewidth=1,color = color.lime)
band1 = hline(80, title="Upper Line", linewidth=1, color=color.red)
band0 = hline(20, title="Lower Line", linewidth=1, color=color.lime)
fill(band1, band0, color=color.purple)

もっと