Estrategia de cruce de dos medias móviles

El autor:¿ Qué pasa?, Fecha: 2023-11-16 17:50:52
Las etiquetas:

img

Resumen general

La estrategia de cruce de promedios móviles dobles juzga la dirección de la tendencia del precio mediante el cálculo de promedios móviles de diferentes períodos, y realiza el seguimiento de la tendencia.

Estrategia lógica

Esta estrategia se basa en promedios móviles exponenciales (EMA) de 9, 21 y 50 periodos.

Cuando la EMA de 9 períodos cruza la EMA de 21 períodos, indica una tendencia alcista a corto plazo, por lo que va largo. Cuando la EMA de 9 períodos cruza por debajo de la EMA de 21 períodos, indica una tendencia bajista a corto plazo, por lo que va corto.

La lógica de entrada larga/corta, toma de ganancias y stop loss está configurada. La condición de entrada es el cruce de los MA. La toma de ganancias largas es el precio de entrada * (1 + ratio de ganancias de toma de entrada), la toma de ganancias cortas es el precio de entrada * (1 - ratio de ganancias de toma de entrada). La pérdida de parada larga es el precio de entrada * (1 - ratio de pérdida de parada de entrada), la pérdida de parada corta es el precio de entrada * (1 + ratio de pérdida de parada de entrada).

Algunos filtros también se agregan, como el filtro de tendencia para evitar la desviación lateral, y el filtro de equidad para evitar la negociación cuando la equidad de la estrategia es demasiado baja.

En resumen, esta estrategia utiliza cruces duales de la EMA para determinar la dirección de la tendencia del precio, con una lógica apropiada de tomar ganancias y detener pérdidas, que puede capturar tendencias a medio y largo plazo.

Análisis de ventajas

  • Usando cruces de doble MA para determinar la dirección de la tendencia, la lógica es simple y fácil de entender.

  • La adopción de EMA de diferentes períodos puede determinar las tendencias a corto y largo plazo.

  • Tomar ganancias y detener pérdidas lógica bloquea en las ganancias y controla el riesgo.

  • Los filtros ayudan a evitar algunas señales falsas hasta cierto punto.

  • Los parámetros se pueden configurar libremente, los períodos se pueden optimizar para diferentes entornos de mercado.

Análisis de riesgos

  • Como una estrategia de un solo factor, las señales comerciales pueden no ser lo suficientemente estables.

  • Cuando ocurre el cruce, el precio ya puede haber subido o bajado un tramo, con el riesgo de comprar alto y vender bajo.

  • Los costes de negociación no se tienen en cuenta, los rendimientos reales podrían ser más bajos.

  • No hay stop loss en el lugar, el riesgo de pérdida ilimitada en condiciones extremas de mercado.

Soluciones:

  1. Optimizar los períodos de MA para señales más estables.

  2. Añadir otros indicadores a las señales filtradas.

  3. Aumentar el tamaño del comercio para reducir el impacto en los costes.

  4. Establezca el stop loss adecuado para limitar la pérdida máxima.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Optimizar los períodos de MA para encontrar las mejores combinaciones, o utilizar la optimización adaptativa para seleccionar dinámicamente los mejores períodos.

  2. Agregue otros indicadores técnicos como MACD, KD, etc. para filtrar señales y mejorar la calidad, o use aprendizaje automático para calificar señales y filtrar falsas.

  3. Incorporar análisis de volumen. No tome la señal si el volumen es insuficiente en el cruce de MA.

  4. Compruebe las fluctuaciones de precios antes de que ocurra el cruce.

  5. Construir mecanismos dinámicos de stop loss como el stop loss de trailing, Chandelier Exit, etc., para reducir la distancia de stop loss pero mantenerla efectiva.

  6. Optimizar el tamaño de las posiciones como fijo/dinámico/apalancado, para lograr ratios de ganancias/pérdidas más razonables.

  7. Considere de manera integral los costos de negociación, el deslizamiento. Optimice las relaciones de toma de ganancias / parada de pérdidas para garantizar la rentabilidad en el comercio en vivo.

Conclusión

La estructura general de esta estrategia es sólida, con una lógica simple de doble cruce de EMA para determinar la dirección de la tendencia, junto con la lógica de toma de ganancias y stop loss para capturar las tendencias. Como una estrategia de un solo factor, se puede optimizar aún más en parámetros, filtros de señal, etc. para hacerla más robusta. Con un stop loss y un tamaño de posición adecuados, los riesgos pueden reducirse aún más. En general, proporciona una sólida tendencia siguiendo el marco de la estrategia, que puede lograr ganancias consistentes después de las optimizaciones y ajustes.


/*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 = " ")

Más.