Estrategia de seguimiento de tendencias a largo plazo basada en el indicador RSI


Fecha de creación: 2023-12-25 14:32:19 Última modificación: 2023-12-25 14:32:19
Copiar: 1 Número de Visitas: 633
1
Seguir
1623
Seguidores

Estrategia de seguimiento de tendencias a largo plazo basada en el indicador RSI

Descripción general

La estrategia se basa en el diseño de indicadores de índices relativamente fuertes (RSI) para el seguimiento de tendencias en múltiples direcciones para comprar en los puntos bajos del RSI y detener los puntos altos. La estrategia genera una señal de compra cuando el indicador RSI está por debajo de la línea de sobreventa y genera una señal de venta cuando el indicador RSI está por encima de la línea de sobreventa. La estrategia optimiza el rendimiento del seguimiento de tendencias y puede controlar el riesgo de negociación de manera efectiva.

Principio de estrategia

La estrategia utiliza el RSI para determinar si el precio de las acciones está sobrevalorado o infravalorado. El RSI se combina con una línea de sobreventa y sobreventa para formar una señal de compra y venta. En concreto, si el RSI atraviesa la línea de sobreventa de 20 en el RSI, produce una señal de compra; si el RSI atraviesa la línea de sobreventa de 80 en el RSI, produce una señal de venta.

Después de entrar en posiciones múltiples, la estrategia establece una línea de stop loss inicial para controlar el riesgo de bajada. Al mismo tiempo, establece dos líneas de stop loss de diferentes proporciones, que se dividen en paradas para bloquear las ganancias. En concreto, primero detenga la posición del 50%, el precio de parada es el 3% del precio de compra; luego detenga la posición del 50% restante, el precio de parada es el 5% del precio de compra.

La estrategia utiliza el indicador RSI de manera concisa y efectiva para determinar el momento de entrar en el mercado. La configuración de stop loss es razonable y puede controlar el riesgo de manera efectiva.

Ventajas estratégicas

  • El índice RSI puede ayudar a determinar el exceso de vacío y evitar el exceso ciego.
  • Los parámetros del RSI se han optimizado para mejorar la efectividad del indicador
  • El diseño de las paredes de doble pared es razonable y permite el bloqueo por lotes para asegurar más ganancias.
  • Detención inicial y continua de pérdidas para evitar pérdidas masivas

Análisis de riesgos

  • Las estrategias de varios jefes no funcionan bien en un mercado de toros que no puede ser rentable de manera sostenida
  • La probabilidad de que el RSI emita una señal errónea existe, y la mala evaluación de la señal puede aumentar la pérdida
  • El punto de parada demasiado profundo conlleva un riesgo de pérdidas irrecuperables.
  • La falta de restricciones sobre el número y la proporción de las adquisiciones podría aumentar las pérdidas.

Dirección de optimización

  • En combinación con otros indicadores, filtra la señal RSI para mejorar la precisión de la señal
  • Añadir restricciones sobre el número y la proporción de adiciones
  • Prueba de la eficacia de los diferentes parámetros del RSI
  • Optimización del punto de parada de pérdidas y reducción del riesgo

Resumir

La estrategia utiliza el indicador RSI para juzgar el movimiento, la configuración de stop loss es razonable. Puede juzgar eficazmente la tendencia del movimiento, controlar el riesgo de la operación y es adecuada para el uso de estrategias de seguimiento de múltiples cabezas. Puede mejorar aún más la estabilidad de la estrategia a través de filtros de señales, pruebas de parámetros y optimización de stop loss.

Código Fuente de la Estrategia
/*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)