Tendencia alcista basada en el RSI siguiendo la estrategia

El autor:¿ Qué pasa?, Fecha: 2023-12-25 14:32:19
Las etiquetas:

img

Resumen general

Esta estrategia está diseñada basándose en el indicador de Relative Strength Index (RSI) para comprar en los puntos bajos del RSI y tomar ganancias y stop loss en los puntos altos del RSI. Genera señales de compra cuando el RSI cae por debajo de la línea de sobreventa y señales de venta cuando el RSI se eleva por encima de la línea de sobrecompra. La estrategia está optimizada para rastrear tendencias con un control de riesgo efectivo.

Estrategia lógica

La estrategia utiliza el indicador RSI para determinar si una acción está sobrevaluada o subvalorada. El RSI combinado con líneas sobrecompradas y sobrevendidas forma señales de compra y venta. Específicamente, si el RSI cruza por encima de la línea de sobreventa de 20, se genera una señal de compra; si el RSI cruza por debajo de la línea de sobreventa de 80, se genera una señal de venta.

Después de entrar en una posición larga, la estrategia establece un stop loss inicial para controlar el riesgo a la baja. Al mismo tiempo, se establecen dos líneas de toma de ganancias con diferentes ratios para tomar ganancias en lotes y bloquear las ganancias. Específicamente, el 50% de la posición obtendrá ganancias primero al 3% por encima del precio de entrada; luego la posición restante del 50% obtendrá ganancias al 5% por encima del precio de entrada.

La estrategia utiliza eficazmente el indicador RSI para determinar el momento de entrada.

Ventajas

  • Utilice el indicador RSI para determinar las posiciones largas/cortas y evitar la negociación a ciegas
  • Parámetros RSI optimizados para un mejor efecto del indicador
  • El diseño razonable de doble toma de beneficios permite tomar ganancias en lotes para obtener más ganancias
  • El stop loss inicial y el stop loss posterior evitan grandes pérdidas.

Los riesgos

  • Performance deficiente en un mercado alcista que no puede sostener las ganancias
  • Existe la probabilidad de señales incorrectas del RSI y puede aumentar las pérdidas por un juicio incorrecto de la señal
  • Riesgo de que no se puedan activar paradas si los puntos de parada de pérdidas se establecen demasiado profundos
  • El riesgo de pérdidas aumentadas sin límite en los tiempos de pirámide y la relación

Mejoras

  • Añadir otros indicadores para filtrar las señales RSI y mejorar la precisión
  • Establecer límites para los tiempos y las proporciones de la pirámide
  • Efectos de ensayo de diferentes parámetros del RSI
  • Optimizar el stop loss y tomar puntos de ganancia para reducir los riesgos

Resumen de las actividades

La estrategia utiliza el RSI para juzgar la condición del mercado y tiene una configuración razonable de stop loss y take profit. Puede determinar efectivamente la tendencia del mercado y controlar los riesgos comerciales, adecuados como una tendencia alcista después 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)



Más.