Estrategia de negociación de combinación de media móvil de Hull y RSI estocástico

El autor:¿ Qué pasa?, Fecha: 2023-10-18 12:40:23
Las etiquetas:

img

Resumen general

Esta estrategia utiliza el promedio móvil de Hull para determinar la dirección de la tendencia y lo combina con el RSI estocástico para señales de entrada. Las operaciones largas se realizan cuando la línea media de HMA cruza por encima de la línea inferior, y las operaciones cortas cuando cruza por debajo de la línea superior. Además, las operaciones largas se realizan cuando la línea estocástica RSI K cruza por debajo de la línea D desde la zona de sobrecompra, mientras que las operaciones cortas se realizan en cruces por encima de la zona de sobreventa.

Estrategia lógica

Los componentes clave de esta estrategia son el promedio móvil de Hull para la dirección de la tendencia y el RSI estocástico para las señales de entrada de tiempo.

En primer lugar, el cálculo de Hull MA incluye fórmulas para las bandas media, superior e inferior. La banda media utiliza una media móvil ponderada, mientras que las bandas superior e inferior se desplazan desde la línea media.

La dirección de la tendencia está determinada por la relación entre la banda media y las bandas superior/inferior.

También se define el cálculo del RSI estocástico, incluyendo los valores suavizados K y D. El valor K utiliza una suavización de SMA en el RSI, mientras que el valor D es una segunda suavización de SMA en el K.

Después de determinar la dirección de la tendencia, se realizan operaciones largas cuando la línea K del RSI de Stoch cruza por debajo de la línea D desde la zona de sobrecompra durante una tendencia alcista.

La combinación del filtro de tendencia de Hull y el análisis de sobrecompra/sobreventa del RSI de Stoch proporciona un enfoque robusto de múltiples factores para iniciar operaciones.

Ventajas

Los principales beneficios de esta estrategia son:

  1. El MA del casco identifica efectivamente la dirección general de la tendencia del mercado.

  2. El RSI de Stoch determina los niveles de sobrecompra / sobreventa en entradas de tiempo.

  3. El uso de ambos juntos reduce las señales falsas y combina las fortalezas.

  4. Flexibilidad para optimizar los parámetros para diferentes símbolos y plazos.

  5. Las bandas del casco identifican el apoyo y la resistencia dinámicos potenciales.

  6. Incluye normas de dimensionamiento de posiciones y gestión de riesgos.

  7. Capacidad de múltiples activos a través del diccionario de datos del casco.

  8. Componentes que pueden optimizarse para mejorar la rentabilidad y reducir las reducciones.

Los riesgos

Algunos riesgos a considerar:

  1. Hull MA tiene retraso y puede perder cambios de tendencia.

  2. El RSI de Stoch puede generar señales excesivas si los parámetros no se optimizan.

  3. El desajuste entre los parámetros de Hull y Stoch puede causar malas señales.

  4. Las bandas de casco demasiado anchas o estrechas afectarán la calidad de la señal.

  5. Los mercados volátiles recientes desafían los indicadores a medio y largo plazo.

  6. Desajustes de datos entre Hull y Stoch causando señales falsas.

  7. Los cambios bruscos de tendencia no captados por Hull pueden causar pérdidas.

  8. Necesitamos pruebas ampliadas en múltiples marcos de tiempo y símbolos.

Algunas maneras de abordarlos:

  1. Acortar la longitud del casco MA para una mayor sensibilidad a la tendencia.

  2. Optimice el índice de Stoch para filtrar las falsas cruzadas.

  3. Encuentra el ancho óptimo del canal de banda del casco.

  4. Añadir indicadores de confirmación adicionales como el MACD.

  5. Incorporar estrategias de stop loss para controlar el riesgo.

Oportunidades de optimización

Algunas maneras en que esta estrategia podría mejorarse:

  1. Prueba con más símbolos en varios plazos para verificar la robustez.

  2. Incorporar mecánicas de stop loss como paradas traseras o promedios móviles.

  3. Optimizar las reglas de entrada, establecer filtros más estrictos para reducir las señales falsas.

  4. Explorar el uso de bandas de casco para definir mejor el soporte y la resistencia.

  5. Evaluar indicadores de confirmación adicionales para mejorar la fiabilidad de la señal.

  6. Optimización de parámetros para longitudes, niveles de sobrecompra/sobreventa, etc.

  7. Introducir un mejor tamaño de las posiciones y una mejor gestión del riesgo.

  8. Las reglas de entrada, stop loss y take profit son esenciales para el comercio en vivo.

  9. Optimice la longitud del casco para una mejor sensibilidad a la tendencia.

  10. Añadir filtros o indicadores de confirmación para mejorar la calidad de la señal.

  11. Explore las bandas del casco para los niveles de soporte/resistencia dinámicos.

  12. Optimice los parámetros del RSI de Stoch como longitud, sobrecompra/sobreventa.

  13. Implementar el tamaño avanzado de las posiciones y la gestión del riesgo.

Conclusión

En general, este es un enfoque efectivo que combina tendencia e impulso. Sin embargo, las debilidades inherentes del indicador significan que las señales no deben confiar ciegamente sin una mayor optimización y control de riesgos. Con parámetros refinados, filtros adicionales y stop losses, esta estrategia ofrece potencial. Se necesitan pruebas más extensas para los parámetros, la gestión de riesgos y el tamaño de la posición para que sea robusta y rentable para el comercio en vivo.


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

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, 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.023)
strat_dir_input = input(title="Strategy Direction", defval="all", 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)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float)
stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float)
sl = input(0.7, "SL %", type=input.float, step=0.1)
tp = input(2.1, "TP %", type=input.float, step=0.1)
// slowEMA = ema(close, slowEMA_input)

// vwap = vwap(close)
// rsi = rsi(close, rsi_input)


// stoch rsi
smoothK = 3
smoothD = 3
lengthRSI = 14
lengthStoch = 14
rsi1 = rsi(close, 14)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?")
candleCol = input(false,title="Color candles based on Hull's Trend?")
visualSwitch  = input(true, title="Show as a Band?")
thicknesSwitch = input(1, title="Line Thickness")
transpSwitch = input(40, title="Band Transparency",step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>  wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>  ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length)))
//THMA    
THMA(_src, _length) =>  wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length)
    
//SWITCH
Mode(modeSwitch, src, len) =>
      modeSwitch == "Hma"  ? HMA(src, len) :
      modeSwitch == "Ehma" ? EHMA(src, len) : 
      modeSwitch == "Thma" ? THMA(src, len/2) : na
      
//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

bgcolor(color = k < stoch_lower_input  and crossover(k, d) ? color.green : na)
bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na)

notInTrade = strategy.position_size == 0

if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d)
// if HULL[0] > HULL[2] and testPeriod()
    stopLoss = close * (1 - sl / 100) 
    profit25 = close * (1 + (tp / 100) * 0.25)
    profit50 = close * (1 + (tp / 100) * 0.5)
    takeProfit = close * (1 + tp / 100)
    
    
    strategy.entry("long", strategy.long, alert_message="buy")
    strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

    
if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k)
// if HULL[0] < HULL[2] and testPeriod()
    stopLoss = close * (1 + sl / 100)
    profit25 = close * (1 - (tp / 100) * 0.25)
    profit50 = close * (1 - (tp / 100) * 0.5)
    takeProfit = close * (1 - tp / 100)
    
    

    strategy.entry("short", strategy.short, alert_message="sell")
    strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

// var table winrateDisplay = table.new(position.bottom_right, 1, 1)
// table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)

Más.