Estrategia de seguimiento de tendencia de cruce dorado MACD EMA


Fecha de creación: 2024-02-18 15:17:36 Última modificación: 2024-02-18 15:17:36
Copiar: 0 Número de Visitas: 368
1
Seguir
1166
Seguidores

Estrategia de seguimiento de tendencia de cruce dorado MACD EMA

Descripción general

Esta estrategia determina la dirección de la tendencia mediante el cálculo de la intersección de la línea de señal del indicador MACD y su promedio móvil, y en combinación con la línea de señal EMA para determinar la fortaleza de la tendencia actual, permite el seguimiento de la tendencia. Cuando la línea MACD rompe la línea de señal de abajo hacia arriba, hace más, rompe la línea de señal de arriba hacia abajo, y la línea EMA también puede determinar la fortaleza de la tendencia para filtrar la falsa ruptura.

Principio de estrategia

Esta estrategia se basa principalmente en el indicador MACD para determinar la dirección de la tendencia y el momento de entrada. La línea de señal de ruptura de la línea MACD indica que la tendencia de los precios se ha invertido, por lo que se debe hacer más blancos en función de la dirección de la ruptura. La lógica de juicio específica es hacer más cuando el precio de cierre está por encima del promedio de la EMA y la línea MACD rompe la línea de señal desde abajo; cuando el precio de cierre está por debajo del promedio de la EMA y la línea MACD rompe la línea de señal desde arriba.

La función de la EMA media es auxiliar en la determinación de la tendencia, si el precio es superior a la EMA media indica que está en una tendencia ascendente, entonces el MACD por debajo de la ruptura es propenso a formar una señal de cruzamiento de oro en funcionamiento; si el precio es inferior a la EMA media indica que está en una tendencia descendente, entonces el MACD por encima de la ruptura es propenso a formar una señal de cruzamiento muerto. La duración de la EMA también determina el grado de mediano y largo plazo de la determinación de la tendencia.

De esta manera, se puede entrar en el campo a tiempo cuando los precios comienzan a invertirse para formar una nueva tendencia, logrando el efecto de seguimiento de tendencias.

Análisis de las ventajas

La estrategia combina condiciones de doble juicio, ya que toma en cuenta la dirección de la tendencia de los precios, y utiliza el indicador para determinar el momento de entrada específico, evitando el riesgo de falsas rupturas, lo que aumenta la fiabilidad de la estrategia. En comparación con el uso de un solo indicador MACD, la estrategia puede determinar con mayor precisión el inicio de una nueva tendencia.

El uso de la línea media de la EMA también permite que la estrategia filtre, en cierta medida, los efectos de las fluctuaciones a corto plazo y bloquee las tendencias de la línea media y larga. Esto es muy útil para ejercer el efecto de reversión en el MACD.

Además, la estrategia establece condiciones de venta y ventaja simultáneas, que pueden aplicarse en un entorno de mercado de lotos en alza y baja, lo que también aumenta la adaptabilidad de la estrategia.

Análisis de riesgos

El principal riesgo de esta estrategia es que el indicador MACD en sí tiene una mayor probabilidad de determinar un Fakeout, y la señal puede ser erróneamente identificada. En este caso, se requiere la función auxiliar de la línea media de la EMA, pero también puede fallar en casos especiales.

Además, la estrategia utiliza un porcentaje de ganancias y pérdidas para establecer las condiciones de parada de pérdidas, lo que tiene un cierto grado de subjetividad, y si se configura incorrectamente, también puede afectar la eficacia de la estrategia.

Finalmente, la estrategia simplemente establece el número de posiciones abiertas en el 100% de los intereses de las cuentas, sin tener en cuenta los problemas de administración de fondos, lo que también conlleva un cierto riesgo en el mercado real.

Dirección de optimización

La estrategia se basa en las siguientes opciones:

  1. La adición de otros indicadores de juicio, formando una combinación de indicadores, puede evitar aún más la probabilidad de que el MACD emita una señal errónea. Por ejemplo, se puede considerar KDJ, BOLL, etc.

  2. La longitud de la línea media de la EMA se puede optimizar en múltiples combinaciones para encontrar el mejor parámetro para determinar la dirección de la tendencia.

  3. Los parámetros del MACD también se pueden optimizar aún más para encontrar el valor de parámetro más preciso para determinar el tiempo de reversión.

  4. Añadir módulos de administración de fondos, como el porcentaje de ganancias y pérdidas puede ser una entrada dinámica, también se puede configurar el punto de parada de pérdidas, etc.

  5. Prueba de la eficacia de los diferentes tipos de contratos para encontrar la variedad de comercio más compatible. Por ejemplo, criptomonedas, futuros de índices bursátiles, etc.

Resumir

La estrategia de seguimiento de tendencias cruzadas en oro de la MACD EMA es bastante sencilla y práctica en general. Asegura la fiabilidad de la señal mediante el juicio de los dos indicadores y establece un método razonable de detención de pérdidas para bloquear las ganancias. El principal espacio de optimización es en la selección de parámetros, la combinación de indicadores y la administración de fondos.

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

//@version=4

strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)

// Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// STEP 2:
// See if this bar's time happened on/after start date
afterStartDate = true

//EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="15")
len1 = input(title="EMA Length", type=input.integer, defval=206)
col1 = color.yellow
// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off)
// Draw EMA
plot(emaSmooth, title="EMA", linewidth=1, color=col1)

//MACD
fast_length = input(title="Fast Length", type=input.integer, defval=15)
slow_length = input(title="Slow Length", type=input.integer, defval=24)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=true)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true)
zeroline = 0

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)
//plot(zeroline, title="Zero Line", color=color.black, transp=0)

///////////////////////////LONG////////////////////////////////////////////////////////////////////

enablelong = input(true, title="Enable long?")

//Long Signal
upcondition = close > emaSmooth and close[1] > emaSmooth[1]
macdunderhis = macd < zeroline
macdcrossup = crossover(macd, signal)

longcondition = upcondition and macdunderhis and macdcrossup

//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
    strategy.entry("long", strategy.long)

//////////////////////////////////////SHORT//////////////////////////////////////////////////////////////////////////////////

enableshort = input(true, title="Enable short?")

//Short Signal
downcondition = close < emaSmooth and close[1] < emaSmooth[1]
macdoverhis = macd > zeroline
macdcrosunder = crossunder(macd, signal)

shortcondition = downcondition and macdoverhis and macdcrosunder

//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
    strategy.entry("short", strategy.short)


//////////////////////////////////////EXIT CONDITION//////////////////////////////////////////////////////////////////////////////////
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
//////LOWEST LOW//////
//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=46, minval=2)
stop_level_long = lowest(low, loLen)[1]

if strategy.position_size>0 
    profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong)
    strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long)

//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1)
highLen = input(title="highest high lookback", type=input.integer,
  defval=25, minval=2)
stop_level_short = highest(high, highLen)[1]

if strategy.position_size<0 
    profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort)
    strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short)
    
//PLOTT TP SL
plot(stop_level_long, title="SL Long", linewidth=1, color=color.red)
plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)