Estrategia de media de inversión de la media móvil

El autor:¿ Qué pasa?, Fecha: 2023-12-04 16:12:39
Las etiquetas:

img

Resumen general

La estrategia de promedio móvil de envolvente de reversión media es una estrategia de comercio de reversión media basada en promedios móviles. Utiliza el promedio móvil exponencial doble (DEMA) como cálculo base y agrega varios sobres por encima y por debajo de él. Cuando el precio toca las bandas del sobre, abre posiciones largas o cortas basadas en la dirección. Cuando el precio regresión al promedio móvil, cierra todas las posiciones.

Estrategia lógica

La estrategia utiliza el promedio móvil exponencial doble (DEMA) como indicador base, que es un promedio móvil que es más sensible a los cambios recientes de precios.

Cuando el precio sube y se acerca a la banda superior de la envolvente, la estrategia abre una posición corta. Cuando el precio cae y llega a la banda inferior de la envolvente, abre una posición larga. Agrega una nueva posición cada vez que se toca una nueva banda de precios. Cuando el precio regresión cerca de la media móvil, todas las posiciones se cierran.

Al capturar las fluctuaciones excesivas de precios con las bandas de envolvente y beneficiarse de las reversiones, la estrategia tiene como objetivo comprar bajo y vender alto.

Ventajas

  • Utiliza el promedio móvil exponencial doble, que es sensible a los cambios de precios a corto plazo para detectar las inversiones de tendencia.
  • Las bandas de envolvente alrededor de la media móvil pueden capturar con precisión las reversiones de precios.
  • Abre posiciones en lotes, utilizando plenamente la eficiencia del capital.
  • Cambiar rápidamente de dirección después de obtener beneficios para adaptarse a los cambios del mercado.
  • Los parámetros se pueden optimizar libremente.

Los riesgos

  • Incapaz de sacar provecho de los mercados con una fuerte tendencia.
  • Los parámetros inadecuados pueden causar un exceso de negociación.
  • Necesita mercados relativamente estables, no adecuados para entornos altamente volátiles.
  • Las envolturas demasiado estrechas pueden impedir la entrada en las posiciones.

Los riesgos pueden reducirse ampliando adecuadamente el intervalo de cobertura para aumentar la sensibilidad y ajustando la longitud de la media móvil para adaptarla a los diferentes ciclos del mercado.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Prueba diferentes algoritmos de promedio móvil.

  2. Ajustar el parámetro de longitud media móvil para adaptarse mejor a las fluctuaciones a corto plazo.

  3. Optimizar los parámetros de la envolvente probando diferentes ajustes porcentuales.

  4. Agregue métodos de stop loss como el stop loss de seguimiento para limitar la pérdida de una sola operación.

  5. Añadir condiciones de filtrado con otros indicadores para evitar entradas no válidas en mercados irracionales.

Conclusión

La estrategia de promedio móvil de envolvente de reversión media captura efectivamente las oportunidades de reversión media mediante la construcción de un canal de precios alrededor del promedio móvil. Se puede adaptar de manera flexible a diferentes entornos de mercado a través de ajustes de parámetros. Con costos de transacción relativamente bajos y altos rendimientos, esta es una estrategia comercial cuantitativa recomendada.


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

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)


Más.