Estrategia de retroceso del cruce dorado de la EMA


Fecha de creación: 2023-12-21 11:48:54 Última modificación: 2023-12-21 11:48:54
Copiar: 2 Número de Visitas: 877
1
Seguir
1623
Seguidores

Estrategia de retroceso del cruce dorado de la EMA

Descripción general

La estrategia de reajuste cruzado de EMA Gold es una estrategia de comercio cuantitativo basada en el indicador EMA. La estrategia utiliza la curva EMA de tres períodos diferentes para construir una señal de comercio y, en combinación con el mecanismo de reajuste de precios, establece un stop loss para automatizar el comercio.

Principio de estrategia

La estrategia utiliza tres curvas EMA, que son las siguientes:

  • EMA1: Se utiliza para determinar el punto de soporte/resistencia de la reajuste del precio, con un ciclo corto y 33 ciclos por defecto.
  • EMA2: Se utiliza para filtrar parte de la señal de reversión, con un ciclo de 5 veces el EMA1 y 165 ciclos por defecto.
  • EMA3: Se usa para determinar la dirección de la tendencia general, con un ciclo de 11 veces el EMA1 y 365 ciclos por defecto.

La generación de señales de negociación sigue la siguiente lógica:

Señales múltiples: se produce una corrección después de que el precio se pone sobre EMA1 constituye, se forma un punto más alto y más bajo por encima de EMA1 y la amplitud de la corrección no toca EMA2. Una vez que se cumplen las condiciones, se hace más cuando se pone sobre EMA1 nuevamente.

Señal de cabeza vacía: se produce una corrección después de que el precio baje por EMA1, se forma un punto más bajo por debajo de EMA1 y la amplitud de la corrección no toca EMA2. Una vez que se cumplen las condiciones, se hace vacío al pasar por EMA1 nuevamente.

El método de parada es la regresión del precio mínimo/máximo. La parada está configurada en el doble de la parada.

Ventajas estratégicas

La estrategia tiene las siguientes ventajas:

  1. El uso de los indicadores de la EMA para construir señales de negociación es más confiable.
  2. La combinación de un mecanismo de reajuste de precios puede ser eficaz para evitar estafas.
  3. El punto de parada se establece en niveles altos y bajos previos para controlar el riesgo de manera efectiva.
  4. Establezca el punto de parada de acuerdo con el Stop Loss Ratio para cumplir con los requisitos de la relación de ganancias y pérdidas.
  5. Los parámetros de EMA se pueden ajustar según el mercado para adaptarse a diferentes ciclos.

Riesgo estratégico

La estrategia también tiene ciertos riesgos:

  1. Los indicadores de la EMA están rezagados y pueden haber perdido el punto de reversión de la tendencia.
  2. Un rango de retroalimentación mayor que el EMA2 puede generar señales falsas.
  3. La tendencia de la suspensión de pérdidas podría ser superada.
  4. La configuración inadecuada de los parámetros puede ocasionar operaciones demasiado frecuentes o oportunidades perdidas.

Los parámetros se pueden optimizar mediante el ajuste del ciclo EMA, el ajuste del rango de restricción de regresión y otros métodos. También se puede combinar con otros indicadores para filtrar la señal.

Dirección de optimización de la estrategia

La estrategia también puede ser optimizada en los siguientes aspectos:

  1. Aumentar el juicio de indicadores de tendencia y evitar el comercio en contra. Por ejemplo, unirse a MACD.
  2. Añadir indicadores de volumen de transacciones para evitar falsas rupturas. Por ejemplo, unirse a OBV.
  3. Optimización de los parámetros del ciclo EMA, o adopción de la adaptación al EMA.
  4. Parámetros de optimización dinámica de métodos de aprendizaje automático como el modelo de bolsas de palabras.
  5. Se añade la predicción del modelo y se establece el stop loss de adaptación.

Resumir

La estrategia de reajuste cruzado de oro de la EMA permite la automatización de la negociación mediante la construcción de tres sistemas de negociación de la EMA, combinando la característica de reajuste de precios con la configuración de stop loss. La estrategia controla el riesgo de negociación de manera efectiva y se puede optimizar de acuerdo con el mercado mediante el ajuste de los parámetros. En general, la estrategia es lógica y práctica.

Código Fuente de la Estrategia
/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//