En la carga de los recursos... Cargando...

Estrategia de negociación cruzada de media móvil múltiple

El autor:¿ Qué pasa?, Fecha: 2023-12-06 17:10:00
Las etiquetas:

img

Resumen de la estrategia

Esta estrategia genera señales de trading basadas en múltiples indicadores de promedios móviles, monitoriza simultáneamente las medias móviles a corto, mediano y largo plazo y genera señales de trading de acuerdo a sus situaciones de cruce para determinar la dirección de la tendencia.

Nombre de la estrategia

Estrategia de cruce de media móvil múltiple

Estrategia lógica

Esta estrategia emplea 3 promedios móviles con diferentes períodos, incluidas líneas de 7 días, 13 días y 21 días.

  1. Cuando el MA a corto plazo de 7 días cruza hacia arriba el MA a mediano plazo de 13 días, mientras que el MA a largo plazo de 21 días se encuentra en una tendencia al alza, se genera una señal larga.
  2. Cuando el MA a corto plazo de 7 días se cruza por debajo del MA a mediano plazo de 13 días hacia abajo, mientras que el MA a largo plazo de 21 días se encuentra en una tendencia a la baja, se genera una señal corta.

Al combinar las medias móviles en diferentes períodos de tiempo, la estrategia puede juzgar las tendencias del mercado con mayor precisión y evitar operaciones falsas.

Ventajas

  1. El uso de múltiples líneas de MA permite determinar mejor los movimientos del mercado y evitar ser engañados por falsas rupturas o fluctuaciones a corto plazo en el mercado.
  2. Las señales solo se generan cuando la tendencia es clara, reduciendo así las operaciones innecesarias y los costos de transacción.
  3. Configuración de parámetros flexibles: los períodos de las AMP pueden ajustarse según las preferencias personales para adaptarse a diferentes productos y entornos de mercado.

Los riesgos

  1. Las señales falsas frecuentes pueden ocurrir en un mercado variable y agitado.
  2. Los indicadores de mercado, como indicadores de tendencia, no pueden localizar con precisión los puntos de inflexión.
  3. La señal tardía de los cruces MA puede perder parte de las ganancias.
  4. Los riesgos pueden reducirse mediante la introducción de otros indicadores técnicos para la validación de señales y la optimización de los parámetros de MA.

Direcciones de optimización

  1. Considere la posibilidad de incorporar indicadores de volatilidad para medir la fuerza de la tendencia y evitar el comercio en mercados agitados.
  2. Trate de aplicar modelos de aprendizaje automático para optimizar automáticamente los parámetros de MA.
  3. Agregue estrategias de stop loss para reducir las pérdidas a tiempo cuando las reducciones se expandan.
  4. Utilice órdenes de límite cuando ocurra un cruce de MA para reducir el deslizamiento.

Conclusión

Esta estrategia combina los MAs a corto, mediano y largo plazo para determinar la tendencia del mercado en función de sus relaciones cruzadas, lo que la convierte en una estrategia de seguimiento de tendencias relativamente estable y eficiente.


/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 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/
// © Crypto-Oli

//@version=4
strategy("CryptOli 3 MAs long/short Backtest", initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, overlay=true)

// this is an educational Script - basicly its very simple - you can see how minimal changes impact results, thats why i posted it
// Credits to Quantnomad to publish tons of free educational script
// this Script is based on https://www.tradingview.com/script/0NgUadGr-Ultimate-MA-Cross-Indicator/ Quantnomads Ultimate MA Indicator 
// HA - Option for calcucaltion based on HA-Candles (very famous recently)
// Source Input - Option (Candletype for calculation, close, ohlc4 ect.) --- there are huge differences --- try it by your own

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2015, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2030, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

////////////////////////////////////////////////////////////////////////////////

h = input(false, title = "Signals from Heikin Ashi Candles")

ma_type      = input(title = "MA Type",         type = input.string,  defval = "SMMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
src = input(ohlc4)

short_ma_len = input(title = "Short MA Length", type = input.integer, defval = 7,     minval = 1)
short_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
middle_ma_len  = input(title = "Middle MA Length",  type = input.integer, defval = 13,    minval = 2)
middle_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
long_ma_len  = input(title = "Long MA Length",  type = input.integer, defval = 21,    minval = 2)
long_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close


tick_round(x) => 
    round(x / syminfo.mintick) * syminfo.mintick

// Set initial values to 0
short_ma = 0.0
middle_ma = 0.0
long_ma  = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma := sma(short_ma_src, short_ma_len)
    middle_ma := sma(middle_ma_src, middle_ma_len)
    long_ma  := sma(long_ma_src,  long_ma_len)

// Exponential Moving Average (EMA)
if ma_type == 'EMA'
    short_ma := ema(short_ma_src, short_ma_len)
    middle_ma := ema(middle_ma_src, middle_ma_len)
    long_ma  := ema(long_ma_src,  long_ma_len)

// Weighted Moving Average (WMA)
if ma_type == 'WMA'
    short_ma := wma(short_ma_src, short_ma_len)
    middle_ma := wma(middle_ma_src, middle_ma_len)
    long_ma  := wma(long_ma_src,  long_ma_len)

// Hull Moving Average (HMA)
if ma_type == 'HMA'
    short_ma := wma(2*wma(short_ma_src, short_ma_len/2)-wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len)))
    middle_ma := wma(2*wma(middle_ma_src, middle_ma_len/2)-wma(middle_ma_src, middle_ma_len), round(sqrt(middle_ma_len)))
    long_ma  := wma(2*wma(long_ma_src,  long_ma_len /2)-wma(long_ma_src,  long_ma_len),  round(sqrt(long_ma_len)))

// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
    short_ma := vwma(short_ma_src, short_ma_len)
    middle_ma := vwma(middle_ma_src, middle_ma_len)
    long_ma  := vwma(long_ma_src,  long_ma_len)


// Smoothed Moving Average (SMMA)    
if ma_type == 'SMMA'
    short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len
    middle_ma := na(middle_ma[1]) ? sma(middle_ma_src, middle_ma_len) : (middle_ma[1] * (middle_ma_len - 1) + middle_ma_src) / middle_ma_len
    long_ma  := na(long_ma[1])  ? sma(long_ma_src,  long_ma_len)  : (long_ma[1]  * (long_ma_len  - 1) + long_ma_src)  / long_ma_len

// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
    e1_short = ema(short_ma_src, short_ma_len)
    e1_middle = ema(middle_ma_src, middle_ma_len)
    e1_long  = ema(long_ma_src,  long_ma_len)
    
    short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
    middle_ma := 2 * e1_middle - ema(e1_middle, middle_ma_len)
    long_ma  := 2 * e1_long  - ema(e1_long,  long_ma_len)

// Plot MAs
plot(short_ma, color = color.green,   linewidth = 1)
plot(middle_ma, color = color.yellow,   linewidth = 1)
plot(long_ma,  color = color.red, linewidth = 1)

if close>long_ma and short_ma>middle_ma and time_cond
    strategy.entry("Long", strategy.long)


if close<long_ma and short_ma<middle_ma and time_cond
    strategy.entry("Short", strategy.short)


Más.