Tendencia de media móvil cruzada abierta cerrada siguiendo la estrategia

El autor:¿ Qué pasa?, Fecha: 15 de enero de 2024 14:24:27
Las etiquetas:

img

Resumen general

La estrategia de seguimiento de la media móvil de cierre abierto es una estrategia de seguimiento de la tendencia basada en promedios móviles de los precios abiertos y cerrados. Determina la tendencia actual del mercado mediante el cálculo de los promedios móviles de los precios abiertos y cerrados; se hace largo cuando el precio de cierre cruza por encima del promedio móvil del precio de apertura, y se hace corto cuando el precio de cierre cruza por debajo del promedio móvil del precio de apertura.

Principios

La lógica central de esta estrategia se basa en la relación entre los precios de apertura y cierre para determinar la tendencia actual. El precio de apertura refleja la relación actual de oferta y demanda del mercado y la psicología comercial, mientras que el precio de cierre refleja el resultado final del día. En general, si el precio de cierre es mayor que el precio de apertura, indica que la tendencia del mercado para el día es al alza y el sentimiento es más alcista. Si el precio de cierre es menor que el precio de apertura, sugiere que la tendencia del mercado para el día es descendente y el sentimiento es más bajista.

Esta estrategia utiliza esta lógica calculando los promedios móviles de los precios de apertura y cierre para juzgar la dirección de la tendencia actual.

  1. Ir largo cuando el precio de cierre cruza el promedio móvil del precio de apertura. Esto indica que el sentimiento alcista se está fortaleciendo y se puede iniciar una posición larga.

  2. Si la media móvil del precio de cierre se cruza por debajo de la media móvil del precio de apertura, el corto indica que el sentimiento bajista está aumentando y se puede iniciar una posición corta.

  3. Cierre las posiciones existentes con un stop loss cuando ocurran señales inversas.

La estrategia también establece trailing stops para bloquear las ganancias. Después de ingresar a una posición, calcula dinámicamente la diferencia de punto entre el precio de entrada y el precio actual. Cuando el movimiento del precio excede el umbral del punto de stop loss establecido, la línea de stop loss se moverá hacia arriba para bloquear ganancias parciales.

En resumen, la estrategia juzga las tendencias a lo largo de la duración del período promedio móvil; mantiene solo una posición direccional a la vez; sale de las posiciones existentes directamente con señales inversas sin paradas ATR; y tiene configuraciones de parada de seguimiento para obtener ganancias.

Análisis de ventajas

Esta estrategia tiene las siguientes ventajas principales:

  1. Normas sencillas y claras. Juzgar la tendencia basada en la relación abierta-cercana es fácil de entender y optimizar los parámetros para.

  2. Opciones flexibles de la MAHay docenas de tipos de MA para elegir y optimizar.

  3. Resolución ajustableLa resolución se puede ajustar a 3-4 veces la gráfica para mayor sensibilidad y puntualidad de las señales.

  4. Mecanismo para detener la pérdidaEl trailing stop controla efectivamente las pérdidas y los descensos por operación.

  5. Período de retención personalizableEl período de retención y la volatilidad se pueden controlar ajustando los parámetros de la MA.

  6. El riesgo-recompensa ajustado de forma flexiblePuntos de stop loss y de compensación de las preferencias de riesgo-recompensa.

Análisis de riesgos

Los principales riesgos de esta estrategia se encuentran en los siguientes ámbitos:

  1. Falta de cambios en la tendenciaLas señales de salida pueden retrasarse en la reversión de los precios, lo que puede dar lugar a pérdidas.

  2. No adecuado para condiciones de alta volatilidadEl aumento de los puntos de stop loss o el alargamiento del período de MA pueden ayudar en este caso.

  3. Confianza en el indicador únicoBasar las decisiones en un solo conjunto de indicadores lo expone al riesgo de fracaso.

  4. Riesgo de optimización excesivaLos parámetros MA y los parámetros de stop loss pueden ser fácilmente sobreajustados. El rendimiento fuera de la muestra puede deteriorarse. Se debe tener cuidado en la selección de parámetros.

Direcciones de optimización

La estrategia se puede optimizar y mejorar desde áreas como:

  1. Indicadores complementariosLos indicadores de volatilidad e impulso pueden aumentar la robustez y la estabilidad.

  2. Parámetros dinámicos condicionalesLos períodos de admisión pueden ajustarse en función de la tendencia o la detección lateral del régimen de mercado para una mejor adaptabilidad.

  3. Control dinámico del riesgoLos puntos de stop loss y offsets se pueden calibrar en los niveles de volatilidad realizados recientemente.

  4. Lógico de pérdida de parada mejoradoMecanismos de stop loss más avanzados como los ATR pueden reemplazar el simplista trailing stop.

Conclusión

La estrategia de seguimiento de tendencias de media móvil abierta cerrada es una estrategia típica de trading de tendencias basada en relaciones abiertas cerradas y medias móviles. Sus ventajas como reglas simples, flexibilidad y riesgos controlables también vienen con inconvenientes de reversiones y frenos perdidos.


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

//@version=4

strategy(title = "Open Close Cross Strategy (PineScript=v4)", shorttitle = "OCC Strategy", overlay = true )

// Revision:        1
// Author:          @JayRogers
//
// Description:
//  - Strategy based around Open-Close Crossovers.
// Setup:
//  - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing
//    tends to yield the best results, regardless of which MA option you may choose (if any)
//  - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of
//    green and red.
//  - Option to either use basic open and close series data, or pick your poison with a wide array of MA types.
//  - Optional trailing stop for damage mitigation if desired (can be toggled on/off)
//  - Positions get taken automagically following a crossover - which is why it's better to set the resolution
//    of the script greater than that of your chart, so that the trades get taken sooner rather than later.
//  - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine
//    will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you
//    can handle.

// === INPUTS ===
useRes = input(defval=true, title="Use Alternate Resolution? ( recommended )")
stratRes = input(defval="120", title="Set Resolution ( should not be lower than chart )", type=input.resolution)
useMA = input(defval=true, title="Use MA? ( otherwise use simple Open/Close data )")
basisType = input(defval="DEMA", title="MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )", type=input.string)
basisLen = input(defval=14, title="MA Period", minval=1)
offsetSigma = input(defval=6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA = input(defval=0.85, title="Offset for ALMA", minval=0, step=0.01)
useStop = input(defval=true, title="Use Trailing Stop?")
slPoints = input(defval=200, title="Stop Loss Trail Points", minval=1)
slOffset = input(defval=400, title="Stop Loss Trail Offset", minval=1)
// === /INPUTS ===

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)  // Simple
    v2 = ema(src, len)  // Exponential
    v3 = 2 * v2 - ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)  // Triple Exponential
    v5 = wma(src, len)  // Weighted
    v6 = vwma(src, len)  // Volume Weighted
    sma_1 = sma(src, len)  // Smoothed
    v7 = na(v5[1]) ? sma_1 : (v5[1] * (len - 1) + src) / len
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))  // Hull
    v9 = linreg(src, len, offSig)  // Least Squares
    v10 = alma(src, len, offALMA, offSig)  // Arnaud Legoux
    type == "EMA" ? v2 : type == "DEMA" ? v3 : type == "TEMA" ? v4 : 
       type == "WMA" ? v5 : type == "VWMA" ? v6 : type == "SMMA" ? v7 : 
       type == "HullMA" ? v8 : type == "LSMA" ? v9 : type == "ALMA" ? v10 : v1
// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = security(syminfo.tickerid, res, exp)
    use ? security_1 : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
variant__1 = variant(basisType, close, basisLen, offsetSigma, offsetALMA)
reso__1 = reso(variant__1, useRes, stratRes)
reso__2 = reso(close, useRes, stratRes)
closeSeries = useMA ? reso__1 : reso__2
variant__2 = variant(basisType, open, basisLen, offsetSigma, offsetALMA)
reso__3 = reso(variant__2, useRes, stratRes)
reso__4 = reso(open, useRes, stratRes)
openSeries = useMA ? reso__3 : reso__4
trendState = bool(na)
trendState := closeSeries > openSeries ? true : 
   closeSeries < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color=closeSeries > openSeries ? #006600 : #990000, title="Bar Colours")
// channel outline
closePlot = plot(closeSeries, title="Close Line", color=#009900, linewidth=2, style=plot.style_line, transp=90)
openPlot = plot(openSeries, title="Open Line", color=#CC0000, linewidth=2, style=plot.style_line, transp=90)
// channel fill
closePlotU = plot(trendState ? closeSeries : na, transp=100, editable=false)
openPlotU = plot(trendState ? openSeries : na, transp=100, editable=false)
closePlotD = plot(trendState ? na : closeSeries, transp=100, editable=false)
openPlotD = plot(trendState ? na : openSeries, transp=100, editable=false)
fill(openPlotU, closePlotU, title="Up Trend Fill", color=#009900, transp=40)
fill(openPlotD, closePlotD, title="Down Trend Fill", color=#CC0000, transp=40)
// === /PLOTTING ===

// === STRATEGY ===
// conditions
longCond = crossover(closeSeries, openSeries)
shortCond = crossunder(closeSeries, openSeries)
// entries and base exit
strategy.entry("long", strategy.long, when=longCond)
strategy.entry("short", strategy.short, when=shortCond)
// if we're using the trailing stop
if useStop
    strategy.exit("XL", from_entry="long", trail_points=slPoints, trail_offset=slOffset)
    strategy.exit("XS", from_entry="short", trail_points=slPoints, trail_offset=slOffset)
// not sure needed, but just incase..
strategy.exit("XL", from_entry="long", when=shortCond)
strategy.exit("XS", from_entry="short", when=longCond)
// === /STRATEGY ===


Más.