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

Автор:Чао Чжан, Дата: 2023-09-19 19:43:19
Тэги:

Обзор

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

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

Основная логика включает:

  1. Расчет значения RSI
  2. Установление верхних и нижних пределов РСИ
  3. Продолжает работать, когда RSI превышает верхний предел
  4. Долгое время, когда RSI переходит ниже нижней границы
  5. Установление уровней получения прибыли и стоп-лосса
  6. Выходные позиции при изменении показателя RSI или прибыли/стоп-лосса

Показатель RSI показывает перекупленность выше 70 и перепроданность ниже 30 рыночных условий. Стратегия использует эту классическую логику для определения длинных/коротких входов на основе значения RSI против заранее установленных лимитов. Настраиваемые параметры также позволяют оптимизировать лимиты, стоп-лосс и т. Д. для адаптации рынка.

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

  • RSI эффективно определяет состояние рынка с перекупленными/перепроданными
  • ИНС имеет прочную теоретическую основу
  • Настраиваемые параметры адаптируются к различным инструментам и условиям
  • Определяется риск, связанный с получением прибыли/остановкой потерь.

Риски и их смягчение

  • Потенциал ложных сигналов RSI, приводящих к потерям
  • Требует постоянной оптимизации уровней RSI
  • Стопы могут быть часто достигнуты во время колебания цены

Уменьшение последствий:

  1. Дополнительные факторы для подтверждения сигналов и избежания ложных
  2. Оптимизировать уровни RSI на основе характеристик прибора
  3. Корректировать размещение стоп-лосса для снижения рисков

Возможности для расширения

Стратегия может быть усовершенствована путем:

  1. Машинное обучение для автоматической оптимизации уровня RSI

  2. Подтверждение объема для предотвращения ложных прорывов

  3. Дополнительные факторы, такие как скользящие средние для многофакторного подтверждения

  4. Пристрастительные остановки на основе волатильности рынка

  5. Анализ объема для измерения притока/вытока средств

  6. Сочетание с некорелерованными стратегиями для снижения снижения портфеля

Заключение

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


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("4All V3", shorttitle="Strategy", overlay=true)

/////////////// Component Code Start ///////////////
testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/////////////// Component Code Stop ///////////////

src = close
len = input(4, minval=1, title="Length")

up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

rsin = input(5)
sn = 100 - rsin
ln = 0 + rsin

/////////////// STRATEGY ///////////////
ts = input(99999, "Trailing Stop") / 10000
tp = input(15, "Take Profit") / 10000
sl = input(23, "Stop Loss") / 10000

pyr = input(1, "Pyramiding")

short = crossover(rsi, sn)
long = crossunder(rsi, ln)

totalLongs = 0
totalLongs := nz(totalLongs[1])
totalShorts = 0
totalShorts := nz(totalShorts[1])

totalLongsPrice = 0
totalLongsPrice := nz(totalLongsPrice[1])
totalShortsPrice = 0
totalShortsPrice := nz(totalShortsPrice[1])

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if long
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if short
    sectionLongs := 0
    sectionShorts := sectionShorts + 1

longCondition = long and sectionLongs >= pyr
shortCondition = short and sectionShorts >= pyr

last_long = na
last_short = na
last_long := longCondition ? time : nz(last_long[1])
last_short := shortCondition ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = na
last_open_short_signal = na
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = na
last_short_signal = na
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = na
last_low = na
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(1, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=longCondition)
    strategy.entry("Short", strategy.short, when=shortCondition)
    
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)

Больше