Esta estrategia genera señales de compra y venta basadas en el cruce del precio con un promedio móvil. Proporciona varios tipos de promedios móviles y un parámetro de tolerancia para filtrar falsas rupturas. La estrategia tiene como objetivo capturar puntos de inflexión en las tendencias de precios para seguir la tendencia.
La estrategia calcula un promedio móvil de longitud N basado en el precio de cierre. Los tipos típicos de promedio móvil incluyen promedio móvil simple (SMA), promedio móvil exponencial (EMA), promedio móvil ponderado (WMA) etc. Luego se establece un nivel de tolerancia, por ejemplo, 5%, y se calculan la banda superior (1.05 veces la media móvil) y la banda inferior (0.95 veces la media móvil). Cuando el precio de cierre cruza por encima de la banda superior, se genera una señal de compra. Cuando el precio de cierre cruza por debajo de la banda inferior, se genera una señal de venta. Esto ayuda a filtrar algunas rupturas falsas.
En general, esta es una estrategia típica de seguimiento de tendencias. Utiliza la relación entre el precio y la media móvil para determinar tendencias, con cierta flexibilidad. A través de la optimización de parámetros y el filtro de señal adecuado, puede convertirse en una estrategia cuantitativa decente. Pero controlar los riesgos a la baja cuando se corta es importante para evitar pérdidas excesivas.
/*backtest start: 2023-12-26 00:00:00 end: 2024-01-25 00:00:00 period: 1h basePeriod: 15m 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("Price X MA Cross", overlay=true) typ = input("HMA", "MA Type", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"]) len = input(100, minval=1, title="Length") src = input(close, "Source", type=input.source) tol = input(0, minval=0, title="Tolerance (%)", type=input.float) 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 getMAPoint(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) ma = getMAPoint(typ, len, src) upperTol = ma * (1 + tol/100) lowerTol = ma * (1 - tol/100) longCondition = crossover(close, upperTol) shortCondition = crossunder(close, lowerTol) if (shortCondition) strategy.entry("Short", strategy.short) if (longCondition) if (shortOnly) strategy.close("Short") else strategy.entry("Long", strategy.long) plot(ma, "Moving Average", close > ma ? color.green : color.red, linewidth = 2) t1 = plot(tol > 0 ? upperTol : na, transp = 70) t2 = plot(tol > 0 ? lowerTol : na, transp = 70) fill(t1, t2, color = tol > 0 ? color.blue : na)