Estrategia de negociación de futuros compuestos para el control rápido del riesgo RSI

El autor:¿ Qué pasa?, Fecha: 2023-11-13 11:36:34
Las etiquetas:

img

Resumen general

Esta estrategia está diseñada para la plataforma de negociación al contado BitMEX. Al analizar el indicador RSI rápido y combinar múltiples indicadores técnicos para detectar señales, se realiza una negociación eficiente de seguimiento de tendencias. La estrategia también establece mecanismos de gestión de riesgos y stop loss para controlar eficazmente los riesgos comerciales.

Estrategia lógica

  1. Calcular el RSI rápido con parámetros de 7 días y línea sobrecomprada 25, línea sobrevendida 75. Cuando el RSI cruza la línea sobrecomprada, es una señal de sobrecompra. Cuando el RSI cruza por debajo de la línea sobrevendida, es una señal de sobreventa.

  2. Establecer el filtro en el cuerpo del candelabro. Requiere la apertura como una vela bajista con una longitud del cuerpo no inferior al 20% de la longitud del cuerpo promedio de ayer.

  3. Establezca el filtro en el color del candelero. Requiera que las últimas 4 velas sean bajistas cuando vaya corto, y las últimas 4 velas sean alcistas cuando vaya largo.

  4. Establece la lógica de stop loss. Cierra la posición cuando el precio se mueve en una dirección desfavorable.

  5. Configure el mecanismo anti-sera de freno. Sólo tome la señal cuando el precio se recupere para detener el nivel de pérdida después del movimiento inicial.

  6. Utilice un porcentaje fijo de capital para cada operación, y duplique el tamaño de la posición después de cada pérdida.

Análisis de ventajas

  1. Los parámetros de RSI rápidos establecidos razonablemente pueden capturar rápidamente las tendencias.

  2. El filtro de múltiples capas mejora la tasa de ganancia al reducir el número de operaciones.

  3. Mecanismo de stop loss incorporado para limitar las pérdidas por operación.

  4. El dimensionamiento dinámico de las posiciones permite una gestión moderadamente agresiva del capital.

  5. El marco de tiempo de negociación personalizable evita el ruido de los eventos importantes.

Riesgos y optimizaciones

  1. La alta velocidad puede perder algunas oportunidades comerciales, puede relajar los parámetros para mayor flexibilidad.

  2. Es difícil determinar el final de la tendencia, considere combinarlo con otros indicadores para detectar posibles reversiones.

  3. Método de dimensionamiento de posición demasiado agresivo, puede introducir el bloqueo de la posición de manera.

  4. Puede optimizar parámetros para diferentes mercados para encontrar mejores combinaciones de parámetros.

Conclusión

En general, esta estrategia es bastante robusta. Al juzgar la dirección de la tendencia con RSI rápido y filtrar señales con múltiples indicadores, puede obtener buenos rendimientos durante las tendencias. También la estrategia tiene espacio para la optimización. Al ajustar las combinaciones de parámetros, puede adaptarse a diferentes entornos de mercado, teniendo así una buena practicidad.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Robot BitMEX Fast RSI v1.0", shorttitle = "Robot BitMEX Fast RSI v1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(true, defval = true, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
rsiperiod = input(7, defval = 7, minval = 2, maxval = 100, title = "RSI Period")
rsilimit = input(25, defval = 25, minval = 1, maxval = 30, title = "RSI limit")
rsibars = input(1, defval = 1, minval = 1, maxval = 20, title = "RSI Bars")
useocf = input(true, defval = true, title = "Use Open Color Filter")
useccf = input(true, defval = true, title = "Use Close Color Filter")
openbars = input(4, defval = 4, minval = 1, maxval = 20, title = "Open Color Bars")
closebars = input(1, defval = 1, minval = 1, maxval = 20, title = "Close Color Bars")
useobf = input(true, defval = true, title = "Use Open Body Filter")
usecbf = input(true, defval = true, title = "Use Close Body Filter")
openbody = input(20, defval = 20, minval = 0, maxval = 1000, title = "Open Body Minimum, %")
closebody = input(50, defval = 50, minval = 0, maxval = 1000, title = "Close Body Minimum, %")
usecnf = input(true, defval = true, title = "Use Close Norma Filter")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From Day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To Day")

//RSI
uprsi = rma(max(change(close), 0), rsiperiod)
dnrsi = rma(-min(change(close), 0), rsiperiod)
rsi = dnrsi == 0 ? 100 : uprsi == 0 ? 0 : 100 - (100 / (1 + uprsi / dnrsi))
uplimit = 100 - rsilimit
dnlimit = rsilimit
rsidn = rsi < dnlimit ? 1 : 0
rsiup = rsi > uplimit ? 1 : 0
rsidnok = sma(rsidn, rsibars) == 1
rsiupok = sma(rsiup, rsibars) == 1

//Body Filter
body = abs(close - open)
abody = sma(body, 10)
openbodyok = body >= abody / 100 * openbody or useobf == false
closebodyok = body >= abody / 100 * closebody or usecbf == false

//Color Filter
bar = close > open ? 1 : close < open ? -1 : 0
gbar = bar == 1 ? 1 : 0
rbar = bar == -1 ? 1 : 0
opengbarok = sma(gbar, openbars) == 1 or useocf == false
openrbarok = sma(rbar, openbars) == 1 or useocf == false
closebarok = (strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1) or useccf == false

//Norma Filter
norma = (rsi > dnlimit and rsi < uplimit) or usecnf == false

//Signals
up = openrbarok and rsidnok and openbodyok and (strategy.position_size == 0 or close < strategy.position_avg_price)
dn = opengbarok and rsiupok and openbodyok and (strategy.position_size == 0 or close > strategy.position_avg_price)
exit = ((strategy.position_size > 0 and closebarok and norma) or (strategy.position_size < 0 and closebarok and norma)) and closebodyok

//Indicator
plot(rsi, color = blue, linewidth = 3, title = "Double RSI")
plot(uplimit, color = black, title = "Upper Line")
plot(dnlimit, color = black, title = "Lower Line")
colbg = rsi > uplimit ? red : rsi < dnlimit ? lime : na
bgcolor(colbg, transp = 20)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Más.