Estrategia de cruce de once combinaciones de medias móviles


Fecha de creación: 2024-01-15 13:57:53 Última modificación: 2024-01-15 13:57:53
Copiar: 3 Número de Visitas: 370
1
Seguir
1176
Seguidores

Estrategia de cruce de once combinaciones de medias móviles

Descripción general

La combinación de estrategias utiliza cruces de 11 diferentes tipos de medias móviles para hacer ganancias y ganancias. Las 11 medias móviles utilizadas incluyen: media móvil simple (SMA), media móvil indexada (EMA), media móvil ponderada (WMA), media móvil ponderada por transacción (VWMA), media móvil plana (SMMA), media móvil binaria (DEMA), media móvil triangular (TEMA), media móvil de Hull (HMA), media móvil atrasada (ZEMA), media móvil triangular (TMA) y un deslizador superplanado (SSMA).

Esta estrategia permite configurar dos medias móviles, una más rápida y otra más lenta, y elegir entre 11 opciones. Cuando la MA más rápida cruza por encima de la MA más lenta, se genera una señal de multiplicación. Cuando la MA más rápida cruza por debajo de la MA más lenta, se genera una señal de diferenciación.

Las funciones adicionales incluyen la configuración de la escalera, el frenado y el nivel de frenado.

Lógica de estrategia

La lógica de la estrategia central se basa en el cruce entre dos medias móviles para determinar la entrada y la salida.

Las condiciones para entrar son:

Hacer una entrada múltiple: MA rápido > MA lento
Entradas en el aire: MA rápido < MA lento

La salida se determina por uno de los tres criterios siguientes:

  1. El nivel de frenado alcanzado
  2. El nivel de deterioro alcanzado
  3. Generar una señal opuesta (la media móvil se cruza en la dirección opuesta)

La estrategia permite configurar parámetros clave como el tipo y la longitud de la MA, la configuración de la escala, el porcentaje de paradas y paradas. Esto proporciona flexibilidad para optimizar la estrategia en función de diferentes condiciones de mercado y preferencias de riesgo.

Las ventajas

  • Combinación de 11 tipos diferentes de MA para generar una señal potente
  • Flexibilidad en la configuración de los parámetros principales
  • Bloqueo de pérdidas y pérdidas para proteger ganancias y limitar pérdidas
  • La escala permite aumentar la posición en una tendencia fuerte

El riesgo

  • Como cualquier indicador técnico, el cruce MA puede generar una señal errónea.
  • La optimización excesiva de las condiciones actuales del mercado puede reducir el rendimiento futuro
  • El Hard Stop se retiró demasiado pronto de las operaciones correctas con gran volatilidad.

Se puede fortalecer la gestión de riesgos mediante la confirmación de precios para el uso de señales de entrada, el uso de trazado de stop loss en lugar de stop loss duro y evitar la optimización excesiva.

Optimización del espacio

Hay varias maneras de mejorar esta estrategia:

  1. Añadir filtros adicionales antes de la entrada, como la comprobación de la cantidad y el precio
  2. Testar sistemáticamente el rendimiento de los diferentes tipos de MA y seleccionar los 1-2 mejores
  3. Optimización de la longitud de la MA para una variedad de transacciones y un período de tiempo específicos
  4. El uso de trazado de pérdidas en lugar de pérdidas duras
  5. La tendencia se prolonga con la adición de etapas paralizantes

Resumir

La estrategia de cruce de medias móviles en el artículo 11 ofrece una forma sistemática de cruzar operaciones. Al combinar señales a través de varios indicadores de MA y permitir la configuración de parámetros clave, ofrece un marco de operaciones robusto y flexible. La optimización y la gestión de riesgos jugarán un papel clave para optimizar el rendimiento.

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

//@version=3

strategy(title = "[STRATEGY] MA Cross Eleven", overlay = true)

// MA - type, source, length

//  MA - type, source, length
//  SMA --> Simple
//  EMA --> Exponential
//  WMA --> Weighted
//  VWMA --> Volume Weighted
//  SMMA --> Smoothed
//  DEMA --> Double Exponential
//  TEMA --> Triple Exponential
//  HMA --> Hull
//  TMA --> Triangular
//  SSMA --> SuperSmoother filter
//  ZEMA --> Zero Lag Exponential

type = input(defval="ZEMA", title="MA Type: ", options=["SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "ZEMA", "TMA", "SSMA"])
len1 = input(defval=8, title="Fast MA Length", minval=1)
srcclose1 = input(close, "Fast MA Source")
len2 = input(defval=21, title="Slow MA Length", minval=1)
srcclose2 = input(close, "Slow MA Source")

// Returns MA input selection variant, default to SMA if blank or typo.

variant(type, src, len) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = 0.0
    v5 := na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v11 = sma(sma(src,len),len)                                         // Triangular
    // SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414*3.14159 / len)
    b1 = 2*a1*cos(1.414*3.14159 / len)
    c2 = b1
    c3 = (-a1)*a1
    c1 = 1 - c2 - c3
    v9 = 0.0
    v9 := c1*(src + nz(src[1])) / 2 + c2*nz(v9[1]) + c3*nz(v9[2])
    // Zero Lag Exponential
    e = ema(v2, len)
    v10 = v2+(v2-e)
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="SSMA"?v9 : type=="ZEMA"?v10 : type=="TMA"? v11: v1

ma_1 = variant(type, srcclose1, len1)
ma_2 = variant(type, srcclose2, len2)

plot(ma_1, title="Fast MA", color = green, linewidth=2, transp=0)
plot(ma_2, title="Slow MA", color = red, linewidth=2, transp=0)

longCond = na
shortCond = na
longCond := crossover(ma_1, ma_2)
shortCond := crossunder(ma_1, ma_2)

// Count your long short conditions for more control with Pyramiding

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if longCond
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if shortCond
    sectionLongs := 0
    sectionShorts := sectionShorts + 1
    
// Pyramiding Inputs

pyrl = input(1, "Pyramiding")

// These check to see your signal and cross references it against the pyramiding settings above

longCondition = longCond and sectionLongs <= pyrl 
shortCondition = shortCond and sectionShorts <= pyrl 

// Get the price of the last opened long or short

last_open_longCondition = na
last_open_shortCondition = na
last_open_longCondition := longCondition ? high[1] : nz(last_open_longCondition[1])
last_open_shortCondition := shortCondition ? low[1] : nz(last_open_shortCondition[1])

// Check if your last postion was a long or a short

last_longCondition = na
last_shortCondition = na
last_longCondition := longCondition ? time : nz(last_longCondition[1])
last_shortCondition := shortCondition ? time : nz(last_shortCondition[1])

in_longCondition = last_longCondition > last_shortCondition
in_shortCondition = last_shortCondition > last_longCondition

// Take profit

isTPl = input(false, "Take Profit Long")
isTPs = input(false, "Take Profit Short")
tpl = input(3, "Take Profit Long %", type=float)
tps = input(30, "Take Profit Short %", type=float)
long_tp = isTPl and crossover(high, (1+(tpl/100))*last_open_longCondition) and in_longCondition  == 1
short_tp = isTPs and crossunder(low, (1-(tps/100))*last_open_shortCondition) and in_shortCondition == 1 

// Stop Loss

isSLl = input(false, "Stop Loss Long")
isSLs = input(false, "Stop Loss Short")
sl= 0.0
sl := input(3, "Stop Loss %", type=float)
long_sl = isSLl and crossunder(low, (1-(sl/100))*last_open_longCondition) and longCondition == 0 and in_longCondition == 1
short_sl = isSLs and crossover(high, (1+(sl/100))*last_open_shortCondition) and shortCondition == 0 and in_shortCondition == 1

// Create a single close for all the different closing conditions.

long_close = long_tp or long_sl ? 1 : 0
short_close = short_tp or short_sl ? 1 : 0

// Get the time of the last close

last_long_close = na
last_short_close = na
last_long_close := long_close ? time : nz(last_long_close[1])
last_short_close := short_close ? time : nz(last_short_close[1])

// Strategy entries

strategy.entry("long", strategy.long, when=longCondition == true, stop = open[1])
strategy.entry("short", strategy.short, when=shortCondition == true)
strategy.close("long", when = long_sl or long_tp)
strategy.close("short", when = short_sl or short_tp)