Estrategia de cruce de medias móviles dobles


Fecha de creación: 2023-11-16 17:50:52 Última modificación: 2023-11-16 17:50:52
Copiar: 0 Número de Visitas: 688
1
Seguir
1617
Seguidores

Estrategia de cruce de medias móviles dobles

Descripción general

La estrategia de cruce de doble media móvil realiza el seguimiento de la tendencia mediante el cálculo de la media móvil de diferentes períodos, para determinar la dirección de la tendencia de los precios. Se trata de una estrategia típica de seguimiento de la tendencia.

Principio de estrategia

La estrategia se basa en las medias móviles de índices de 9 períodos, 21 períodos y 50 períodos (EMA). Donde 9 períodos EMA representan la tendencia a corto plazo, 21 períodos EMA representan la tendencia a mediano plazo y 50 períodos EMA representan la tendencia a largo plazo.

Cuando el EMA de 9 períodos atraviesa el EMA de 21 períodos, la tendencia a corto plazo se transforma en alza, haciendo más; cuando el EMA de 9 períodos atraviesa el EMA de 21 períodos, la tendencia a corto plazo se transforma en caída, haciendo vacío. Aquí se usa la función de cruce (crossover) para determinar el cruce de la línea media.

El código establece la lógica de apertura, parada y parada de pérdidas de las posiciones largas y las posiciones vacías. Las condiciones de apertura de las posiciones son uniformes en la línea de entrada o de la entrada.

Además, el código añade algunos requisitos de filtración, como el filtro de tendencia, que requiere que la línea K no se tambalee antes de que la línea media suba y descienda, y el filtro de utilización de capital, que requiere que la estrategia de utilidad no esté por debajo de la línea media de N días, para evitar pérdidas excesivas y seguir operando. Estos requisitos de filtración pueden evitar, hasta cierto punto, señales falsas.

En general, la estrategia utiliza el cruce de dos EMAs para determinar la dirección de la tendencia de los precios, y una lógica de stop-stop razonable para capturar la tendencia de la línea media y larga. Sin embargo, como una estrategia de un solo factor, su señal puede no ser lo suficientemente estable como para optimizar aún más.

Análisis de las ventajas

  • La dirección de la tendencia se determina mediante el uso de un cruce de líneas medias móviles, el principio es simple y fácil de entender.
  • El uso de EMAs de diferentes períodos permite juzgar las tendencias a largo plazo.
  • Configuración de la lógica de stop loss para bloquear el beneficio y controlar el riesgo.
  • La adición de las condiciones de filtración permite filtrar hasta cierto punto las señales falsas.
  • Se puede ajustar libremente los parámetros, optimizar la combinación de ciclos y adaptarse a diferentes entornos de mercado.

Análisis de riesgos

  • Como estrategia de un solo factor, las señales de negociación pueden no ser lo suficientemente estables. Cuando los precios fluctúan, puede haber varias transacciones sin sentido.
  • El EMA cruza cuando el precio puede haber corrido una cierta distancia y existe el riesgo de un seguimiento de alta y baja.
  • Sin tener en cuenta los costos de transacción, los ingresos en el tiempo real pueden disminuir.
  • No se ha establecido un límite de pérdidas y no se pueden controlar las pérdidas en situaciones extremas.

Cómo hacer frente a esto:

  1. Optimización de los parámetros del ciclo MA para una señal más estable.
  2. En combinación con otros indicadores, las señales de filtración.
  3. Aumentar el número de transacciones y reducir el impacto en los costos.
  4. Establezca un punto de parada para limitar las pérdidas máximas.

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Optimización de los parámetros de ciclo de la media móvil para encontrar la combinación óptima de ciclos. Se puede introducir una técnica de optimización adaptativa, el ciclo de selección dinámica.

  2. Añadir otros indicadores técnicos para filtrar señales, como MACD, KD, etc., para mejorar la calidad de la señal. O introducir aprendizaje automático para calificar la señal y filtrar automáticamente las falsas señales.

  3. En combinación con el análisis de volumen de transacciones, no recibe señales cuando se rompe la línea media pero el volumen de transacciones es insuficiente.

  4. Cuando se produce una ruptura, se analizan las fluctuaciones previas, como una ruptura en la zona de temblor, que puede ser falsa.

  5. Establecer mecanismos dinámicos de detención de pérdidas, como la detención de tipo de seguimiento, la salida de Chandelier, etc., para reducir la distancia de detención de pérdidas, pero asegurarse de que la detención sea efectiva.

  6. Optimización de la gestión de posiciones, como posiciones fijas, posiciones dinámicas, posiciones de apalancamiento, etc., para que el porcentaje de ganancias y pérdidas sea más razonable.

  7. Tener en cuenta los costos de transacción y el impacto de los puntos de deslizamiento. Optimizar el Stop Loss Ratio para garantizar que la estrategia siga siendo rentable en el mercado real.

Resumir

La estructura general de esta estrategia es razonable, el principio es simple, se determina la dirección de la tendencia a través de la cruz de dos EMA, y se establece una lógica de stop-stop para capturar la tendencia. Pero como una estrategia de un solo factor, se puede optimizar aún más la configuración de los parámetros, la filtración de señales, etc., para que la estrategia sea más estable.

Código Fuente de la Estrategia
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 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/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")