Стратегия Дивергентного индикатора RSI - это количественная стратегия торговли, основанная на индикаторе относительной силы (RSI).
Основной индикатор этой стратегии - RSI. Он анализирует
В частности, когда RSI формирует относительно низкий минимум, а цена формирует относительно более высокий минимум, это бычье расхождение между RSI и ценой. Это означает, что цена может перевернуться вверх. Стратегия установит длинную позицию в этот момент.
Напротив, когда индекс повышенности формирует относительно более высокий максимум, а цена формирует относительно более низкий максимум, это медвежье расхождение между индексом повышенности и ценой. Это означает, что цена может перейти вниз. Стратегия установит короткую позицию в этот момент.
Захватив эти расхождения между индексом рентабельности и ценой, стратегия может своевременно обнаружить возможности для переворота цен и достичь покупки низкого и продажи высокого.
Стратегия RSI Divergence имеет следующие преимущества:
Расхождения между РСИ и ценой часто подразумевают предстоящее изменение тренда, что является очень эффективным прогнозным сигналом.
Устанавливая позиции в точках расхождения, он может покупать по относительно низким ценам и продавать по относительно высоким ценам, соответствуя лучшим практикам количественной торговли.
Прорыв ограничений традиционных стратегий RSI. Обычные стратегии RSI фокусируются только на перекупленных и перепроданных областях. Эта стратегия использует внутренние свойства обратного движения самого RSI для более точного определения поворотных точек, значительно повышая эффективность стратегии.
Простые параметры настройки. Основные параметры просто период RSI и период обратной связи, который очень просто и легко оптимизировать.
Стратегия RSI Divergence также сопряжена с некоторыми рисками:
Дивергенционные сигналы могут быть ложными сигналами. Дивергенции между RSI и ценой не обязательно приводят к реальным перепадам цен. Иногда они также образуют ложные перепады, приводящие к торговым потерям.
Плохая производительность на трендовых рынках. Когда цена показывает ясную направленную тенденцию, пространство прибыли этой стратегии будет относительно небольшим. В этом случае лучше временно отключить стратегию и ждать новых рыночных колебаний.
Риск пирамидирования. Стратегия устанавливает параметры пирамидирования. В случае последовательных проигрышных сделок, это может ускорить снижение счета. Размер позиции и стоп-лосс должны контролироваться для смягчения риска.
Стратегия также может быть оптимизирована в следующих аспектах:
Для проверки точек дивергенции RSI можно добавлять MACD, KDJ и другие индикаторы, фильтруя некоторые ложные сигналы и улучшая показатель выигрыша стратегии.
Оптимизировать параметры RSI. Различные периоды RSI можно протестировать, чтобы найти тот, который лучше всего соответствует характеристикам продукта.
Оптимизировать период просмотра. Период просмотра напрямую влияет на частоту торговли стратегии. Различные значения могут быть протестированы, чтобы найти оптимальную частоту, обычно между 5-15 является хорошим диапазоном.
Добавьте логику стоп-лосса. Разумные методы стоп-лосса, такие как 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