Estrategia de negociación de tendencias basada en una media móvil dinámica

El autor:¿ Qué pasa?, Fecha: 2023-12-21 11:33:50
Las etiquetas:

img

Resumen general

Esta estrategia genera señales comerciales basadas en la media móvil dinámica para ir largo cuando los precios de las acciones suben y cerrar posiciones cuando los precios caen.

Principio

La estrategia se basa principalmente en tres variantes de HMA (Hull Moving Average) HMA regular, HMA ponderado (WHMA) y HMA exponencial (EHMA).

La fórmula para la HMA es:

HMA = WMA ((2*WMA ((cerca, n/2)-WMA ((cerca, n), cuadrado))

Donde WMA es el promedio móvil ponderado y n es el parámetro del período.

Las fórmulas para WHMA y EHMA son similares.

Después de calcular el HMA, la estrategia utiliza el valor de la línea media del HMA como señales de negociación. Se hace largo cuando el precio cruza por encima de la línea media del HMA y cierra posiciones cuando el precio cae por debajo de la línea. Por lo tanto, rastrea las tendencias a mediano plazo utilizando la línea media del HMA para obtener ganancias.

Ventajas

En comparación con las estrategias tradicionales de AM, esta estrategia tiene las siguientes ventajas:

  1. Respuesta más rápida y mayor capacidad de seguimiento de tendencias para entradas y paradas oportunas
  2. Reducir la frecuencia innecesaria de las operaciones, evitando los picos y paradas
  3. Parámetros flexibles de HMA para adaptarse a un mayor número de entornos de mercado
  4. Variantes de HMA conmutables para ampliar la aplicabilidad

Los riesgos

También hay algunos riesgos:

  1. Generar múltiples señales falsas durante los mercados de rango limitado, aumentar la frecuencia de las operaciones y los costes de deslizamiento
  2. Puntos de reversión de tendencia faltantes si los parámetros de HMA no se establecen correctamente, lo que conlleva mayores riesgos de pérdida
  3. Riesgo de liquidez y deslizamiento enorme cuando se negocian acciones de baja liquidez

Soluciones:

  1. Optimizar los parámetros de HMA para obtener los mejores valores
  2. Añadir otros indicadores para determinar los puntos de inversión de tendencia
  3. Seleccionar las existencias de liquidez con un volumen diario promedio elevado

Mejoras

La estrategia también puede mejorarse en los siguientes aspectos:

  1. Añadir volumen u otros filtros para garantizar la fiabilidad de la señal
  2. Combinar MACD, KDJ para un mejor tiempo, mejorando la tasa de ganancia
  3. Ajuste de los períodos de HMA basado en las pruebas de retroceso en el comercio real
  4. Cambiar a WHMA o EHMA que tenga el mejor rendimiento para poblaciones específicas
  5. Añadir mecanismos de stop loss para controlar las pérdidas de operaciones individuales

Resumen de las actividades

La estrategia de negociación dinámica de MA integra la rápida respuesta de HMA para rastrear eficazmente las tendencias de precios a mediano plazo. Al abrir posiciones largas en momentos apropiados y cerrar paradas, ha demostrado buenos resultados de pruebas de retroceso.


/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Position Investing by SirSeff', overlay=true, pyramiding=1, 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)
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)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2000, '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)


testPeriod() => true
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title='Source')
modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma'])
length = input(55, 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.int(40, title='Band Transparency', step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>
    ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>
    ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
//THMA    
THMA(_src, _length) =>
    ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.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)


if HULL[0] > HULL[2] and testPeriod()
    strategy.entry('Invest', strategy.long)
if HULL[0] < HULL[2] and testPeriod()
    strategy.entry('Pause', strategy.short)



Más.