Esta estrategia genera señales de compra y venta basadas en el cruce de dos promedios móviles con diferentes configuraciones de parámetros. Cuando el promedio móvil de período más corto cruza por encima del promedio móvil de período más largo desde abajo, se genera una señal de compra. Cuando el promedio móvil de período más corto cruza por debajo del promedio móvil de período más largo desde arriba, se genera una señal de venta.
La estrategia está escrita en el script de Pine. Primero define dos promedios móviles, llamados p1 y p2, con tipo, longitud y fuente de precio personalizables a través de la entrada. Aquí p1 representa el período más corto MA y p2 representa el período más largo MA.
Las funciones de cruce y cruce se utilizan para detectar el cruce entre los dos MA. Cuando p1 cruza sobre p2 desde abajo, se genera una señal de compra. Cuando p1 cruza debajo de p2 desde arriba, se genera una señal de venta.
Para ejecutar operaciones, la estrategia entra en posiciones largas o cortas utilizando strategy.entry cuando se activan las señales.
Las ventajas de esta estrategia incluyen:
También hay algunos riesgos con esta estrategia:
Los riesgos pueden reducirse ajustando las longitudes de MA, añadiendo condiciones de filtro, etc. También se pueden añadir indicadores de tendencia para determinar el sesgo del mercado.
La estrategia puede mejorarse en los siguientes aspectos:
Utilice VWAP o precio típico como fuente de precios para hacer que las señales de cruce sean más confiables.
Añadir un período de validación para evitar cruces erróneos a corto plazo.
Se incluirán las paradas ATR basadas en la pérdida máxima aceptable de acuerdo con la volatilidad del mercado.
Optimización de parámetros mediante ajuste de curvas para encontrar combinaciones óptimas.
Solo considere las señales en la dirección de tendencias de marcos de tiempo más altos.
La doble estrategia de cruce de MA es fácil de entender e implementar, generando señales comerciales de dos cruces de MA con alta personalizabilidad. Pero también puede producir señales inválidas excesivas durante los mercados agitados. Los riesgos se pueden reducir a través de la optimización de parámetros y lógica con amplias oportunidades de mejora, que vale la pena investigar más.
/*backtest start: 2022-11-20 00:00:00 end: 2023-11-26 00:00:00 period: 1d basePeriod: 1h 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/ // © RafaelPiccolo //@version=4 strategy("Double MA Cross", overlay=true) type1 = input("SMA", "MA Type 1", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"]) len1 = input(10, minval=1, title="Length 1") src1 = input(close, "Source 1", type=input.source) type2 = input("SMA", "MA Type 2", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"]) len2 = input(50, minval=2, title="Length 2") src2 = input(close, "Source 2", type=input.source) shortOnly = input(false, "Short only") tema(src, len)=> ema1 = ema(src, len) ema2 = ema(ema1, len) ema3 = ema(ema2, len) return = 3 * (ema1 - ema2) + ema3 getPoint(type, len, src)=> return = type == "SMA" ? sma(src, len) : type == "EMA" ? ema(src, len) : type == "WMA" ? wma(src, len) : type == "HMA" ? hma(src, len) : type == "VWMA" ? vwma(src, len) : type == "RMA" ? rma(src, len) : tema(src, len) p1 = getPoint(type1, len1, src1) p2 = getPoint(type2, len2, src2) shortCondition = crossunder(p1, p2) longCondition = crossover(p1, p2) if (shortCondition) strategy.entry("Short", strategy.short) if (longCondition) if (shortOnly) strategy.close("Short") else strategy.entry("Long", strategy.long) plot(p1, "MA 1", p1 < p2 ? color.red : color.green) plot(p2, "MA 2", color.blue)