Nueve estrategias de cruce de medias móviles


Fecha de creación: 2024-01-02 10:37:21 Última modificación: 2024-01-02 10:37:21
Copiar: 0 Número de Visitas: 767
1
Seguir
1621
Seguidores

Nueve estrategias de cruce de medias móviles

Descripción general

La estrategia utiliza dos diferentes parámetros de movimiento promedio para la operación de cruce, de acuerdo con la dirección de la tendencia de las señales de cruce, para abrir y cerrar posiciones. La estrategia permite elegir entre 9 diferentes tipos de promedios móviles, incluyendo el simple movimiento promedio (SMA), el índice de movimiento promedio (EMA), el peso de movimiento promedio (WMA), el movimiento promedio de Almo (ALMA), el valor de movimiento promedio (VWMA), etc. La estrategia establece al mismo tiempo un punto de parada y un punto de parada.

Principio de estrategia

La lógica central de esta estrategia es comparar los valores de las dos medias móviles y determinar la dirección de la tendencia del mercado en función de la intersección de las dos medias móviles. En concreto, establecemos dos medias móviles, una rápida y una lenta. Cuando la línea rápida atraviesa la línea lenta, se considera que el mercado entra en una tendencia alcista, haciendo más; cuando la línea rápida atraviesa la línea lenta, se considera que el mercado entra en una tendencia descendente, haciendo vacío.

Después de entrar en la posición, si el precio toca la línea de parada, se pierde la posición y se retira de la posición. Si el precio toca la línea de parada, la ganancia alcanza la expectativa y se retira de la posición. De esta manera, se puede bloquear las ganancias y evitar que las pérdidas se expandan.

Desde el punto de vista de la lógica del código, la estrategia se divide en cuatro partes:

  1. Cálculo de las medias móviles. De acuerdo con el tipo de media móvil elegido por el usuario, calcula las medias móviles de las líneas rápidas y lentas.

  2. Generar señales de negociación. De acuerdo con la intersección de la línea rápida y la línea lenta, generar señales de hacer más y hacer menos.

  3. Establecer un Stop Loss. Basado en el precio de entrada y el porcentaje de Stop Loss establecido, calcular en tiempo real el precio de la línea de Stop Loss y la línea de Stop Loss.

  4. Entrar y salir de la cancha bajo la señal de hacer más y hacer vacío.

Análisis de las ventajas

La mayor ventaja de esta estrategia es que se puede elegir libremente entre varios tipos de medias móviles. Los diferentes tipos de medias móviles tienen una sensibilidad diferente al precio, por lo que el usuario puede elegir la media móvil adecuada según sus propias necesidades. Además, se puede personalizar la duración de las medias móviles para optimizar la dimensión temporal.

Otra ventaja es la configuración de un mecanismo de parada de pérdidas. Esto puede prevenir de manera efectiva que las pérdidas se extiendan aún más, al tiempo que se bloquean las ganancias. En general, la estrategia es más flexible y con un alto grado de personalización, adecuada para usuarios con diferentes necesidades.

Análisis de riesgos

El principal riesgo de esta estrategia es que las medias móviles tienen retraso. Cuando los precios se mueven repentinamente, las medias móviles no pueden responder a tiempo, lo que puede provocar que se pierda el mejor momento de entrada o salida. Esto genera grandes pérdidas.

Otro riesgo es la configuración de la posición de parada de pérdidas. Si la configuración es demasiado pequeña, es posible que se negocie; si es demasiado grande, es fácil que los beneficios no se bloqueen a tiempo. Por lo tanto, en el mercado real, optimice los parámetros de parada de pérdidas según las condiciones del mercado.

En general, la estrategia se basa principalmente en las medias móviles para determinar la dirección de la tendencia, por lo que los efectos se reducen cuando los eventos repentinos provocan una gran fluctuación en los precios. Además, la configuración de los parámetros también tiene un gran impacto en los beneficios de la estrategia.

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Optimización de los tipos de medias móviles. Selección de las medias móviles más adecuadas en función de los diferentes entornos de mercado y variedades de transacciones.

  2. Parámetros para optimizar las medias móviles. Ajustar la duración de las medias móviles para que se ajusten mejor a las características del mercado.

  3. Añadir filtros de otros indicadores. Se pueden agregar otros indicadores, como MACD, RSI, etc., para evitar el comercio frecuente en mercados sin tendencias.

  4. Optimización de la proporción de stop loss. Calculación de los parámetros óptimos de stop loss basados en datos históricos.

  5. Añadir modelos de aprendizaje automático. El uso de algoritmos como LSTM y el bosque aleatorio para predecir el movimiento de los precios, auxiliando en la generación de señales de negociación.

  6. El uso de algoritmos de seguimiento de paradas. Permite que las líneas de paradas se muevan gradualmente con el movimiento del precio, reduciendo la probabilidad de que se activen paradas.

Resumir

En general, esta estrategia es más simple, directa, y es una estrategia típica de seguimiento de la tendencia a través de un juicio cruzado de la dirección de la tendencia. Sus ventajas son su sencillez y facilidad de comprensión, su alta flexibilidad y la posibilidad de elegir por sí mismo el tipo de media móvil y los parámetros. Sus desventajas son la reacción lenta a los eventos inesperados y la existencia de un cierto grado de retraso. En general, la estrategia es adecuada para los inversores que buscan obtener ganancias estables a largo plazo.

Código Fuente de la Estrategia
/*backtest
start: 2022-12-26 00:00:00
end: 2024-01-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Kozlod - Yet Another Moving Average Cross Strategy", shorttitle="kozlod_yamacs", overlay = true)

// 
// author: Kozlod
// date: 2018-03-06
// 

////////////
// INPUTS //
////////////

ma_type      = input(title = "MA Type",          defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'ALMA', 'VWMA', 'HMA', 'LSMA', 'SMMA', 'DEMA'])
short_ma_len = input(title = "Short MA Length",  defval = 5,     minval = 1)
short_ma_src = input(title = "Short MA Source",   defval = close)
long_ma_len  = input(title = "Long MA Length",   defval = 15,    minval = 2)
long_ma_src  = input(title = "Long MA Source",    defval = close)
alma_offset  = input(title = "ALMA Offset",     type = float,   defval = 0.85,  step = 0.01, minval = 0, maxval = 1)
alma_sigma   = input(title = "ALMA Sigma",      type = float,   defval = 6,     step = 0.01)
lsma_offset  = input(title = "LSMA Offset",      defval = 0,     step = 1)

sl_lev_perc  = input(title = "SL Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)
pt_lev_perc  = input(title = "PT Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)

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

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma := sma(short_ma_src, short_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)
    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)
    long_ma  := wma(long_ma_src,  long_ma_len)

// Arnaud Legoux Moving Average (ALMA)
if ma_type == 'ALMA'
    short_ma := alma(short_ma_src, short_ma_len,  alma_offset, alma_sigma)
    long_ma  := alma(long_ma_src,  long_ma_len,   alma_offset, alma_sigma)

// 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)))
    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)
    long_ma  := vwma(long_ma_src,  long_ma_len)

// Least Square Moving Average (LSMA)
if ma_type == 'LSMA'
    short_ma := linreg(short_ma_src, short_ma_len, lsma_offset)
    long_ma  := linreg(long_ma_src,  long_ma_len,  lsma_offset)

// 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
    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_long  = ema(long_ma_src,  long_ma_len)
    
    short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
    long_ma  := 2 * e1_long  - ema(e1_long,  long_ma_len)

/////////////
// SIGNALS //
/////////////

long_signal  = crossover( short_ma, long_ma)
short_signal = crossunder(short_ma, long_ma)

// Calculate PT/SL levels 
// Initial values 
last_signal    = 0
prev_tr_price  = 0.0
pt_level       = 0.0
sl_level       = 0.0

// Calculate previous trade price
prev_tr_price := long_signal[1] or short_signal[1] ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na

// Calculate SL/PT levels 
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100)  : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100)  : na

// Calculate if price hit sl/pt 
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  1 and close <= sl_level

short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close >= sl_level

// What is last active trade? 
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])

//////////////
// PLOTTING //
//////////////

// Plot MAs
plot(short_ma, color = red,   linewidth = 2)
plot(long_ma,  color = green, linewidth = 2)


// Plot Levels 
plotshape(prev_tr_price, style = shape.cross, color = gray, location  = location.absolute, size = size.small)


plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red,   location  = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location  = location.absolute, size = size.small)

//////////////
// STRATEGY //
//////////////

strategy.entry("long",  true,  when = long_signal)
strategy.entry("short", false, when = short_signal)

strategy.close("long",  when = long_hit_pt  or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)