Estrategia de seguimiento de tendencias de doble EMA cruzada

El autor:¿ Qué pasa?, Fecha: 2024-02-29 11:45:42
Las etiquetas:

img

Resumen general

Estrategia lógica

Los indicadores centrales de esta estrategia son dos conjuntos de EMA, incluyendo un ciclo más largo EMA1 y un ciclo más corto EMA2.

Cuando el ciclo más corto EMA2 cruza por encima del ciclo más largo EMA1, se genera una señal de compra. Esto indica que la tendencia a corto plazo de los precios se ha fortalecido y una tendencia al alza ha comenzado. Cuando el ciclo más corto EMA2 cruza por debajo del ciclo más largo EMA1, se genera una señal de venta. Esto indica que la tendencia al alza a corto plazo de los precios se ha interrumpido y una tendencia a la baja ha comenzado.

Análisis de ventajas

  • La estructura dual de la EMA puede capturar eficazmente los cambios en las tendencias a corto y mediano plazo para determinar las tendencias.

  • El uso de niveles de 4 horas para calcular los indicadores puede hacer frente a las fluctuaciones de precios de alta frecuencia.

  • La estructura de la estrategia es simple y clara, fácil de entender e implementar, y adecuada para aplicaciones comerciales cuantitativas.

Análisis de riesgos

  • La estructura dual de la EMA es menos eficaz para juzgar los mercados de consolidación, ya que los largos períodos de consolidación pueden generar señales falsas.

  • Los indicadores de nivel de 4 horas no son lo suficientemente sensibles como para responder a eventos repentinos.

  • La estrategia se basa únicamente en indicadores técnicos sin combinar el análisis fundamental.

Estos riesgos pueden controlarse mediante:

  1. Añadir más indicadores de EMA de ciclo temporal para establecer combinaciones de modelos.

  2. Utilice el análisis del sentimiento del texto para determinar eventos repentinos y ajustar dinámicamente las posiciones.

  3. Asociar los cambios en el entorno económico, las políticas y los fundamentos de la empresa para ajustar dinámicamente los parámetros.

Optimización

La estrategia puede optimizarse aún más:

  1. Se pueden establecer más combinaciones de indicadores con diferentes parámetros para mejorar la estabilidad de la estrategia.

  2. Añadir mecanismos de stop loss. Los puntos de stop loss razonables pueden controlar eficazmente las pérdidas individuales.

  3. Optimización de parámetros dinámicos: los parámetros de EMA se pueden optimizar automáticamente en función de diferentes entornos de mercado.

  4. Incorporar técnicas de aprendizaje automático. Modelos como Tensorflow pueden ser entrenados para clasificar las tendencias de precios en tiempo real.

Conclusión


/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3


/// Component Code Startt
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

strategy(title="Ema cross strat", overlay=true)
margin = input(true, title="Margin?")
Margin = margin  ? margin : false
resCustom = input(title="EMA Timeframe", defval="240" )
source = close,
len2 = input(21, minval=1, title="EMA1")
len3 = input(10, minval=1, title="EMA2")
ema2 = request.security(syminfo.tickerid,resCustom,ema(source,len2), lookahead=barmerge.lookahead_off)
ema3 = request.security(syminfo.tickerid,resCustom,ema(source,len3), lookahead=barmerge.lookahead_off)


mylong = crossover(ema3, ema2)
myshort = crossunder(ema3,ema2)

last_long = na
last_short = na
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(ema3, ema2)
myshort2 = crossunder(ema3, ema2)

last_long2 = na
last_short2 = na
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0

condlongx =   in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx =  in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossover(condshortx, 1.9)




if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size > 0    
    strategy.close("Long",when = not Margin)
    
if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when = Margin)

Más.