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.
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.
Las ventajas de esta estrategia incluyen:
Es muy simple de implementar, se negocia basándose únicamente en cruces de MA, adecuado para principiantes sin experiencia comercial.
Los promedios móviles pueden filtrar las fluctuaciones a corto plazo y evitar ser detenidos.
Los usuarios pueden optimizar parámetros como los períodos de MA y los niveles de TP / SL.
La estrategia traza los MA clave, entradas y niveles de TP / SL en el gráfico.
El marco extensible. La estructura estratégica está completa. Se pueden añadir nuevas señales e indicadores para mejorarla.
Los riesgos de esta estrategia incluyen:
Incapaz de detener las pérdidas durante los eventos extremos del mercado, lo que conduce a una gran reducción.
Propenso a los golpes en los mercados variados, causando pérdidas consecutivas.
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.
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:
Utilice un stop loss más amplio o agregue un stop loss de ruptura adicional.
Ampliar la distancia de la MA, reducir la frecuencia del comercio o añadir otros filtros.
Considere los costos reales de negociación, establezca un espacio objetivo de ganancias más amplio.
Optimizar los parámetros gradualmente y reducir el sobreajuste teniendo en cuenta las condiciones cambiantes del mercado.
Esta estrategia puede optimizarse en los siguientes aspectos:
Prueba diferentes combinaciones de parámetros para encontrar los parámetros óptimos, como los períodos de MA.
Añadir otros indicadores como filtros para evitar los golpes, como el MACD, el KD, etc.
Optimice la estrategia de stop loss para una mejor gestión del riesgo, como el stop loss de seguimiento.
Aumentar el tamaño de la posición con apalancamiento para aumentar las ganancias controlando el riesgo.
Considera los costos de negociación, optimiza los parámetros para el comercio en vivo.
Se evaluará la estabilidad de los parámetros utilizando métodos estadísticos para reducir el sobreajuste.
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")