Estrategia de seguimiento de tendencia de doble cruce de EMA 10


Fecha de creación: 2023-12-29 16:03:55 Última modificación: 2023-12-29 16:03:55
Copiar: 1 Número de Visitas: 807
1
Seguir
1621
Seguidores

Estrategia de seguimiento de tendencia de doble cruce de EMA 10

Descripción general

La estrategia es una estrategia de seguimiento de tendencias basada en 10 EMA y 50 EMA de doble cruce. Combina 10 EMA de la línea horaria como un juicio auxiliar para encontrar dinámicamente la dirección de la tendencia en un mercado en el que los alcistas y los bajistas alternan, para lograr un stop loss de seguimiento automático.

Principio de estrategia

La lógica central de la estrategia se basa en los forks dorados de 10 EMA y 50 EMA. Concretamente, cuando 10 EMA cruza 50 EMA desde abajo para formar un forquillo dorado, se juzga que el mercado entra en una tendencia alcista; cuando 10 EMA cruza 50 EMA desde arriba para formar un forquillo muerto, se juzga que el mercado entra en una tendencia bajista.

Además, la estrategia también introduce la 10EMA de la línea horaria como un juicio auxiliar, sólo cuando la 10EMA de la línea horaria está en una tendencia ascendente se abre una posición adicional después de la horquilla de oro, sólo cuando la 10EMA de la línea horaria está en una tendencia descendente se abre una posición vacía después de la horquilla de oro, para filtrar algunas de las falsas señales.

Después de la apertura de la posición, la estrategia utiliza una salida de seguimiento de stop loss + stop price. El seguimiento de stop loss permite bloquear los beneficios y maximizar la ganancia de la operación; el stop price garantiza el cierre de la posición para obtener ganancias cuando el precio alcanza el punto objetivo.

Ventajas estratégicas

La mayor ventaja de esta estrategia es que, al mismo tiempo que se utiliza el cruce de EMA para determinar la dirección de la tendencia principal, se introduce una señal de filtro de indicadores auxiliares, que puede filtrar eficazmente los cruces falsos y así mejorar la fiabilidad de la señal. Además, el cruce de doble EMA, combinado con el seguimiento de los paros de pérdida y el límite de los paros de precio, puede maximizar los beneficios del seguimiento de la tendencia y controlar eficazmente el riesgo de negociación, con una buena relación de riesgo-beneficio en general.

En comparación con la estrategia de un solo indicador, la estrategia puede determinar con mayor precisión la dirección de la tendencia y las amplitudes. En comparación con el tradicional stop loss, la estrategia utiliza una tecnología de seguimiento de stop loss más avanzada, lo que permite un mejor bloqueo de ganancias.

Análisis de riesgos

La estrategia se enfrenta principalmente al riesgo de un whipsaw intermitente y una reversión de la tendencia. Cuando se producen señales falsas de cruce consecutivas, la estrategia puede ser arbitrajada. Además, la reversión de precios después de la apertura de la posición también produce pérdidas.

Para reducir el riesgo de whipsaw, la estrategia incluye indicadores auxiliares para filtrar la señal. Para controlar el riesgo de reversión de la tendencia, la estrategia utiliza un rango de parada más tolerante, mientras que la configuración de paradas de precio límite también puede ayudar a reducir dicho riesgo.

Dirección de optimización

La estrategia tiene varias direcciones de optimización: primero, se puede probar una combinación de diferentes parámetros, como el ciclo EMA, la raíz de retardo de apertura de la posición, etc., para buscar el parámetro óptimo; segundo, se pueden introducir más indicadores auxiliares, como MACD, BOLL, etc. para filtrar la señal y mejorar la calidad de la señal; tercero, se puede optimizar la lógica de parada de pérdidas, como la adopción de otros métodos de parada de pérdidas, como la parada de tiempo, la parada de oscilación; y cuarto, se pueden combinar más condiciones de apertura de la estrategia para iniciar el comercio, como la activación de la señal solo en ciertos períodos de tiempo o bajo la tendencia de las subidas y bajadas.

Resumir

La estrategia de seguimiento de tendencias de doble cruz de 10 EMA, que determina la dirección de la tendencia actual a través de la cruz de oro y la cruz de muerte de la EMA, establece paradas de seguimiento y paradas de precio para bloquear los beneficios y controlar el riesgo, al mismo tiempo que combina la señal de filtración de indicadores auxiliares para mejorar la calidad de la señal, es una estrategia de comercio de tendencias más completa. En comparación con el indicador único y el parón de parada tradicional, la estrategia tiene la precisión de juicio, el parón de parada, la optimización de pérdidas, etc.

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

//@version=5
strategy("10ema Strat 9", overlay=true, format=format.price)
//#region // inputs for candles
//time
t1 = time(timeframe.period,"0930-1500") //last hour of market is not ideal for trading
// candle status
bullish = close > open and barstate.isconfirmed
bearish = open > close and barstate.isconfirmed
bullcandle = ta.valuewhen(bullish, close, 0)
bearcandle = ta.valuewhen(bearish, close, 0)
ema1 = input.int(10, minval=1, title="short ema")
ema2 = input.int(50, minval=1, title="long ema")
ema3 = input.int(200, minval=1, title="hourly 10 ema")
//@variable Input for source
src = input(close, title="Source")
offsetema = input.int(title="Offset", defval=0, minval=-500, maxval=500)
sema = ta.ema(src, ema1)//@variable Input for smaller ema1
lema = ta.ema(src, ema2)//@variable Input for longer ema2
hema = ta.ema(src, ema3)// @variable Input for hourly ema3
bullcrosscount = ta.barssince(ta.crossover(sema,lema)) //@variable Input 10/50 cross higher
bearcrosscount = ta.barssince(ta.crossunder(sema,lema)) //@variable Input 10/50 cross lower
ideallong = bullcrosscount <= 5 //number of candles after the cross
idealshort = bearcrosscount <= 5 //number of candles after the cross

emabull = (sema > lema) and bearish and close > sema and close > hema and ideallong and t1 and barstate.isconfirmed
xemabull = ta.barssince(emabull)
dbullema = emabull and emabull[1] and xemabull <=1
bullentry = if dbullema
    ta.valuewhen(emabull[1], high + 0.05, 0)
else 
    ta.valuewhen(emabull, high + 0.05, 0)
bullentryh = dbullema ? bullentry[1] : bullentry
bullentrylow = ta.valuewhen(emabull, low - 0.05, 0)
bullstop = (bullentryh - bullentrylow) <= 1.00 ? bullentryh - 1.00 : (bullentryh - bullentrylow) <= 10.40 ? bullentrylow : na
bulltarget = (bullentryh - bullstop) * 1.62 + bullentryh

// bear setup
emabear = (sema < lema) and bullish and close < sema and close < hema and idealshort and t1 and barstate.isconfirmed
xemabear = ta.barssince(emabear)
dbearema = emabear and emabear [1] and xemabear <=1
bearentry = if dbearema
    ta.valuewhen(emabear[1], low - 0.05, 0)
else
    ta.valuewhen(emabear, low - 0.05, 0)
bearentryh = dbearema ? bearentry[1] : bearentry
bearentryhigh = ta.valuewhen(emabear, high + 0.05, 0)
bearstop = (bearentryhigh - bearentryh) <= 1.00 ? bearentryh + 1.00 : (bearentryh - bearentryhigh) <= 10.40 ? bearentryhigh : na
beartarget = bearentryh - (bearstop-bearentryh) * 1.62

bullclose = (xemabull <=7) and bullish and bullcrosscount >=1 and barstate.isconfirmed //number of candles for a close above
bearclose = (xemabear <=7) and bearish and bearcrosscount >=1 and barstate.isconfirmed //number of candles for a close below
buyzone = ta.barssince(bullclose)
shortzone =  ta.barssince(bearclose)
idealbuy = close >= bullentryh and bullclose and (buyzone<=7)
idealsell = close <= bearentryh and bearclose and (shortzone<=7)

// // bull setup on chart
// if sema > lema and xemabull < 50
//     var line line_bullentry = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bullentry, x=bar_index, y=bullentryh)
//         line.set_xy2(line_bullentry, x=bar_index, y=bullentryh)
//         alert("EMA-bullish", alert.freq_once_per_bar_close)
//     line.set_x2(line_bullentry, x=bar_index)
//     var line line_bullstop = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bullstop, x=bar_index, y=bullstop)
//         line.set_xy2(line_bullstop, x=bar_index, y=bullstop)
//     line.set_x2(line_bullstop, x=bar_index)    
//     var line line_bulltarget = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bulltarget, x=bar_index, y=bulltarget)
//         line.set_xy2(line_bulltarget, x=bar_index, y=bulltarget)
//     line.set_x2(line_bulltarget, x=bar_index)

// //bear setup on chart
// if sema < lema and xemabear < 50
//     var line line_bearentry = line.new(bar_index, na, bar_index, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_bearentry, x=bar_index, y=bearentryh)
//         line.set_xy2(line_bearentry, x=bar_index, y=bearentryh)
//         alert("EMA-bearish", alert.freq_once_per_bar_close)
//     line.set_x2(line_bearentry, x=bar_index)
//     var line line_bearstop = line.new(bar_index, na, bar_index, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_bearstop, x=bar_index, y=bearstop)
//         line.set_xy2(line_bearstop, x=bar_index, y=bearstop)
//     line.set_x2(line_bearstop, x=bar_index)
//     var line line_beartarget = line.new(bar_index, na, bar_index, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_beartarget, x=bar_index, y=beartarget)
//         line.set_xy2(line_beartarget, x=bar_index, y=beartarget)
//     line.set_x2(line_beartarget, x=bar_index)

//#endregion
//execution 
if idealbuy
    strategy.close("sell", comment=na)	
    strategy.entry("buy", strategy.long, limit=bullentryh, stop=bullstop, comment="buy")
strategy.exit("exit","buy", trail_points = low, trail_offset = 5, qty_percent=100, limit=bulltarget, stop=bullstop)

if idealsell
	strategy.close("buy",comment=na)
    strategy.entry("sell", strategy.short, limit=bearentryh, stop=bearstop, comment="sell")
strategy.exit("exit","sell", trail_points = low, trail_offset = 5, qty_percent=100, limit=beartarget, stop=bearstop)
// strategy.close_all(time == close_day) 
//#region // graphical analysis
//Plots
plotshape(emabull, location=location.belowbar, title='emabull')
plotshape(idealbuy, style=shape.circle, color=color.green, title="bull close")
plotshape(emabear, title='emabear')
plotshape(idealsell, location=location.belowbar, style=shape.circle, color=color.red, title="bear close")

// //Dashboard
// var label id = na
// label.delete(id)   // Delete last label
// i_offsetLabel = input(15, "Data Dashboard Offset") 
// offset = i_offsetLabel * (time - time[1])
// dynamicText = "= Bull Setup ="
// id := label.new(x=time + offset, y=open, xloc=xloc.bar_time, text=dynamicText, color=color.rgb(255, 255, 255), size=size.normal)
// label.set_textcolor(id, color.rgb(0, 0, 0))
// label.set_text(id=id, text=dynamicText)
// label.set_textalign(id, text.align_left)
// label.set_text(id=id, text=dynamicText)
// f_round( _val, _decimals) => 
//     _p = math.pow(10, _decimals)
//     math.round(math.abs(_val) * _p) / _p * math.sign(_val)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bulltarget,2)) + "  :Target"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullentryh,2)) + "  :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullstop,2)) + "  :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + "= Bear Setup ="
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearstop,2)) + "  :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearentryh,2)) + "  :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(beartarget,2)) + "  :Target"
// label.set_text(id=id, text=dynamicText)
// //#endregion