Estrategia de cruce de la media móvil

El autor:¿ Qué pasa?, Fecha: 2023-10-10 10:44:25
Las etiquetas:

Resumen general

La estrategia de cruce de promedios móviles es una estrategia de negociación comúnmente utilizada basada en promedios móviles. Utiliza el cruce de un promedio móvil más rápido y un promedio móvil más lento como señales de negociación. Cuando el promedio móvil más rápido cruza por encima del promedio móvil más lento desde abajo, es una señal de compra. Cuando el promedio móvil más rápido cruza por debajo del promedio móvil más lento desde arriba, es una señal de venta. Esta estrategia utiliza un MA de 50 días como el MA más rápido y un MA de 200 días como el MA más lento.

Estrategia lógica

La lógica central de esta estrategia se basa en la teoría de los promedios móviles. Los promedios móviles pueden suavizar eficazmente las fluctuaciones de precios e indicar tendencias de precios. El MA más rápido es más sensible a los cambios de precios y puede capturar puntos de inversión de tendencia. El MA más lento es menos sensible a los cambios de precios y puede filtrar las fluctuaciones a corto plazo. Cuando el MA más rápido cruza por encima del MA más lento, indica una tendencia alcista en los precios. Cuando el MA más rápido cruza por debajo del MA más lento, indica una tendencia bajista en los precios.

Específicamente, esta estrategia define primero el MA de 50 días y el MA de 200 días. La condición de entrada larga se establece cuando el MA más rápido cruza por encima del MA más lento. La condición de entrada corta se establece cuando el MA más rápido cruza por debajo del MA más lento. Para evitar que las operaciones se superpongan, la estrategia utiliza las banderas isEntry e isExit para controlar. Cuando se cumple la condición de entrada, isEntry se establece en verdad. Cuando se cumple la condición de salida, isExit se establece en verdad. Una posición larga solo se abrirá cuando isEntry sea falsa y aparezca una señal de compra. Una posición corta solo se abrirá cuando isExit sea falsa y aparezca una señal de venta.

Además, la estrategia también establece los niveles de toma de ganancias y stop loss. Los usuarios pueden definir la distancia porcentual TP / SL a través de entradas. Los precios de TP y SL se calcularán en función del porcentaje del precio de entrada. Cuando el tamaño de la posición sea mayor de 0, TP y SL se ejecutarán en función del porcentaje largo TP / SL. Cuando el tamaño de la posición sea menor de 0, TP y SL se basarán en el porcentaje corto TP / SL.

Análisis de ventajas

Las ventajas de esta estrategia incluyen:

  1. Es muy simple de implementar, se negocia basándose únicamente en cruces de MA, adecuado para principiantes sin experiencia comercial.

  2. Los promedios móviles pueden filtrar las fluctuaciones a corto plazo y evitar ser detenidos.

  3. Los usuarios pueden optimizar parámetros como los períodos de MA y los niveles de TP / SL.

  4. La estrategia traza los MA clave, entradas y niveles de TP / SL en el gráfico.

  5. El marco extensible. La estructura estratégica está completa. Se pueden añadir nuevas señales e indicadores para mejorarla.

Análisis de riesgos

Los riesgos de esta estrategia incluyen:

  1. Incapaz de detener las pérdidas durante los eventos extremos del mercado, lo que conduce a una gran reducción.

  2. Propenso a los golpes en los mercados variados, causando pérdidas consecutivas.

  3. No se tienen en cuenta los costes de negociación, ya que las comisiones y el deslizamiento en la negociación real afectarán significativamente a la rentabilidad.

  4. Las condiciones reales del mercado son complejas y los resultados de las pruebas de retroceso pueden no representar el rendimiento en vivo.

Las soluciones incluyen:

  1. Utilice un stop loss más amplio o agregue un stop loss de ruptura adicional.

  2. Ampliar la distancia de la MA, reducir la frecuencia del comercio o añadir otros filtros.

  3. Considere los costos reales de negociación, establezca un espacio objetivo de ganancias más amplio.

  4. Optimizar los parámetros gradualmente y reducir el sobreajuste teniendo en cuenta las condiciones cambiantes del mercado.

Direcciones de optimización

Esta estrategia puede optimizarse en los siguientes aspectos:

  1. Prueba diferentes combinaciones de parámetros para encontrar los parámetros óptimos, como los períodos de MA.

  2. Añadir otros indicadores como filtros para evitar los golpes, como el MACD, el KD, etc.

  3. Optimice la estrategia de stop loss para una mejor gestión del riesgo, como el stop loss de seguimiento.

  4. Aumentar el tamaño de la posición con apalancamiento para aumentar las ganancias controlando el riesgo.

  5. Considera los costos de negociación, optimiza los parámetros para el comercio en vivo.

  6. Se evaluará la estabilidad de los parámetros utilizando métodos estadísticos para reducir el sobreajuste.

Conclusión

En conclusión, esta estrategia de cruce de MA tiene una lógica clara y es simple de implementar, adecuada como una estrategia introductoria para el comercio de algo. Pero también tiene riesgos y limitaciones. Se necesitan parámetros cuidadosos y optimización de filtros y control de riesgos para lograr ganancias constantes.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gjfsdrtytru

//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)


// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)

plot(fastMA, "Fast MA",  color.blue)
plot(slowMA, "Slow MA",  color.red)

// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)

// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)


// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"

//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////

// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options

// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL

// Determine TP/SL price based on percentage given
longProfitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice  = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice  = strategy.position_avg_price * (1 + shortStopPerc)

// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)

entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and  shortCondition
exitShort = not isExit_Short and closeShort

if (entryLong)
    isEntry_Long := true
    isExit_Long := false
if (exitLong)
    isEntry_Long := false
    isExit_Long := true
if (entryShort)
    isEntry_Short := true
    isExit_Short := false
if (exitShort)
    isEntry_Short := false
    isExit_Short := true

// Order Execution
if testPeriod() 
    if entryLong
        strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
    if entryShort
        strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}


// TP/SL Execution
if (strategy.position_size > 0)
    strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
    strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}

if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
    strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
    
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")

Más.