Стратегия показателей дивергенции РСИ

Автор:Чао Чжан, Дата: 2024-01-25 11:49:36
Тэги:

img

Обзор

Стратегия Дивергентного индикатора RSI - это количественная стратегия торговли, основанная на индикаторе относительной силы (RSI).

Логика стратегии

Основной индикатор этой стратегии - RSI. Он анализирует дивергенцию между индикатором RSI и ценой. Так называемое дивергенция относится к противоположным сигналам между RSI и ценой.

В частности, когда RSI формирует относительно низкий минимум, а цена формирует относительно более высокий минимум, это бычье расхождение между RSI и ценой. Это означает, что цена может перевернуться вверх. Стратегия установит длинную позицию в этот момент.

Напротив, когда индекс повышенности формирует относительно более высокий максимум, а цена формирует относительно более низкий максимум, это медвежье расхождение между индексом повышенности и ценой. Это означает, что цена может перейти вниз. Стратегия установит короткую позицию в этот момент.

Захватив эти расхождения между индексом рентабельности и ценой, стратегия может своевременно обнаружить возможности для переворота цен и достичь покупки низкого и продажи высокого.

Преимущества

Стратегия RSI Divergence имеет следующие преимущества:

  1. Расхождения между РСИ и ценой часто подразумевают предстоящее изменение тренда, что является очень эффективным прогнозным сигналом.

  2. Устанавливая позиции в точках расхождения, он может покупать по относительно низким ценам и продавать по относительно высоким ценам, соответствуя лучшим практикам количественной торговли.

  3. Прорыв ограничений традиционных стратегий RSI. Обычные стратегии RSI фокусируются только на перекупленных и перепроданных областях. Эта стратегия использует внутренние свойства обратного движения самого RSI для более точного определения поворотных точек, значительно повышая эффективность стратегии.

  4. Простые параметры настройки. Основные параметры просто период RSI и период обратной связи, который очень просто и легко оптимизировать.

Риски

Стратегия RSI Divergence также сопряжена с некоторыми рисками:

  1. Дивергенционные сигналы могут быть ложными сигналами. Дивергенции между RSI и ценой не обязательно приводят к реальным перепадам цен. Иногда они также образуют ложные перепады, приводящие к торговым потерям.

  2. Плохая производительность на трендовых рынках. Когда цена показывает ясную направленную тенденцию, пространство прибыли этой стратегии будет относительно небольшим. В этом случае лучше временно отключить стратегию и ждать новых рыночных колебаний.

  3. Риск пирамидирования. Стратегия устанавливает параметры пирамидирования. В случае последовательных проигрышных сделок, это может ускорить снижение счета. Размер позиции и стоп-лосс должны контролироваться для смягчения риска.

Усовершенствования

Стратегия также может быть оптимизирована в следующих аспектах:

  1. Для проверки точек дивергенции RSI можно добавлять MACD, KDJ и другие индикаторы, фильтруя некоторые ложные сигналы и улучшая показатель выигрыша стратегии.

  2. Оптимизировать параметры RSI. Различные периоды RSI можно протестировать, чтобы найти тот, который лучше всего соответствует характеристикам продукта.

  3. Оптимизировать период просмотра. Период просмотра напрямую влияет на частоту торговли стратегии. Различные значения могут быть протестированы, чтобы найти оптимальную частоту, обычно между 5-15 является хорошим диапазоном.

  4. Добавьте логику стоп-лосса. Разумные методы стоп-лосса, такие как ATR, могут быть реализованы для быстрого сокращения потерь при возникновении. Это может эффективно контролировать риск стратегии.

Заключение

Стратегия RSI Divergence точно отслеживает переломные моменты цен, анализируя внутренние свойства обратного движения самого индикатора 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


Больше