Стратегия долгосрочного следования за трендом на основе индикатора RSI


Дата создания: 2023-12-25 14:32:19 Последнее изменение: 2023-12-25 14:32:19
Копировать: 1 Количество просмотров: 633
1
Подписаться
1623
Подписчики

Стратегия долгосрочного следования за трендом на основе индикатора RSI

Обзор

Стратегия, основанная на относительно сильных и слабых индикаторах (RSI), предназначена для многостороннего отслеживания трендов, направленных на покупку в низких точках RSI и остановку в высоких точках. Стратегия генерирует сигнал покупки, когда индикатор RSI ниже линии сверхпокупа, и генерирует сигнал продажи, когда индикатор RSI выше линии сверхпродажи. Стратегия оптимизирует эффективность отслеживания трендов и позволяет эффективно контролировать риск торговли.

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

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

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

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

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

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

Анализ рисков

  • “Многоглавая стратегия” не работает в бычьем рынке, который не может быть устойчивым
  • Существует вероятность того, что RSI выдаст ошибочный сигнал, и неправильный сигнал может увеличить потери
  • Слишком глубокая точка остановки рискует привести к необратимым убыткам
  • Отсутствие ограничений по количеству и пропорции вложений может привести к увеличению потерь

Направление оптимизации

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

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-12-17 00:00:00
end: 2023-12-24 00:00:00
period: 1m
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/

//@version=5

strategy(title='RSI Long Strategy', overlay=true, pyramiding=5, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0.075)
strat_dir_input = input.string(title='Strategy Direction', defval='long', options=['long', 'short', 'all'])
strat_dir_value = strat_dir_input == 'long' ? strategy.direction.long : strat_dir_input == 'short' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//INPUTS


length = input(21)
overSold = input(20)
overBought = input(80)
p = close

vrsi = ta.rsi(p, length)
price = close
var bool long = na
var bool short = na

long := ta.crossover(vrsi, overSold)
short := ta.crossunder(vrsi, overBought)

var float last_open_long = na
var float last_open_short = na

last_open_long := long ? close : nz(last_open_long[1])
last_open_short := short ? close : nz(last_open_short[1])
mpoint=(last_open_long+last_open_short)/2

entry_value = last_open_long
entry_value1 = last_open_short

// Rounding levels to min tick
nround(x) =>
    n = math.round(x / syminfo.mintick) * syminfo.mintick
    n
//
disp_panels = input(true, title='Display info panels?')
fibs_label_off = input(40, title='fibs label offset')
fibs_label_size = input.string(size.normal, options=[size.tiny, size.small, size.normal, size.large, size.huge], title='fibs label size')
r1_x = timenow + math.round(ta.change(time) * fibs_label_off)
r1_y = last_open_short
text1 = 'High : ' + str.tostring(nround(last_open_short))
s1_y = last_open_long
text3 = 'low : ' + str.tostring(nround(last_open_long))

R1_label = disp_panels ? label.new(x=r1_x, y=r1_y, text=text1, xloc=xloc.bar_time, yloc=yloc.price, color=color.orange, style=label.style_label_down, textcolor=color.black, size=fibs_label_size) : na
S1_label = disp_panels ? label.new(x=r1_x, y=s1_y, text=text3, xloc=xloc.bar_time, yloc=yloc.price, color=color.lime, style=label.style_label_up, textcolor=color.black, size=fibs_label_size) : na

label.delete(R1_label[1])
label.delete(S1_label[1])
//
plot(mpoint, title='avreage', color=color.new(color.red, 40), style=plot.style_linebr, linewidth=3, trackprice=true, offset=-9999)
plot(last_open_short, title='high', color=color.new(color.red, 40), style=plot.style_linebr, linewidth=3, trackprice=true, offset=-9999)
plot(last_open_long, title='low', color=color.new(color.blue, 40), style=plot.style_linebr, linewidth=3, trackprice=true, offset=-9999)
//
trend = input(false)
if barstate.islast and trend == true
    line z = line.new(bar_index[1], last_open_short[1], bar_index, last_open_short, extend=extend.both, color=color.red, style=line.style_dashed, width=1)
    line f = line.new(bar_index[1], mpoint[1], bar_index, mpoint, extend=extend.both, color=color.blue, style=line.style_dashed, width=1)
    line w = line.new(bar_index[1], last_open_long[1], bar_index, last_open_long, extend=extend.both, color=color.green, style=line.style_dashed, width=1)
    line.delete(z[1])
    line.delete(f[1])
    line.delete(w[1])
    
//bu = ta.crossover(close, mpoint)
//sz = ta.crossunder(close, mpoint)
//bu1 = ta.crossover(close, last_open_short)
sz1 = ta.crossunder(close, last_open_short)
bu2 = ta.crossover(close, last_open_long)
//sz2 = ta.crossunder(close, last_open_long)
//plotshape(sz, style=shape.triangledown, location=location.abovebar, color=color.new(color.orange, 0), size=size.tiny)
//plotshape(bu, style=shape.triangleup, location=location.belowbar, color=color.new(color.blue, 0), size=size.tiny)
//plotshape(sz1, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)
//plotshape(bu1, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.tiny)
//plotshape(sz2, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)
//plotshape(bu2, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.tiny)

l = bu2
s = sz1 
if l
    strategy.entry('buy', strategy.long)
if s
    strategy.entry('sell', strategy.short)
per(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
stoploss = input.float(title=' stop loss', defval=5, minval=0.01)
los = per(stoploss)
q1 = input.int(title=' qty_percent1', defval=50, minval=1)
q2 = input.int(title=' qty_percent2', defval=50, minval=1)
tp1 = input.float(title=' Take profit1', defval=3, minval=0.01)
tp2 = input.float(title=' Take profit2', defval=5, minval=0.01)
//tp4 = input.float(title=' Take profit4', defval=5, minval=0.01)
strategy.exit('x1', qty_percent=q1, profit=per(tp1), loss=los)
strategy.exit('x2', qty_percent=q2, profit=per(tp2), loss=los)