Индикатор RSI длинная и короткая стратегия


Дата создания: 2023-09-19 19:43:19 Последнее изменение: 2023-09-19 19:43:19
Копировать: 0 Количество просмотров: 746
1
Подписаться
1617
Подписчики

Обзор

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

Стратегический принцип

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

  1. Расчет RSI
  2. Настройка верхней и нижней границы RSI
  3. RSI, входящий по умолчанию
  4. Если RSI превышает нижний предел, посмотрите на вход.
  5. Установка параметров остановки и потери
  6. RSI будет закрывать позиции, когда войдет в диапазон или будет вызывать условия стоп-стоп

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

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

Стратегические преимущества

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

Стратегические риски

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

Контрмеры:

  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)