Стратегия дивергенции РСИ, основанная на пивотном процессе

Автор:Чао Чжан, Дата: 2023-11-28 13:43:05
Тэги:

img

Обзор

Эта стратегия называется Pivot-based RSI Divergence Strategy. Она использует дивергенцию между индикаторами RSI в разных циклах для определения точек входа и выхода и добавляет долгосрочный RSI в качестве фильтрующего условия для улучшения стабильности стратегии.

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

Стратегия в основном оценивает возможность покупки при наличии скрытого бычьего расхождения или регулярного бычьего расхождения между краткосрочным РСИ (например, 5-дневным РСИ) и ценой; и продажи при наличии скрытого медвежьего расхождения или регулярного медвежьего расхождения.

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

Кроме того, стратегия также вводит долгосрочный RSI (например, 50-дневный RSI) в качестве фильтрующего условия. Она рассматривает только сигналы покупки, когда длинный RSI больше 50; и рассматривает стоп-лосс или выход из прибыли, когда длинный RSI меньше 30.

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

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

  1. Краткосрочный сигнал дивергенции RSI может дать раннее суждение о возможностях переворота цен и своевременно зафиксировать поворотные моменты;
  2. Долгосрочный фильтр RSI избегает длительного слепого хождения, когда тенденция неопределенна;
  3. Различные виды методов получения прибыли и частичного получения прибыли помогают снизить риск;
  4. Механизм пирамиды позволяет добавлять позиции и еще больше расширяет потенциал прибыли.

Риски

Стратегия также несет в себе некоторые риски:

  1. Дивергенции RSI не всегда валидны и могут быть ложными сигналами;
  2. Риски усиливаются после пирамиды. Потери могут ускориться, если суждение ошибочно;
  3. Неправильное установление прибыли может также привести к досрочному получению прибыли или недостаточной прибыли.

Соответствующие меры управления рисками включают: разумное установление условий стоп-лосса/приобретения прибыли, контроль размеров позиций, частичное получение прибыли для сглаживания кривой собственного капитала и т.д.

Руководство по оптимизации

Существует возможность дальнейшей оптимизации стратегии:

  1. Параметры RSI могут быть дополнительно оптимизированы для поиска наилучшей комбинации;
  2. могут быть проверены сигналы дивергенции других индикаторов, таких как MACD и KD;
  3. Параметры могут быть специально оптимизированы для определенных продуктов (например, сырой нефти, драгоценных металлов и т. д.), чтобы улучшить адаптивность.

Резюме

Эта стратегия сочетает в себе длинные/короткие сигналы дивергенции краткосрочного и долгосрочного РСИ для повышения прибыльности при одновременном контроле рисков. Она отражает несколько принципов количественного проектирования стратегии, включая время входа, время выхода, частичное получение прибыли, установку стоп-лосса/приобретения прибыли и т. д. Это примерная стратегия дивергенции РСИ для отсчета.


/*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)



Больше